• Tidak ada hasil yang ditemukan

BUKU AJAR BAHASA PEMROGRAMAN TINGKAT RENDAH (BPTR)

N/A
N/A
Protected

Academic year: 2021

Membagikan "BUKU AJAR BAHASA PEMROGRAMAN TINGKAT RENDAH (BPTR)"

Copied!
197
0
0

Teks penuh

(1)

BUKU AJAR

BAHASA PEMROGRAMAN TINGKAT RENDAH

(BPTR)

PADA MESIN

KOMPUTER IBM-PC COMPATIBLE

OLEH

MAMAN ABDUROHMAN, ST.

SEKOLAH TINGGI TEKNOLOGI TELKOM

BANDUNG

(2)

KATA PENGANTAR

Bismillahiirrohmanirrohim, Alhamdulillahi hirobbil’alamin.

Dengan rahmat-Nya, buku ajar “Bahasa Pemrograman Tingkat Rendah”, telah selesai disusun. Mudah-mudahan dapat membantu dalam memahami pemrograman bahasa tingkat rendah dengan bahasa assembly.

Buku ajar ini berisi tentang sebagian materi Bahasa Pemrograman Tingkat Rendah yang terdapat pada kurikulum jurusan Teknik Informatika STT Telkom, yang terdiri dari 10 bab dengan masing-masing bab membahas :

• Pengenalan : Mengenali bahasa assembly dan elemen-elemen dasarnya.

• Arsitektur Perangkat Keras dan Perangkat lunak : Membahas tentang komponen arsitektur sistem yang terdiri dari perangkat keras dan perangkat lunak.

• Dasar-Dasar Bahasa Assembly : Membahas Perintah-perintah dan instruksi serta mode pengalamatan pada bahasa assembly.

• Layanan Masukan/Keluaran (Input/Output) : Membahas tentang interrupt untuk input/output.

• Pemrosesan Kondisi : Insturksi-instruksi kondisi dan pencabangan.

• Aritmetika : Instruksi Geser dan Putar, penjumlahan, pengurangan, perkalian dan pembagian.

• Makro dan Struktur : Membahas tentang makro dan perintah-perintahnya

• Hubungan Dengan Bahasa Tingkat Tinggi : Membahas cara untuk membangun antara muka dengan bahasa pemrograman tingkat tinggi yaitu Turbo Pascal dan Turbo C.

• Contoh Program : Contoh-contoh program dalam bahasa assembly.

Sebagian besar materi diambil dari buku “Assembly Language for the IBM-PC” karangan Kip R. Irvine. Ada beberapa bahasan yang diambil dari User’s Guide Turbo Assembler 3.00.

Terima kasih banyak kepada semuanya yang telah membantu sehingga tersusunnya buku ajar ini. Jazakallah kepada Teteh yang telah menemani dengan setia selama pembuatannya. Buku ini dipersembahkan untuk si kecil Arina Dini Hanifa pada ulangtahunnya yang pertama, hari ini.

Akhir kalam, tulisan kecil ini mudah-mudahan akan memberikan sedikit kemudahan bagi siapa saja yang berminat untuk mempelajari bahasa assembly dan pemrograman bahasa tingkat rendah.

Segala kritik dan saran mohon ditujukan ke alamat email : m_abdurohman@yahoo.com.

Bandung, 27-Agustus 2002

(3)

DAFTAR ISI Kata Pengantar Daftar Isi 1. Pengenalan 1 1.1. Pendahuluan 1 1.2. Representasi Data 3

1.3. Bahasa Assembly – Pengenalan 8

1.4. Elemen Dasar Bahasa Assembly 10

1.5. Contoh Program Hello 13

2. Arsitektur Perangkat Keras dan Perangkat lunak. 15

2.1. Komponen Mikrokomputer 15

2.2. Arsitektur Sistem 17

2.3. Perangkat Lunak Sistem dan Memori 26

3. Dasar-Dasar Bahasa Assembly 29

3.1. Perintah Definisi Data 29

3.2. Instruksi Transfer Data 34

3.3. Instruksi Aritmetik 37

3.4. Mode Pengalamatan 40

3.5. Struktur Program 46

4. Layanan Masukan/Keluaran (Input/Output) 49

4.1. Prosedur 49

4.2. Interrupt Perangkat Lunak 52

4.3. Fungsi Call DOS 54

4.4. Kendali Video Level Bios (INT 10h) 59

5. Pemrosesan Kondisi 61

5.1. Boolean dan Instruksi Perbandingan 61

5.2. Loncat Kondisional 67

5.3. Liupan Kondisional (Conditional Loops) 72

5.4. Struktur Logic Tingkat Tinggi 73

6. Aritmetika 78

6.1. Instruksi Gser (Shift) dan Putar (Rotate) 78

6.2. Aplikasi Contoh 82

6.3. Multi - Penjumlahan dan Pengurangan

(Multiple Addition and Substraction) 85

6.4. Perkalian dan Pembagian 87

7. Makro dan Struktur 93

7.1. Pengenalan 93

7.2. Teknik Khusus 102

7.3. Operator Makro 107

7.4. Library Makro 109

7.5. Penggunaan Makro Lebih Lanjut 112

7.6. Operator dan Perintah Lanjut 122

7.7. Contoh Penggunaan Macro Dalam Program 129

8. Hubungan Dengan Bahasa Tingkat Tinggi 136

8.1. Hubungan Dengan Turbo Pascal 136

8.2. Turbo Built-In Assembler (BASM) 145

8.3. Pernyataan dan Perintah Inline 148

(4)

8.5. Hubungan dengan Turbo C 158 8.6. 8. 6. Antarmuka Turbo Assembler Dengan Borland C++ 162

9. Contoh Program 169

(5)

I. PENGENALAN

1.1. Pendahuluan

Bahasa assembly membuka rahasia perangkat keras dan perangkat lunak komputer. Disini akan dipelajari bagaimana perangkat keras komputer dan sistem operasi bekerjasama dan bagaimana program aplikasi berkomunikasi dengan sistem operasi. Untuk memahami keseluruhan komputer dan sistem informasinya, seseorang perlu memahami perangkat lunak pada berbagai level. Pertama level program aplikasi, dimana program berinteraksi dengan DOS. Level bahasa tingkat tinggi, dimana perintah/pernyataan yang handal diuraikan kedalam instruksi-instruksi mesin. Pada level yang lebih rendah (lebih dekat dengan mesin), seseorang akan konsentrasi pada instruksi-instruksi yang dikenali oleh CPU, sebagaimana program berkomunikasi dengan DOS.

Bahasa assembly meningkatkan pemahaman seseorang tentang level yang lebih rendah ini. Pada tulisan ini memberikan titik pandang bahwa bahasa assembly seharusnya dipelajari secara kontekstual, sehingga interaksi perangkat keras dan preangkat lunak komputer mungkin lebih mudah dipahami. Pada bab berikutnya, akan dibahas perangkat keras komputer, bahasa mesin, konsep sistem operasi dan struktur pemrograman.

Apakah bahasa assembly?

Bahasa assembly adalah bahasa pemrograman dengan korespondensi satu-satu antara perintah-perintah/pernyataannya dan bahasa mesin komputer. Bahasa assembly tidak satu jenis sebagaimana CPU komputer pun bermacam-macam. Setiap bahasa assembly secara langsung dipengaruhi oleh set instruksi mesin komputer dan arsitektur perangkat keras.

Secara singkat, bahasa assembly IBM-PC mengacu pada istruksi-instruksi yang dikenali oleh keluargaa mikroprosesor Intel 8086-80486.

Apa itu assembler?

Assembler adalah program yang mengkonversi kode program sumber ke dalam bahasa mesin. Pada tuliasn ini akan mengacu pada assembler yang membuat instruksi mesin untuk mikrokomputer IBP yang sesuai. Semua kompter tersebut menggunakan mikroprosesor keluarga intel, mulai dari intel 8088 sampai 80486. Program akan berjalan dibawah sistem operasi PC-DOS/MS-DOS versi 3.0 atau lebih tinggi. Terdapat dua assembler yang dikenal baik untuk IBM-PC yaitu MASM (Microsoft Assembler) dan TASM (Turbo Assembler).

Bahasa assembly adalah kumpulan instruksi yang spesifik untuk sistem komputer tertentu. Assembler adalah program yang menerjemahkan program yang ditulis dalam bahasa assembly ke dalam bahasa mesin, yang dapat dieksekusi oleh komputer. Setiap tipe komputer meiliki bahasa assembly yang berbeda, karena rancangan komputer mempengaruhi instruksi yang dapat dieksekusi.

(6)

Bahasa assembly disebut bahasa level-bawah karena dalam struktur dan fungsi dekat dengan bahasa mesin. Sebaliknya, bahasa tingkat tingggi seperti Pascal, Basic, Fortran dan Cobol mempunyai perintah-perintah yang handal yang diterjemahkan ke dalam berbagai instruksi mesin oleh kompiler.

Mengapa mempelajari bahasa assembly?

Berbagai alasan mengapa kita mempelajari bahasa assembly. Salah satu alasan adalah untuk mempelajari arsitektur komputer dan sistem operasi. Alasan lain adalah karena kegunaan pemrograman tertentu sulit atau tidak mungkin dikerjakan oleh bahasa tingkat tinggi. Contoh, kompunikasi langsung dengan sistem operasi komputer mungkin deperlukan. Program grafik warna kecepatan tinggi mungkin harus ditulis menggunakan memori minimum. Program khusus mungkin diperlukan sebagai penghubung antara printer dengan komputer.

Sering juga perlu untuk menghilangkan keterbatasan bahasa tingkat tinggi, diluar keperluan, menentukan aturan-aturan tentang apa yang dibolehkan dalam program. Contoh, pascal tidak mengijinkan nilai karakter diberi nilai dalam variabel integerr. Pemrogram yang berpengalaman akan menemukan cara untuk keluar dari batasan ini, tapi dalam pelaksanaannya, membuat kode tidak dapat digunakan oleh sistem komputer lain dan sulit dibaca. Bahasa assembly, sebaliknya, memiliki sangat sedikit batasan atau aturan. Harga yang harus dibayar untuk keleluasaan itu adalah perlu menangani berbagai kerumitan dalam pemrograman.

Aplikasi bahasa assembly

Biasanya ktia membuat subrutin dalam bahasa assembly dan memanggilnya dari program bahasa tingkat tinggi. Keuntungan dapat diperoleh karena ketanya bahasa tingkat tinggi, dengan menggunakan bahasa tingkat rendah dalam membuat aplikasi. Subrutin bahasa assembly menangani operasi-operasi yang tidak tersedia dalam bahasa tingkat tinggi. Misal kita menulis program aplikasi bisnis dalam Cobol untuk IBM-PC. Kita memerlukan aplikasi untuk mengecek ruang bebas disk, membuat subdirektory, menulis proteksi file, dan membuat window yang overlap, semuanya dalam satu program.

Misal kompilator Cobol tidak dapat melakukan semuanya, maka kita dapat mebuat subrutin bahasa assembly untuk menangani tugas-tugas tersebut.

Bahasa mesin

Sebelum lebih jauh secara rinci membahas bahasa assembly, mari kita lihat dalam suatu prespektif. Komputer kenyataannya tidak mengerti bahasa assembly, dia hanya mengikuti bahasa mesin. Bahasa mesin adalah bahasa yang dibangun oleh sejumlah angka yang dapat diinterpretasikan oleh CPU komputer. CPU biasanya mempunyai program kecil yang ditambahkan langsung ke dalam chip, disebut microcode. Penerjemah microcode mengubah langsung instruksi-instruksi mesin ke dalam sinyal perangkat keras.

Dengan bahasa mesin memungkinkan untuk melaksanakan tugas-tugas umum oleh CPU, seperti pemindahan bilangan atau perhitungan aritmatik. Berikut contoh instruksi bahasa mesin yang memindahkan angka 5 ke dalam register AL.

(7)

1011000000000101

Deretan angka diatas ditulis dalam biner, sistem penomoran yang dibangun hanya oleh angka 1 dan 0. Delapan bit pertama adalah kode operasi (opcode) yang menunjukannya sebagai isntruksi yang memindahkan angka – 8 bit ke register AL. Delapan bit kedua adalah operand. Instruksi secara keseluruhan memindahkan angka 5 ke dalam register AL.

Register adalah memori kecepatan tinggi yang berada di dalam CPU. Register diidentifikasikan oleh nama 2 huruf, seperti AH, AL, atau AX.

Kumpulan instruksi (instruction set) CPU adalah sekumpulan instruksi mesin yang dapat dieksekusi CPU. Untuk keluarga CPU intel, set instruksi adalah down-ward-compatible, artinya bahwa instruksi yang bekerja pada prosesor level yang lebih rendah akan bekerja juga pada prosesor yang lebih tinggi. Contoh instruksi MOV bekerja pada 8088 dan karena itu harus bekerja pula pada 80286. Tetapi terdapat instruksi yang lebih maju dlam 80286 yang tidak dapat bekerja pada 8088.

Dulu, semua program ditulis dalam bahasa mesin. Hal ini sangat menyulitkan bagi pemrogram baik dalam membacanya maupun menulisnya. Itulah sebabnya mengapa dibuat assembler dan kompiler yang akan mengkonversi instruksi yang mudah dibaca, dibuat dalam editor teks ke dalam bahasa mesin. Contoh instruksi diatas adalah : MOV AL,5

1.2. Representasi Data

Karena kita akan bersentuhan dengan komputer pada level mesin, kita perlu untuk memeriksa isi memori dan register. Komputer yang ada saat ini adalah komputer biner yang sistem bilangannya terdiri angka 1 dan 0 yang kita kenal dengan istilah logic digital.

Bilangan biner

Komputer menyimpan semua instruksi dan data sebagai rangkaian digit biner, tanpa perbedaan antara keduanya. Contoh, tiga huruf pertama alfabet akan disimpan dalam IBM-PC sebagai :

010000010100001000011 = “ABC”

Pada saat yang sama, instruksi untuk menjumlahkan dua buah bilangan akan disimpan di memori sebagai :

0000010000000101

Bit & Byte. Setiap digit dalam angka biner desebut bit. 8 buah bit desebut byte, yang merupakan unit terkecil penyimpanan pada komputer saat ini. Setiap lokasi dalam komputer menyimpan 1 byte, atau 8 bit. Tipe penyimpan yang lebih besar adalah word yang panjangnya 16 bit (2 byte).

(8)

byte byte 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0

word

Setiap sistem penuliasan angka mempunyai basis, yaitu jumlah maksimum nillai pada suatu digit. Ini disebut radix atau basis.

Sistem Basis / radix Digit yang mungkin

Biner 2 01

Oktal 8 01234567

Desimal 10 0123456789

Heksadesimal 16 0123456789ABCDEF

Dalam sistem bilangan heksadesimal, huruf A sampai F mewakili nilai desimal 10 sampai 15.

Pada saat mengacu pada bilangan biner, oktal atau heksadesimal, sebuah huruf kecil akan ditambahkan pada akhir setiap bilangan untuk menunjukan basisnya. Contoh bilangan 45 heksadesimal akan ditulis sebagai 45h, 76 oktal akan ditulis 76o atau 76q, dan biner 11010011 akan terlihat 11010011b.

Komputer pribadi IBM disebut komputer 16-bit karena instruksinya dapat mengoperasikan sejumlah 16-bit bilangan. Integer biasanya disimpan dalam memori sebagai byte, word atau double word. Untuk masing-masingnya mempunyai batasan bawah dan atasnya, sebagai berikut :

Tipe penyimpan Bit Range (bawah-atas)

Byte 8 0-225

Word 16 0-65,535

Double word 32 0-4,294,967,295

Walaupun masing-masing billangan membutuhkan jumlah bit yang berbeda-beda, pada kenyataannya semua bilangan disimpan di memori sebagai nilai biner karena arsitektur komputer adalah biner. Setiap bit memori adalah 1 atau 0, tetapi lokasi terkecil memori yang diberi alamat adalah byte.

Pengubahan bilangan biner ke desimal

Karena berbagai keperluan mungkin kita perlu mengubah bilangan dari biner ke desimal. Setiap posisi bit dalam bilangan biner adalah pangkat dari 2, seperti gambaran berikut :

27 26 25 24 23 22 21 20

Nilai 128 64 32 16 8 4 2 1

Untuk mendapatkan nilai desimal dari sebuah bilangan biner, kita harus menjumlahkan nilai setiap bit yang bernilai 1 dan memperoleh jumlah keseluruhannya. Misalkan terdapat bilangan biner 00001001 :

(9)

0 0 0 0 1 0 0 1

Desimal 8 1 = 9 d

Bilangan heksadesimal

Bilangan biner yang banyak susah untuk dibaca, sehingga bilangan heksadsimal biasanya sering digunakan untuk menggambarkan memori komputer atau instruksi. Setiap digit bilangan heksadesimal mewakili 4 bit bilangan biner, dan 2 digit bilangan heksadesimal mewakili satu byte. Pada contoh berikut terlihat bahwa bilangan biner 000101100000011110010100 digambarkan oleh bilangan heksadesimal 160794 :

0001 0110 0000 0111 1001 0100 1 6 0 7 9 4

Sebuah digit heksadesimal mungkin mempunyai nilai sampai 15 sehingga untuk angka 10 – 15 menggunakan huruf A – F. Tabel berikut menunjukan bagaimana setiap 4 bit biner diterjemahkan ke dalam desimal dan heksadesimal :

Biner Desimal Heksadesimal

0000 0 0 0001 1 1 0010 2 2 0011 3 3 0100 4 4 0101 5 5 0110 6 6 0111 7 7 1000 8 8 1001 9 9 1010 10 A 1011 11 B 1100 12 C 1101 13 D 1110 14 E 1111 15 F

Posisi digit heksadesimal. Setiap posisi digit heksadesimal mewakili bilangan pangkat dari 16.

163 162 161 160

(10)

Bilangan dapat dikonversi dari heksadesimal ke desimal dengan mengalikan masing-masing digit dengan nilai posisinya. Misalnya bilangan 3BA4h, hasilnya

3 B A 4

Nilai posisi 4096 256 16 1

Hasil kali 12,288 2,816 160 4 = 15,268d Pada saat perkalian huruf B diganti 11 dan A dengan 10.

Bilangan bertanda

Bilangan biner mungkin bertanda atau tidak bertanda.

Byte bertanda menggunakan 8 bit seluruhnya untuk nilai angkanya. Contoh, 11111111 = 255. Karena itu, 255 adalah nilai tertinggi yang dapat disimpan dalam byte tidak bertanda. Nilai terbesar yang dapat disimpan dalam word tidak bertanda adalah 65,535.

Byte bertanda hanya menggunakan 7 bit untuk nilai sedangkan bit paling kiri digunakan sebagai tanda. Bilangan mungkin positif atau negatif, jika tanda sama dengan 1 maka bilangan negatif sebaliknya jika tanda bernilai 0 maka bilangan positif :

Bit tanda

10001010 (bilangan negatif) 00001010 (bilangan positif)

Ones complement. Untuk menghitung bilangan ones complement dari suatu bilangan maka balikan seluruh nilai bitnya. Contoh, ones complement dari 11110000b adalah 00001111b.

Twos complement. Untuk menyimpan nilai negetif maka digunakan bilangan twos complement. Twos complement diperoleh dengan menambah satu pada bilangan ones complement.

Contoh twos complement dari +6 (00000110b), balikan nilai bitnya untuk mendapatkan ones compelent menjadi 11111001b, untuk memperoleh twos complementnya ditambah satu menjadi : 11111010b (ini nilai twos complement untuk -6). Untuk mendapatkan kembali nilai +6 sebagai berikut :

1 1 1 1 1 0 1 0 - 6

0 0 0 0 0 1 0 1 ones complement + 1 tambah 1

0 0 0 0 0 1 1 0 + 6

Nilai maksimum dan minimum. Karena nilai paling kiri pada bilangan bertanda digunakan untuk tanda bilangan, maka ukuran bilangan akan berkurang, yang digunakan hanya 7 bit sehingga nilai paling besar yang bisa dicapai adalah +127.

(11)

Tabel berikut menunjukan nilai maksimum dan minimum untuk byte, word dan double word bertanda :

Tipe penyimpan Nilai terendah Nilai tertinggi

Byte -127 +127

Word -32,767 +32,767

Double word -2,147,483,647 +2,147,483,647

Penyimpan karakter

Komputer hanya dapat menyimpan bilangan biner, jadi bagaimana menyimpan karakter seperti “A” dan “$” ? Telah dibuat suatu sistem menterjemahkan karakter ke dalam bilangan biner yaitu American Standard Code for Information Interchange

(ASCII). Sistem lainnya, Extended Binary Code for Decimal Interchange (EBCDIC),

digunakan oleh mini dan mainframe komputer IBM. Berikut ini tabel contoh kode ASCII :

Kode ASCII Ctrl Mnemonic Penjelasan

00 NUL Karakter kosong

01 Ctrl – A SOH Awal header

02 Ctrl – B STX Awal teks

03 Ctrl – C ETX Akhir teks

04 Ctrl – D EOT Akhir transmisi

05 Ctrl – E ENQ Pertanyaan (Enquiry)

06 Ctrl – F ACK Pemberitahuan 07 Ctrl – G BEL Bel 08 Ctrl – H BS Backspace 09 Ctrl – I HT Tab horison 0A Ctrl – J LF Line feed 0B Ctrl – K VT Tab vertikal 0C Ctrl – L FF Form feed 0D Ctrl – M CR Carriage return 0E Ctrl – N SO Shift out 0F Ctrl – O SI Shift in

10 Ctrl – P DLE Data link escape

11 Ctrl – Q DC1 Device control 1

12 Ctrl – R DC2 Device control 2

13 Ctrl – S DC3 Device control 3

14 Ctrl – T DC4 Device control 4

15 Ctrl – U NAK Pemberitahuan negatif

16 Ctrl – V SYN Synchronous idle

17 Ctrl – W ETB Akhir transmisi blok

18 Ctrl – X CAN Batal

19 Ctrl – Y EM Akhir medium

1A Ctrl – Z SUB Pengurangan

(12)

1B Ctrl – [ ESC Escape

1C Ctrl – \ FS Pemisah file

1D Ctrl – ] GS Pemisah grup

1E Ctrl – ^ RS Pemisah rekord

1F Ctrl – -| US Pemisah unit

Standar kode ASCII hanya menggunakan 7-bit kode sedangkan nilai selebihnya yang mungkin 7Fh. 8-bit lainya adalah pilihan, digunakan oleh IBM-PC untuk memperluas kumpulan karakter. Nilai 80h – FFh menggambarkan simbol grafik dan karakter Yunani. Nilai 0-1Fh adalah kode kendali untuk printer, komunikasi dan keluaran layar.

Semua karakter, termasuk bilangan dan huruf, dibuat unik pada kode ASCII. Contoh, kode untuk karakter string “ABC123” adalah :

Karakter A B C 1 2 3

Kode ASCII 41h 42h 43h 30h 31h 32h

Penyimpanan bilangan. Setiap huruf atau digit memerlukan 1 byte memori. Namun ketika menyimpan bilangan, kita bisa lebih efisien, contoh, bilangan 123 dapat disimpan dalam memoori sebagai satu byte yaitu 01111011b.

1.3. Bahasa Assembly – Pengenalan Insturksi bahasa assembly

Meskipun mungkin untuk membuat program bahasa mesin menggunakan angka, bahasa assembly membuat pekerjaan lebih mudah. Instruksi bahasa assembly adalah representasi simbolik instruksi mesin tunggal. Dalam bentuknya yang paling sederhana, terdiri dari satu mnemonic, kode alfabet singkat yang secara harfiah “membantu memori” dalam mengingat instruksi CPU. Mnemonic mungkin diikuti oleh operand berikut contohnaya :

clc ; hanya sebuah mnemonic inc ax ; operand tunggal

mov ax, bx ; dua operand

Setiap instruksi dapat diikuti oleh komentar, yang selalu diawali dengan titik koma (;).

Operand, operand mungkin berupa register, variabel, lokasi memori atau nilai

immediate. Contoh :

10 (nilai immediate)

count (variabel) AX (register) [0200] (lokasi memori)

(13)

Contoh program

Program bahasa assembly dibangun oleh instruksi dan operand. Instruksi memerintahkan CPU untuk melaksanakan aksi, sedang variabel adalah lokasi memori dimana data disimpan. Variabel juga disebut operand memori. Operand langsung adalah konstanta seperti 5 dan 10. Berikut ini contoh program untuk menjumlahkan 3 bilangan dan menyimpannya dalam variabel yang disebut sum. Sum diasumsikan dalam heksadesimal.

mov ax, 5 ; memindahkan 5 ke dalam register ax

add ax, 10 ; menambahkan nilai 10h terhadap register ax add ax, 20 ; menambahkan nilai 20h terhadap register ax mov sum, ax ; menyimpan ax dalam variabel sum

int 20 ; akhir program

Instruksi MOV memerintahkan CPU untuk memindahkan atau menyalin data, dari operand sumber ke operand tujuan. Baris 1 memindahkan 5 ke dalam register AX. Baris 2 memindahkan 10 (hexa) ke dalam AX, membuatnya sama dengan 15. baris 3 menambahkan 20 ke AX, membuatnya sama dengan 35, dan baris 4 menyalin AX ke dalam variabel dalam memori yang disebut SUM. Baris terakhir menghentikan program.

Perintah DEBUG untuk menyusun dan test program adalah sebagai berikut :

Perintah Komentar A 100 Mov ax, 5 Add ax, 10 Add ax, 20 Mov [0120] , ax Int 20 R T T T G Q

Assembly dimulai pada lokasi 100h Perintah program yang pertama

Hasil jumlah pada lokasi 0120h Akhir program

(tekan Enter untuk mengakhiri assembly) Menampilkan register

Trace satu instruksi

Ekseskusi sisa program

Keluar dari Debug kembali ke DOS

Setelah isntruksi yang kedua akan diperoleh tampilan hasil sebagai berikut : 1. mov ax, 5 ax : 05

2. add ax, 10 ax : 10 3. add ax, 20 ax : 35

(14)

AX = 0015 BX = 0000 CX = 0000 DX = 0000 SP = FFEE BP = 0000 SI = 0000 DI = 0000 DS = 23AD ES = 23AD SS = 23AD CS = 23AD IP = 0106 NV UP EI PL NZ NA PO NC 23AD : 0106 052000 ADD AX, 0020

Gambar 1.1. Program contoh

Register AX merupakan hasil penjumlahan 5 dan 10, sehingga AX = 15. Register IP menyimpan alamat instruksi berikutnya yang akan dieksekusi (0106). Instruksi berikutnya yang akan di eksekusi adalah ADD AX, 0020

1.3.1. Elemen Dasar Bahasa Assembly

Gambar 1.2. menunjukan kumpulan karakter dasar assembler. Karakter-karakter tersebut mungkin digunakan unntuk membentuk nomor, nama, perintah dan parameter.

Konstanta

Konstanta adalah nilai yang diketahui dan dikalkulasikan pada saat penyusunan program. Konstanta mungkin nomor atau karakter string. Dia tidak dapat diubah pada saat program dijalankan.

Kumpulan karakter dalam Assembly Letter : A-Z, a-z

Digit : 0-9 Karakter khusus : ? , (koma) @ “ _ & $ % : ! . ‘ [] ~ () | <> / {} = + # - ^ / ; * `

(15)

Gambar 1.2. Kumpulan karakter assembly

Variabel, sebaliknya, adalah lokasi memori yang dapat berubah pada saat program dijalankan. Contoh berikut adalah konstanta :

‘ABC’ 2134 5*6 (1+2)/3

Integer. Integer dibangun oleh digit-digit angka tanpa titik desimal, diikuti oleh

karakter radix (d=desimal, h=hexa, q=octal, b=biner). Contoh :

Contoh Radix 11110000b 200 300d 4A6Bh 2047q 2047o Biner Desimal Desimal Heksadesimal Oktal Oktal

Bilangan real : angka real mengandung digit, titik desimal tunggal, eksponent

(opsional) dan tanda awal (opsional). Sintaknya : [{+/-}] digit.digit [E{+/-}] digit Contoh

2.3 + 200.576 E +05

0.243526E –5

- 6.08 e3

Notasi sintak : dalam contoh sebelumnya dan pada contoh yang akan datang elemen

opsional akan ditutup dengan kurung siku. Tanda kurung besar mengidentifikasikan pilihan yang diperlukan. Kata kunci yang diperlukan ditulis dalam huruf besar. Kata huruf kecil miring adalah istilah-istilah yang telah didefinisikan sebelumnya seperti identifier, operand dan register.

Karakter atau konstanta string : karakter ASCII tunggal atau string karakter yang

ditutup oleh tanda quotasi tunggal (‘’) atau ganda (“”), contoh :

“a”

‘B’

“Stack Overflow” ‘012#?%&’

(16)

Konsatanta karakter panjangnya 1 byte. Panjang sebuah string ditentukan oleh jumlah karakter yang ada di dalamnya. Konstanta berikut panjangnya 5 byte :

‘ABCDE’

Apostrof (‘) ditutup diantara dua tanda quotasi (“”), atau tanda quotasi ganda (“”) ditutup oleh quotasi tunggal (‘’). Contoh berikut adalah benar :

“That’s not all …….”

‘The file “First” was not found’ “The file ‘First’ was not found”

Pernyataan

Pernyataan/perintah bahasa assembly terdiri dari nama, mnemonic, oeprand dan komentar. Pernyataan secara umum dibagi ke dalam dua kelas yaitu instruksi dan perintah. Instruksi adalah pernyataan yang dapat dieksekusi, dan perintah adalah pernyataan yang menyediakan informasi untuk membantu assembler dalam menghasilkan kode yang dapat dieksekusi. Format umum sebuah kalimat.

[name][mnemonic][operand][; coment]

Kalimat harus ditulis pada baris tunggal dan tidak melebihi 128 kolom. Perintah, atau pseudo op, adalah pernyataan yang berefek pada daftar program atau cara kode mesin dibuat. Contoh, perintah DB memerintah assembler untuk membuat memori untuk variabel bernama count dan memberi nilai awal 50.

Count DB 50

Isnturksi dieksekusi oleh mikroprosesor pada saat dijalankan. Instruksi dibagi ke dalam tipe-tipe-tipe umum : kendali program, transfer data, aritmetik, logic dan I/O. Instruksi-instruksi selalu diterjemahkan langsung ke dalam kode mesin oleh assembler. Setiap satu instruksi bahasa assembly diterjemahkan langsung ke dalam satu instruksi bahasa mesin.

Nama

Nama mengidentifikasikan label, variabel, simbol atau kata kunci. Nama mungkin mengandung salah satu karakter berikut :

Karakter Penjelasan A … Z, a … z 0 … 9 ? _ @ Huruf Angka Tanda tanya Underscore Tanda @

(17)

$ .

Tanda dollar Titik

Nama mempunyai batasan sebagai berikut : - Hanya 31 karakter pertama yang dikenali

- Tidak ada perbedaan antara huruf besar dan huruf kecil - Karakter pertama tidak boleh angka

- Jika digunakan, tanda (.) hanya bisa digunakan sebagai karakter pertama - Tidak boleh memilih nama yang sama dengan kata kunci (perintah/direktif)

Variabel dan konstanta. Nama digunakan sebelum perintah alokasi memori

mengidentifikasikan lokasi dimana data disimpan dalam memori. Atau mungkin juga digunakan untuk mendefinisikan konstanta, sebagai berikut :

Count1 db 50 ; variabel (alokasi memori) Count2 equ 100 ; konstanta

Label. Jika nama tampil disamping instruksi program, ini disebut label. Label

berfungsi sebagai penanda kapan saja program mau meloncat atau looping dari satu lokasi ke lokasi lain. Seperti contoh berikut dimana Label1 dan Label2 adalah label yang mengidentifikasikan lokasi dalam program :

Label1 : mov ax, 0

mov bx, 0

Label2 :

jmp label1

Kata kunci. Kata kunci atau reserved word selalu mempunyai arti yang sebelumnya

telah didefinisikan. Keyword mungkin instruksi atau direktif. Contohnya : MOV, PROC, ADD, AX dan END. Kata kunci tidak dapat digunakan keluar dari konteknya atau sebagai identifier, contoh penggunaan ADD sebagai label adalah tidak benar : add : mov ax, 10

1.4. Contoh Program Hello

Kita lihat gambar 1.3. yang menampilkan pesan “Hello, world!” pada layar. Baris 1 mengandung perintah title; semua karakter sisanya pada baris 1 dianggap komentar, sepreti pada baris 3.

Sebelum menyelesaikan lebih lanjut, kita jelaskan dulu segmen, yaitu bagian-bagian yang membangun program.

(18)

Segmen code adalah bagian dimana instruksi program disimpan, segemen data adalah bagian dimana variabel disimpan. Dan segmen stack dimana stack disimpan. Stack adalah daftar dalam memori dimana program dijaga dalam variabel sementara, kembali dari subrutin dan semacamnya.

Direktif dosseg menunjukan segmen standar untuk code, data dan segmen stack. Perintah model small mengindikasikan bahwa program menggunakan microsoft assembler memory “small”. Direktif stack menset 100 H (256) byte ruang stack untuk program.

Title Program Hello world [1]

[2] ; program ini menampilkan pesan “Hello, world” [3]

[4] dosseg [5] . model small [6] . stack 100h [7] [8] . data [9]

. hello_message db ‘Hello, world !’, 0dh, 0ah, ‘$’ [10]

[11]

. code [12]

main proc [13]

mov ax, @data [14]

mov ds, ax [15]

[16]

mov ah, 9 [17]

mov dx, offset hello_message [18]

int 21h [19] [20] mov ax, 4000h [21] int 21h [22] main endp [23] endp main [24]

Gambar 1.3. Program Hello.asm

Direktif .code menandai awal segemen kode. Perintah .data menandai awal segmen data, dimana variabel dideklarasikan.

Baris 9-10 mengandung segmen data, dimana variabel yang diberinama hello_message dideklarasikan. Huruf DB adalah direktif define byte yang meminta assembler untuk mengalokasikan serangkaian byte memori untuk data yang mengikutinya.

Baris 13 menggunakan perintah proc untuk mendeklarasikan prosedur main (mungkin juga menggunakan nama lain).

Baris 14-15 menyalin alamat segmen data ke dalam reg DS. Instruksi MOV selalu mempunyai 2 operand. Tujuan dan sumber.

(19)

Baris 17-19 menyebabkan string karakter dituliskan ke konsole. Mereka melakukannya dengan memanggil fungsi DOS yang menampilkan string yang alamatnya dalam register DX. Nomor fungsi diletakan dalam register AH.

Baris 21-22 adalah perintah untuk berhenti dan kembali ke DOS. Baris 23 adalah akhir dari prosedur main dan baris 24 baris terakhir yang diassembly.

(20)

II. ARSITEKTUR PERANGKAT KERAS DAN PERANGKAT LUNAK

2.1. Komponen Mikrokomputer Video Display

Kebanyakan PC yang dibuat sejak 1990 mempunya display warna VGA (Video Graphic Array). Display VGA standar yang mempunyai resolusi 640 (horisontal) kali 480 (vertikal) piksel. Display VGA minimal memiliki 16 warna berbeda secara bersamaan, dan ada juga sampai 256 warna.

Terdapat juga display Super VGA (800 x 600) dan Ectended-VGA (1024 x 800), yang dapat meningkatkan pembacaan program yang berbasis grafik.

Display warna yang digunakan oleh PC terdahulu adalah CGA (Color Graphics Adapter) dan EGA (Enhanced Graphic Adapter). Keduanya memiliki piksel yang lebih sedikit pada setiap baris dan kolomnya. IBM-PC yang asli mempunyai tampilan monokrom yang hanya dapat menampilkan karakter tekst ASCII (25 baris dan 80 kolom).

Keyboard

Semenjak IBM-PC dikenalkan, keyboard telah mengalami perkembangan. Model asalnya mempunyai 10 kunci fungsi, dan kunci panah kursor dibagi dengan kunci untuk angka. Komputer yang lebih banyak kuncinya dikenalkan bersamaan dengan kompuer IBM-AT dengan memiliki 12 kunci fungsi. Bahkan yang berikutnya, IBP seri PS/2 memperkenalkan keyboard dengan 12 kunci fungsi seperti top, kunci panah yang terpisah, home, end, pageup dan pageDown. Akhir-akhir ini fabrik komputer PC semuanya meniru format yang dimiliki keyboard IBM-PC

Drive disk

IBM-PC asli memiliki dua drive disk yaitu 5.25 inci berkapasitas 360 KB. Kemudian IBM-AT membawa drive disk 1.2 MB yang dapat juga membaca HD 360 KB. Kemudian drive disk 3.5 inci dikenalkan oleh komputer IBM seri PS/2, yang dapat membaca dua format : 720 K dan 1.44 MB.

Unit sistem

Unit sistem adalah “jantung” komputer yang sesungguhnya. Contoh PC 386-compatible ditunjukan pada gambar 2.1. ini menggunakan prosesor Intel 386, mempunyai RAM 2 MB, 2 Floppy disk drive, 200 MB HD, 2 port parallel, 1 port serial dan backup tape luar, modem internal dan mouse.

Board sistem (sering juga disebut motherboard) terhampar mendatar pada bagian bawah unit sistem. Didalamnya terdapat banyak chip mikroprosesor, termasuk CPU, RAM dan memory ROM, dan berbagai prosesor pendukung. Berikut ini adalah komponen utama.

(21)

Prosesor pendukung, satu prosesor adalah chip pengendali interupt yang menangani

permintaan dari perangkat keras untuk mengintrupsi CPU. Chip pengendali DMA menangani transfer data ke dan dari memori melalui bus data.

Gambar 2.1. Komputer IBM-386

Rom Bios. Ini disebut firmware (perangkat keras dengan program tambahan) bagian

dari sistem operasi PC. Biasanya ROM harus diganti karena untuk mendukung peripheral baru.

RAM (Random Access Memory) : tempat meyimpan program dan data pada saat

program dijalankan. Khususnya, RAM disebut RAM dinamis karena isinya akan hilang jika tidak menerima sinyal baru yang konstan dari CPU.

CMOS RAM. Informasi setup sistem disimpan disini, sehingga kita dapat

mengkonfigurasi komputer tanpa harus menggunakan switch mekanik

Slot tambahan. Terdapat beberapa tempat pada motherboard yang dapat digunakan

untuk menambah slot yang diperlukan seperti disk drive controller, tape drive

200-watt power suplay Half-height 200-MB HD CPU 32-bit memori expansion slot Internal 2400-baud modem 16-bit VGA video controller Serial and Parallel port Bus mouse controller External tape backup connector

Hard disk and ploppy disk controller Keyboard connector Intel 80386 DX processor Intel 80387 math coproscessor 2-MB Ram on

(22)

controller, video controller, network controller, I/O port, modem, mouse controller dll.

Power supply. Kotak besi yang menkonversi voltase 110 v AC dari sumber luar ke

dalam komputer.

Parallel port. Kebanyakan printer terhubung dengan komputer melalui port parallel.

Dengan parallel berarti 8 bit data dapat mengalir dari komputer ke printer secara bersamaan.DOS mendukung 3 port parallel yaitu LPT1, LPT2 dan LPT3.

Serial port. Port serial digunakan untuk menghubungkan mouse, modem, atau

perangkat serial lainnya ke sistem komputer. Dengan tipe port seperti ini, data biner dikirim satu per satu. DOS mendukung sampai 2 port serial yang disebut COM1 dan COM2.

Keluarga mikroprosesor Intel

Berikut ini daftar pemroses keluarga Intel dari yang terdahulu :

80x87. Chip co-prosesor matematika dikenalkan sebagai penyerta pada 8086/8088. Chip ini dapat menyelesaikan penghitungan floating-point dengan baik.

80186. 80186 merupakan pengembangan dari 8088, dengan 8 MHz clock dan instruksi baru dengan tujuan untuk meningkatkan efesiensi prosesor.

80286. 80286 dikenalkan pertama kali pada komputer IBM-AT. RAM yang bisa diakses sampai sebesar16 MB. Menggunakan 16-bit data dan mempunya kecepatan clock sampai 12-25 MHz.

80386. pada tahun 1985, Intel memperkenalkan prosesor 386 DX (dikenal sebagai 80386) yang mempunyai 32-register dan 32-bit bus data. Bersamaan dengannya dikeluarkan juga co-prosesor matematika 80287 dan 80387.

80486. 80486 pada dasarnya sama dengan 80386 dengan tambahan co-prosesor matematika built instruksi dan cache memori RAM kecepatan tinggi di dalamnya. Cache RAM meningkatkan kinerja komputer dengan mengijinkan CPU untuk mengambil instruksi dari memori kecepatan tinggi.

Kecocokan. Perlu dicatat bahwa setiap prosesor baru dikenalkan oleh Intel adalah akan cocok dengan prosesor sebelumnya. Artinya perangkat lunak yang dibuat pada satu prosesor akan bisa juga digunakan pada komputer yang lebih baru.

2.2. Arsitektur Sistem

(23)

Mikrokomputer menggunakan CPU tunggal, seperti pada gambara 2.2. dalam kenyataannya terdapat banyak chip yang mendukung PC, yang paling nampak adalah 80x87 co-prosesor matematika, tapi CPU masih menjadi pengatur utamanya. Tugas yang paling mendasar yang ditangani oleh CPU adalah :

Menemukan dan load instruksi berikutnya Mengeksekusi instruksi :

Fetch data dari memori/register

Menyimpan data dalam memori/register Melaksanakan penghitungan dan perbandingan Memperbaharui penunjuk instruksi (pencabangan)

Gambar 2.2. Rancangan CPU sederhana

CPU dibagi menjadi dua bagian : Arithmeticl Logic Unit (ALU) dan Control Unit (CU). ALU melaksanakan operasi aritmetik, logic, dan penggeseran, CU mengambil data dan instruksi dan menerjemahkan kode (decode) alamat untuk ALU.

Seluruh sisi chip adalah pin yang ditancapkan ke dalam soket dalam board sistem, menghubungkannya ke bagian sistem komputer yang lain. Register berada dalam CPU. Ketika sesuatu diambil dari memori, alamatnya dihitung oleh unit kendali dan dikirm melalui bus alamat. Nilai dari memori (baik instruksi atau data) dikirim balik ke CPU melalui bus data. Clock melakukan sinkronisasi setiap operasi CPU.

Bus data. Bus adalah kabel parallel yang mengirimkan data antara berbagai bagian CPU. Sinyal kendali dan bit data digunakan pada saat pengambilan word memori dan menempatkannya dalam register. Bus dikatakan bidireksional jika data dapat ditransfer dari dua arah.

Register. Berada dalam CPU yaitu area penyimpan kecepatan tinggi, yang langsung terhubung ke unit kendali dan ALU. Karenanya, penggunaan register untuk eksekusi lebih cepat daripada menggunakan memori konvensional. Kumpulan instruksi Intel membutuhkan penggunaan setidaknya satu register untuk semua instruksi.

Register Data Register Alamat Unit Kendali (control unit) Arithmetic Logic Unit Register Flag Jalur keluaran Jalur keluaran Bus Alamat Bus Data

(24)

Clock. Setiap operasi yang dilakukan di CPU harus disinkronkan oleh clock. Unit waktu paling dasar untuk instruksi mesin yang disebut siklus mesin (machine cycle). Instruksi mesin dalam prosesor Intel umumnya dilaksanakan antara 3 dan 20 clock.

Register

Register adalah lingkungan kerja khusus dalam CPU, dirancang untuk diakses pada kecepatan tinggi. Register memiliki panjang 16 bit. Pengaksesan 4 register data dibagi dua bagian yaitu setengah bagian atasnya dan setengah bagian bawah.

Register data AX, BX, CX, DX (16 bit)

AH, AL, BH, BL, CH, CL, DH, DL (8 bit) Register segemn CS, DS, SS, ES

Register indeks SI, DI, BP Register khusus IP, SP

Register flag overflow, direction, interupt, tmp, sign, zero, auxiliary carry, parity, carry.

Diagram register 8086/8088 ditunjukan pada gambar 2.3.

Register data. Empat register, dinamai register data atau register tujuan umum,

digunakan untuk perhitungan aritmetik dan pemindahan data. Perhitungan setiap register dapat dialamati sebagai nilai 16-bit atau 8 bit.

Contoh register AX adalah register 16-bit, 8 bit atasnya disebut AH dan 8 bit bawahnya dinamai AL. Posisi bit selalu diberi nomor dari kanan ke kiri dimulai dari nol.

Instruksi mungkin menunjuk 16 bit atau 18 bit register data dari daftar berikut : 16-bit register AX Register AH Register AL Bit 15 ………… …………..0 Bit 7 ………..0 7 …………..0 AX AH AL BX BH BL CX CH CL DX DH DL

(25)

Jika kita memindahkan 126Fh ke dalam AX maka AL akan berubah menjadi 6F h. Tujuan Umum

Gambar 2.3. Flag Intel 8086/8088

Masing-masing register dengan tujuan umum memiliki atribut-atribut khusus.

AX (akumulator) : AX disebut register akumulator karena digunakan oleh CPU untuk operasi aritemtik. Operasi-operasi lain juga sedkit lebih efisien dengan menggunakan AX. AX AH AL BX BH BL CX CH CL DX DH DL Flag IP BP SP SI DI CS SS DS ES Segmen Index

(26)

BX (basis). Seperti register tujuan umum lainnya, register BX dapat melaksanakan operasi aritmetik dan perpindahan data dan BX memiliki kemampuan pengalamatan khusus. Dia dapat menyimpan alamat memori yang menunjuk pada variabel lain. Tiga register lain yang memiliki kemampuan ini adalah SI, DI dan BP.

CX (counter). Register CX bekerja sebagai counter untuk instruksi pengulangan atau looping. Isntruksi-instruksi tersebut secara otomatis mengulang dan mengurangi CX dan keluar ketika CX sama dengan 0.

DX (data). Register DX mempunyai peranan khusus dalam operasi perkalian dan pembagian. Pada saat perkalian, contohnya, DX menyimpan 16 bit perkalian.

Register segmen. CPU mengandung 4 register segmen, digunakan sebagai lokasi

basis untuk instruksi program, data dan stack. Register segmen sebagai berikut : CS (code segment) : register CS menyimpan lokasi basis semua instruksi yang dapat dieksekusi dalam program.

DS (data segment). Register DS adalah lokasi basis default untuk variabel-variabel CPU menghitung lokasi variabel-variabel-variabel-variabel menggunakan nilai segmen dalam DS.

SS (stack segment). Register SS mengandung lokasi basis stack.

ES (extra segment). Register ES adalah lokasi basis tambahan untuk variabel-variabel memori.

Register index. Register index mengandung offset variabel.

Istilah offset mengacu pada jarak variabel, label atau instruksi dari segmen basisnya. Register index memprecepat pemrosesan string array dan struktur data lain yang mengandung banyak elemen. Register-register index adalah :

SI (source index). Register ini mengambil nama dari instruksi epmindahan string, yang mana string sumber ditunjuk oleh register SI. SI biasanya mengandung nilai offset dari register DS.

DI (destination index). Register DI bekerja sebagai tujuan instruksi pemindahan string. Biasanya mengandung offset dari register ES, BP (base pointer). Register BP megnandung offset ??? dari register SS. ??? registeer BP sering digunakan oleh subrutin untuk melokasikan variabel-variabel yang dilewatkan pada stack oleh program pemanggil.

Register khusus : register IP dan SP merupakan register khusus sebagai berikut :

IP (instruction pointer). Register IP selalu mengandung offset instruksi berikutnya yang akan dieksekusi. CP dan IP digabung untuk melaksanakan alamat komplit instruksi berikutnya yang akan dieksekusi.

SP (stack pointer). Register SP mengandung offset atau jarak dari awal stack ke puncak stack. Register SS dan SP bersama melakukan alamat lengkap puncak stack.

Register tambahan 80386. prosesor 8038x/80486 mengandung register 32-bit (gb),

yang meningkatkan efisiensi program pada penggunaannya. Pada saat yang sama juga 80386/80486 dapat menggunakan register 16-bit yang sama seperti 8088.

(27)

Register flag. Register flag adalah register 16-bit khusus dengan posisi bit sendiri

dibuat untuk menunjukan status CPU atau hasil operasi aritmetik. Setiap posisi bit yang relevan diberi nama, posisi lain tidak didefinisikan.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 x x x x O D I T S Z x A x P x C

O = Overflow S = Sign D = Directione Z = Zero

I = Interrupt A = Auxiliary Carry

T = Trap P = Parity

X = tidak terdefinisi C = Carry

Kita tidak harus mengingat setiap posisi flag karena terdapat instruksi khusus untuk menguji dan manipulasi flag. Terdapat dua tipe dasar flag yaitu control flag dan status flag. 31 ……….0 |---AX ---| EAX 31 ……….0 |---BX ---| EBX 31 ……….0 |---CX ---| ECX 31 ……….0 |---DX ---| EDX 31 ……….0 |---FLAG----| EFLAG

Status dan Kendali

EBP ESP ESI EDI CS SS DS ES FS GS

}

Code Stack Data

(28)

Gambar 2.4. Register Extended 80386

Flag

Flag Kendali. Sebuah bit mungkin diset dalam flag oleh pemrogram untuk mengendalikan operasi CPU. Terdapat flag Direction, Interrupt, dan Trap.

Flag Direction mengendalikan petunjuk asumsi yang digunakan oleh instruksi pemroses string. Nilai flag 1 = up dan 0 = down. Pemrogram mengendalikan flag ini, menggunakan instruksi STD dan CLD.

Flag Interrupt membuatnya mungkin untuk terjadinya interrupt dari eksternal. Interrupt ini disebabkan oleh perangkat keras seperti keyboard, disk drive dan timer clock sistem. Seringkali kita menonaktifkan interrupt pada saat melaksanakan operasi yang krritis yang tidak dapat diinterrupt. Nilai flag 1 = aktif, dan 0 = tidak aktif. Flag ini dikendalikan oleh perintah CLI dan STI.

Flag trap menentukan apakah CPU berhenti atau tidak setelah instruksi. Debugger telah menset flag ini sehingga pemrogram dapat menelusuri setiap instruksi programnya satu per satu. Nilai flag 1 = trap on dan 0 = trap off; flag dapat diset oleh instruksi INT 3.

Flag status. Bit-bit flag status menggambarkan keluaran operasi aritmetik dan logic yang dilaksanakan oleh CPU. Terdapat flag Overflow, Sign, Zero, Auxiliary Carry, Parity dan Carry.

Flag Carry diset ketika hasil operasi aritmetik tidak bertanda lebih besar dari ukuran operand tujuan. Contoh, jika nilai 200 dan 56 dijumlahkan dan ditempatkan dalam register 8-bit (seperti AL), hasilnya akan terlalu besar dan tidak muat ; maka flag Carry akan diset. Nilai flag 1 = ada carry, 0 = tidak ada carry.

Flag Overflow diset pada saat hasil operasi aritmetik bertanda terlalu besar untuk dimuat ke dalam operand tujuan. Nilai flag 1 = overflow dan 0 = tidak overflow.

Flag Sign diset ketika hasil operasi aritmetik dan logic menghasilkan nilai negatif. Karena bilangan negatif selalu bernilai 1 pada bit posisi tertingginya, flag Sign selalu merupakan salinan bit tanda operand tujuan. Nilai flag 1 = negatif, 0 = positif.

Flag Zero diset ketika hasil operasi aritmetik dan logic menghasilkan nilai 0. Flag sering digunakan oleh instruksi jump dan loop, untuk dapat mencabang ke logasi bari dalam program berdasarkkan perbandingan dua buah nilai. Nilai flag 1 = nol , 0 = bukan nol.

Flag Auxiliary Carry diset ketika operasi menyebabkan carry dari bitn 3 ke bit 4 (atau meminjam dari bit 4 ke bit 3) operand. Flag ini jarang digunakan oleh pemrogram, nilai flag 1 = ada carry dan 0 = tidak ada carry.

Flag Parity menggambarkan jumlah bit dalam hasil operasi yang diset. Jika terdapat bilangan genap maka Paritynya genap. Jika terdapat bilangan ganjil maka

31 ……….0 |--- IP ---| EIP

(29)

paritinya ganjil. Flag ini digunakan oleh sistem operasi untuk memeriksa integritas memori atau memeriksa kebenaran transmisi data oleh perangkat lunak komunikasi.

Stack

Stack adalah memori buffer khusus yang digunakan sebagai temporary yang menyimpan alamat dan data. Stack terletak dalam segmen stack. Setiap lokasi 16-bit pada stack ditunjuk oleh register SP, yang disebut stack pointer. Stack pointer menyimpan alamat elemen data terakhir yang ditambahkan (di-push) ke dalam stack. Nilai terkahir yang dimasukan ke dalam stack adalah nilai yang pertama diambil dari stack pada saat di pop. Mekanisme ini diistilahkan dengan struktur LIFO (last in first

out), yang terakhir masuk keluar duluan.

Kita lihat stack program yang mengandung satu nilai, 0006, pada bagian sebelah kiri ilustrasi dibawah ini. SP menunjuk pada nilai yang terakhir ditambahkan.

Push. Operasi PUSH menyalin nilai ke dalam stack. Ketika kita mendorong

(push) nilai ke dalam stack, seperti yang digambarkan oleh bagian kanan ilustrasi, SP dikurangi nilainya sebelum nilai baru di push. Contoh berikut menggambarkan operasi push :

mov ax, 00A5

push ax

Instruksi tidak mengubah isi AX, tetapi hanya menyalinnya dan memasukannya ke dalam stack. 0006 SP Sebelum (high memory) (low memory) 0006 00A5 SP Sesudah (high memory) (low memory)

(30)

Sejalan dengan penambahan nilai ke dalam stack maka stack semakin kearah bagian bawah memori. Misalkan register BX dan CX bernilai 0001 dan 0002. instruksi berikut menyalin nilainya ke dalam stack :

push bx push cx

Sekarang nilai 0001 dan 0002 telah dimasukan ke dalam stack, akan terlihat sebagai berikut :

Pop. Operasi POP mengeluarkan nilai dari stack dan menempatkannya dalam

register atau variabel. Sesudah nilai diambil dari stack, nilai stack pointer ditambah satu untuk menunjuk pada nilai sebelumnya dalam stack. Misalkan kita akan mengeksekusi instruksi berikut :

pop ax

Ilustrasi kondisi stack sebelum dan sesudah operasi ini adalah sebagai berikut :

0006 00A5 0001 0002 SP Sesudah (high memory) (low memory) 0006 00A5 0001 0002 SP Sebelum (high memory) 0006 00A5 0001 (0002) SP Sesudah (high memory) (AX = 0002)

(31)

Setelah operasi POP dilakukan, register AX mengandung nilai yang berasal dari puncak stack (0002). Stack pointer pindah ke nilai stack sebelumnya yaitu 0001. Nilai yang di ambil (0002) tidak lagi ada dalam stack.

Terdapat tiga standar menggunakan stack :

1. Stack membuat daerah penyimpan sementara yang baik untuk register jika kita ingin memelihara nilainya. Kita dapat menggunakan register dengan bebas dan mengambil kembali nilainya dari stack setelah selesai operasinya. 2. Ketika subrutin dipanggil, program menyimpan nilai alamat kembali pada

stack, lokasi dimana program harus kembali setelah subrutin selesai.

3. Bahasa tingkat tinggi membuat darerah pada stack dalam subrutin yang disebut frame stack. Ini berada pada daerah dimana variabel-variabel lokal dibuat pada saat subrutin aktif.

Siklus Eksekusi Instruksi

Sebuah instruksi level-mesin masih harus diuraikan dalam serangkaian mikroinstruksi. Instruksi tersebut dieksekusi oleh penerjemah dalam CPU yang disebut mikroprogam. Kebanyakan mikroprogram disembunyikan, dirahasiakan, oleh fabrik CPU, karena program tersebut akan memudahkan pesaing utt meniru fungsi chipnya.

Ketika CPU mengeksekusi instruksi untuk menambah nilai sebuah bilangan, contohnya, mikroprogram harus melaksanakan operasi pada level yang lebih rendah : menghitung alamat operand, menempatkan alamat operand bada bus alamat, menunggu memori untuk merespon, transfer operand dari bus data ke ALU, dan seterusnya.

Untuk menyederhanakan, tedapat tiga operasi dasar yang dilaksanakan dalam CPU : fetch, decode, dan execute. Setiap tahap dalam siklus instruksi memerlukan minimal satu clock sistem, yang disebut siklur clock.

Fetch : Unit kendali mengambil instruksi, menyalinnya dari memori ke dalam

CPU.

Decode : Unit kendali menambah nilai (increment) program counter dan

menerjemahkan instruksi. Jika operand lain ditentukan oleh instruksi, unit kendali menerjemahkan alamat operand tersebut dan mengambilnya. Kemudian mengirim operand ke dalam ALU.

(32)

Execute : ALU mengeksekusi operasi dan mengirim operand hasil ke unit kendali,

dimana nantinya dikembalikan ke register dan memori.

2.3. Perangkat Lunak Sistem dan Memori Arsitektur Memori

Intel 8086 dapat mengakses memori 1,048,576 byte ( 1 MB) menggunakan alamat 20-bit (00000 - FFFFF). Memori dibagi menjadi RAM dan ROM. RAM mulai pada lokasi 00000 sampai alamat BFFFF. ROM mulai lokasi C0000 sampai FFFFF.

Dibawah DOS, hanya 640 K pertama RAM yang disiapkan untuk program. Memori sisanya diguankan oleh perangkat keras sistem seperti untuk display video dan pengendali hard disk, atau oleh ROM BIOS.

Berikut ini peta memori pada Intel 8086 :

Gambar 2.5. Peta 1 MB pertama Memori PC

Inisialisasi DOS

1,024 byte Memori paling bawah (alamat 0000-003FF) mengandung tabel verktor interrupt. Ini berisi alamat-alamat yang digunakan oleh CPU ketika memroses interrupt perangkat keras dan perangkat lunak.

Diatasnya terdaapt BIOS, yang didalamnya terdapat rutin-rutin untuk mengelola, keyboard, konsol dan printer dan clock tiap hari. Rutin-rutin tersebut berasar dari file sistem tersembunyi setiap kali disk boot memanggil IO.SYS (IBMBIO.COM). Kernel DOS berisi kumpulan layanan-layanan DOS yang dapat dipanggil dari

Interrupt Vector Table DOS data area

Software BIOS

DOS kernel, Device Driver, Etc Bagian Resident COMMAND.COM

Bagian Transient COMMAND.COM EGA/VGA Graphics Buffer

MDA Text Buffer

CGA/EGA/VGA Text Buffer Reserved ROM BIOS 00000 00400 9FFFF A0000 B0000 B8000 C0000 FFFFF Alamat (hex) 640 K RAM

(33)

program aplikasi. Diatas kernel DOS terdapat buffer file dan file driver devaice yang dapat dipasang (diambail dari CONFIG.SYS), diikuti oleh bagian resident COMMAND.COM. Kemudian disebut pemroses perintah DOS : ini akan menintrrupt perintah yang ditulis pada promt DOS dan memanggil dan mengesekusi program yang disimpan dalam disk.

Video Display

Video display adalah dipetakan di memori. Dari pada mengirim setiap karakter video melalui port ke video display, lebih efisien untuk memberikan setiap posisi layar pada alamat memori yang terpisah. Ketika DOS menulis karakter ke layar, dia akan memanggil subrutin dalam ROM BIOS, yang langsung menulis karakter ke alamat memori video.

Read-Only Memory (ROM)

Lokasi memori alamat C0000h sampai FFFFFh disediakan untuk khusus penggunaan ROM, termasuk pengeendali hard disk dan ROM BASIC.

ROM BIOS adalah bagian yang penting pada sistem operasi komputer. Di dalamnya tertadapat diagnosa sistem, dan perangkat lunak konfigurasi, seperti halnya subrutin input-output level bawah yang digunakan oleh DOS. BIOS dikodekan dalam chip mikroprosesor dalam borad sistem, yang dibuat oleh fabrik.

(34)
(35)

III. DASAR-DASAR BAHASA ASSEMBLY

3.1. Perintah Definisi Data

Variabel adalah nama simbolik untuk lokasi dalam memori dimana data disimpan. Dalam bahasa assembly, variabel diidentifikasikan oleh label. Setiap label menunjukan lokasi awal variabel. Kita katakan bahwa offset label adalah jarak dari awal segmen ke awal variabel.

Label, tidak menunjukan berapa banyak byte memori yang dialokasikan untuk bariabel. Contoh, jika kita mendeklarasikan array 4 karakter, lebel aList hanya mengidentifikasikan offset karakter awal (A)

Jadi jika huruf awal pada offset 0, maka selanjutnya pada offset 1, 2 dan seterusnya. Kita menggunakan memori berdasarkan pada tipe yang didefinisikan sebelumnya :

Deskripsi Byte Atribut

DB Define byte 1 Byte

DW Define word 2 Word

DD Define doubleword 4 Dobleword

DF, DP Define far pointer 6 Far pointer

DQ Define quadword 8 Quadword

DT Define tenbytes 10 Tenbyte

Define byte (DB)

Perintah DB mengalokasikan memori untuk satu atau lebih nilai 8-bit. Diagram sintak berrikut menunjukan bahwa nama adalah pilihan, dan hanya satu initial value yang diperlukan. Jika diperlukan lebih dari satu maka dipisahkan dengan koma : [name] DB initialvalue [, initialvalue] …

Initial value dapat berupa satu atau lebih nilai angka 8-bit, konstanta string, ekspresi

konstan atau tanda tanya (?). jika nilai bertanda maka rangenya –128 - + 127, jika tidak bertanda rengenya 0-255. berikut contohnya :

A B C D 1 2 3 4 Deklarasi AList db ‘ABCD’ Isi Offset Disimpan sebagai

(36)

char db ‘A’

signed1 db -128

signed2 db +127

unsigned1 db 0

unsigned2 db 255

Nilai banyak (multiple values), daftar bilangan-bilangan 8-bit mungkin

dikelompokan dibawah satu label, dengan nilai dipisahkan oleh koma. Pada contoh berikut, kita umpamakan bahwa daftar disimpan pada offset 0000. Ini artinya bawha 10 disimpan pada offset 0000, 20 pada offset 0001, 30 pada offset 0002, dan 40 pada offset 0003.

List db 10, 20, 30, 40

Karakter dan integer adalah satu dan sama. Variabel berikut mengandung nilai yang sama dan mungkin diproses dengan cara yang sama :

char db ‘A’ hex db 41h dec db 65

bin db 01000001b oct db 101q

Setiap konstanta mungkin menggunakan radix yang berbeda ketika daftar item didefinisikan, dan angka, karakter dan konstanta string mungkin dicampur secara bebas. Jika nomor heksadesimal mulai dengan huruf (A-F), maka nol diawal ditambahkan untuk membedakannya dengan label. Dalam conoh ini, list1 dan list2 mempunyai isi yang sama :

list1 db 10, 32, 41h, 00100010b list2 db 0Ah, 20h, ‘A’, 22h

Isi variabel mungkin tidak didefinisikan, untuk hal seperti ini menggunakan operator tanda tanya (?). atau ekspresi bilangan dapat memberi nilai awal sebuah variabel dengan nilai yang dihitung pada saat diassembly. Contoh :

count db ? ages db ?,?,?,?,? rowsize db 10*20

Varibel dapat diberi nilai string dimana variabel merupakan alwam byte awal. Contoh berikut menunjukan satu string diakhiri oleh byte nol (mengandung 0), dan string lain dengan panjangnya ditulis pada awal byte :

(37)

pascal_string db 14, “Good afternoon”

Perintah DB adalah perintah yang digunakan untuk menyimpan satu atau lebih baris teks. Variabel tunggal mungkin dilanjutkan untuk banyak baris tanpa perlu membuat label untuk masing-masing baris. String berikut diakhiri oleh akhir baris dan byte null :

a_long_string db “This is a long string, that” db “clearly is going to take”

db “several lines to store in an”

db “assembly language program”, 0Dh, 0Ah, 0

Assembler dapat menghitung panjang string secara otomatis. Dengan menggunakan karakter $ yang menyimpan lokasi sekarang nilai counter. Pada contoh berikut a_string_len diset awal 16 :

a_string db “This is a string” a_string_len db $- a_string

Define Word (DW)

Perintah DW membuat tempat penyimpan untuk satu atau lebih word 16-bit. Sintaknya adalah sebagai berikut

[name] DW initialvalue [, initialvalue] …

Initialvalue mungin berupa nilai bilangan 16-bit dari 0 – 65,535 (FFFFh). Jika

initialvalue bertanda, range yang dapat diterima adalah dari –32,768 (8000h) sampai +32,767 (7FFFh). Konstanta karakter mungkin disimpan pada bagian bawah word. Kontanta string yang besar yang mungkin disimpan dalam word panjangnya 2 karakter, seperti ‘AB’. Mungkin juga membiarkan variabel tidak terinisiaslisasi dengan menggunakan operator (?).

Pembalikan Format Penyimapan (Reversed Storage Format). Assembler

membalik byte dalam nilai word ketiak disimpan dalam memori. Byte paling bawah berada pada alamat paling bawah. Ketika variabel dipindahkan ke register 16-bit, CPU akan membalik kembali byte tersebut. Ini ditunjukan pada ilustrasi berikut, dimana 2AB6h disimpan dalam memori sebagai B6 2A.

Deklarasi data : value1 dw 2AB6h

(38)

Berikut ini tambahan contoh untuk DW. Seperti pada DB, tanda tanya memerintahkan assembeler untuk tidak menginisialisasi loakasi memori dengan nilai tertentu :

dw 1, 2, 3 ; mendefinisikan 3 word

dw 0,65535 ; bilangan tidak bertanda tertendah dan tertinggi dw –32768, +32767 ; bilangan bertanda terendah dan tertinggi dw 256*2 ; ekspresi kontanta

dw 4000h ; notasi heksadesimal dw 1111000011110000b ; notasi biner

dw 1000h, 4096, ‘AB’, 0 ; notasi campuran

dw ? ; word tunggal tidak diinsialisasi

Pointer. Offset variabel atau subrutin mungkin disimpan dalam variabel lain yang

disebut pointer. Pada contoh berikut, assembler menset P ke offest list. Kemudian PI mengandung alamat P. Akhirnya, aProc mengandung offset label yang disebut Clear_screen : list dw 256, 257, 258, 259 P dw list P2 dw P aProc dw clear_screen Define Doubleword (DD)

Perintah DD membuat tempat penyimpan untuk satu atau lebih doublewords 32-bit. Sintaknya sebagai berikut :

[name] DD initialvalue [, initialvalue] …

Initialvalue dapat berupa nomor biner sampai 0FFFFFFFFh, alamat segmet-offset,

4-byte bilangan real, atau bilangan real desimal. Byte-4-byter dalam variabel doubleword disimpan dengan urutan terbalik, sehingga digit yang paling berarti disimpan pada alamat paling bawah. Contoh, nilai 12345678h akan disimpan dalam memori sebagai :

Offset : 00 01 02 03 Nilai : 78 56 34 12

Anda dapat mendefinisikan satu atau leibh doubleword. Dalam contoh berikut, far_pointer1 tidak diinsialisasi. Assembler langsung menginisialisasi far_pointer2 dengan 32-bit alamat segment offset subroutine1 :

(39)

signed_val dd -2147483648

far_pointer1 dd ?

far_pointer2 dd subroutine1

Operator DUP

Operator DUP hanya tampil sessudah perintah pengalokasian memori (DB, DW, DD, DQ, DT). Dengan DUP, anda dapat mengulang satu atau lebih nilai ketika mengalokasian memori. Ini khususnya berguna ketika pengalokasian ruang untuk tabel atau array. Contoh-contoh berikut menginisialisasi tempat penyimpan dengan nilai default :

db 20 dup (0) ; 20 byte semuanya sama dengan nol db 20 dup (?) ; 20 byte tidak diinisialisasi

db 4 dup (‘ABC’) ; 12 byte : “ABCABCABCABC” db 4096 dup (0) ; 4096-byte , semuanya nol

dw 5 dup (1000h) ; 5 word, masing-masing sama dengan nol dw 5 dup (?) ; 5 word, tidak diinisialisasi

dd 100h dup(?) ; 256 doublewordk (1024 byte)

Operator DUP mungkin juga bersarang. Contoh pertama yang membuat tempat penyimpan yang mengandung 000XX000XX000XX000XX. Contoh kedua membuat tabel word dua dimensi dengan 3 baris dan 4 kolom.

aTable db 4 dup ( 3 dup(0), 2 dup(‘X’)) aMatrix dw 3 dup (4 dup(0))

Pemeriksaan tipe. Ketika variabel dibuat dengan menggunakan DB, DW, DD atau

perintah definisi data yang lain, assembler memberinya atribut asal (byte, word, doubleword) berdasarkan ukurnya. Tipe ini dicek ketika anda merujuk pada variabel tersebut, dan akan terjadi kesalahan jika tipenya tidak sesuai. Contohnya, anda ingin memindahkan byte paling rendah varibel 16-bit ke dalam register 8-bit. Instruksi MOV berikut akan salah karena count bertipe word dan AL adalah byte :

mov al, count ; error : ukuran operand harus cocok …

….

count dw 20h

Pemeriksaan tipe seperti itu bagus karena membantu untuk menghindari kesalahan logika. Jika diperlukan anda dapat menggunakan perintah LABEL untuk membuat nama baru (dan tipe data) pada alamat yang sama. Sekarang variabel dapat diakses menggunakan nama juga :

(40)

mov al, count_low mov cx, count …

count_low label byte count dw 20h

3.2. Instruksi Transfer Data Instruksi MOV

Karena MOV menyalin data dari satu operand ke operand lain, maka ini disebut instruksi transfer data. Pada prosesor 8086 dan 80286, operandnya 8 atau 16 bit. Pada 80386 dan 80486, operand 32-bit juga mungkin digunakan. Sintaknya sebagai berikut :

MOV tujuan, sumber

Data benar-benar disalin sehingga operand sumber tidak berubah. Sumber mungkin berupa nilai, register, atau operand memori. Tujuan mungkin berupa nilai, register atau operand memori. Tujuan mungkin berupa register atau operand memori. Operand Register. Pemindahan hanya melibatkan register, ini paling efisien. Satu register berperan sebagai operand sumber, dan yang lainya, selain CS dan IP berperan sebagai operand tujuan.

Operand immediate. Nilai langsung (konstanta integer) mungkin dipindahkan ke suatu register (kecuali register segemen atau IP) dan mungkin dipindahkan ke memori. Kesalahan umum disebabkan nilai lebih besar daripada operand tujuan. Operand langsung. Variabel mungkin salah satu (tapi tidak keduanya) operand dalam instruksi MOV. Isi variabel mungkin sumber atau tujuan move.

Contoh MOV dengan semua tiga tipe seperti berikut : mov al, bl

mov dx, cx mov bl, 1 mov bx, 8FE2h mov al, count mov total, ax mov total, 1000h … … count db 10 total dw 0

(41)

Operand mempunyai sedikit keterbatasan, yang berdasarkan rancangan fisik pemroses dan set instruksinya. Berikut ini tidak diperbolehkan :

- CS atau IP sebagai register tujuan

- Memindahkan data immediate ke register segmen - Memindahkan dari register segmen ke register segmen - Perbedaan ukuran antara operand sumber dan tujuan - Nilai immediate sebagai tujuan

- Perpinadahan dari memori ke memori Contoh pemindahan yang tidak diperbolehkan :

mov ip, ax ; ip sebagai tujuan mov ds, 1000h ; immediate ke segmen mov ds, es ; segmen ke segmen mov al, bx ; ukuran operan tidak sama mov si, al ; ukuran operan tidak sama mov word_1, al ; ukuran operan tidak sama mov 1000h, ax ; immediate sebagai tujuan mov word_2, word_1 ; memori ke memori …

word_1 dw 1000h

word_2 dw 0

Offset

Anda dapat menambahkan offset pada operand memori. Dengan ini maka anda dapat mengakses nilai data yang tidak mempunyai label. Misalkan kita punya daftar nomor 8-bit yang disebut array. Kemudian array+1 adalah nama yang mengacu pada offset 1 byte lebih dari array. Keduanya, array dan array+1 mempunyai offset yang dihitung oleh assembler sebagai offset fixed dari permulaan segemen data. Alamat-alamat tersebut digunakan untuk mengakses memori pada offset yang diberikan, seperti contoh berikut :

. data

array db 10, 20, 30, 40, 50

. code

mov al, array ; isi = 10 mov dl, array+1 ; isi = 20 mov dh, array+4 ; isi = 50

Ukuran atribut kedua operand harus sesuai. Dalam contoh berikut, int_1 hanya dapat dipasangkan dengan register 16-bit. Juga, byte_1 hanya dapat dipasangkan dengan register 8-bit :

(42)

. data

int_1 dw 1000h byte_1 db 10h

. code

mov ax, int_1 mov int_1, si mov al, byte_1 mov byte_1, dl

Operator PTR. Biasanya kita menggunakan operator PTR untuk mengetahui tipe operand. Nama PTR tidak benar kalau dimaksudkan penggunaan pointer – ini bernar-benar mengidentifikasikan atribut operand memori. Pada contoh berikut, WORD PTR mengidentifikasikan count sebagai variabel berukuran word, dimana BYTE PTR mengidentifikasikan var2 sebagai operand 8-bit.

mov word ptr count, 10 mov byte ptr var2, 5

Perintah XCHG

Perintah XCHG menukarkan isi dari dua register atau antara register dengan variabel. Sintaknya sebagai berikut :

XCHG op1, op2

Dua operand mungkin register atau operand memori, selama satu operandnya register.

XCHG adalah cara yang efisien untuk menukarkan dua operand 8-bit atau 16-bit karena tidak memerlukan register ketiga untuk menyimpan nilai sementara. Khususnya dalam aplikasi pengurutan, instruksi ini mempunyai keuntungan karena kecepatannya. Satu atau kedua operand mungkin register, atau register mungkin dikombinasikan denan operand memori. Dua operand memori tidak boleh digunakan secara bersamaan. Contoh berikut adalah contoh yang benar :

xchg ax, bx

xchg ah, al

xchg var1, bx

Operasi stack

Stack adalah buffer memori khusus yug digunakan untuk program aplikasi dan DOS. Dua register berperan dalam stack : register SS (stack segment) mengandung lokasi basis stack; register SP (stack pointer) mengandung alamat puncak stack, dimana nilai terakhir dimasukan.

Beberapa istilah yang terdapat pada stack : operasi PUSH adalah meletakan nilai baru pada stack dan mengurangi nilai stack pointer; stack bergerak kearah bawah

(43)

dalam memori setiap nilai baru dimasukan. Operai POP mengeluarkan data dari stack dengan menyalin words kedalam register atau operand memori dan menambah nilai stack pointer. Setiap inputan stack panjangnya 2 byte, jadi hanya operand 16-bit yang mungkin dimasukan atau dikeluarkan.

DOS membagi stack dengan program aplikasi, jadi ruang memori yang cukup harus disiapkan untuk menyediakan keduanya. Biasanya kita menggunakan 256 byte, menggunakan perintah .STACK.

Instruksi PUSH. Instruksi PUSH mengurangi register SP dan menyalin isi register

atau operand memori 16-bit kedalam stack pada lokasi yang ditunjuk oleh SP. Hanya pada prosesor 80286 atau yang lebih tinggi anda dapat memasukan nilai immediate. Berikut ini contoh penggunaanya :

push ax

push memval

push 1000h

Instruksi PUSH bisa digunakan untuk menyimpan nilai register sementara, untuk suatu saat diambil kembali.

Instruksi POP. Instruksi POP menyalin isi stack yang ditunjukan oleh SP ke dalam

register 16-bit atau variabel, dan menambah SP. Dua register, CS dan IP, tidak boleh digunakan sebagai operand. Contoh POP seperti terlihat dibawah ini.

pop cx

pop memval

Menyiman dan mengambil kembali nilai register. Berbagai cara bisa dilakukan jika

sebuah register akan digunakan ulang. Pada contoh berikut, pemanggilan DOS (int 21h) untuk menampilkan string pada layar. DX dan AX diasumsikan mempunyai nilai penting yang harus disimpan kembali sesudah tampilan. Karena stack berstruktur LIFO (last in first out) maka register yang terakhir disimpan pertama kali :

push ax push dx mov ah, 9

mov dx offset message int 21h

pop dx

pop ax

(44)

PUSHF dan POPF. Instruksi PSUHF memasukan register flag ke dalam stack,

menjaganya agar tidak terjadi perubahan. Pada lain waktu, instruksi POPF dapat digunakan untuk mengembalikan nilai flag. Contoh berikut, kita menyimpan flag sebelum memanggil subrutin yang mungkin mengubah flag.

3.3. Instruksi Aritmetik

Hampir semua program komputer dapat melaksanaklan operasi aritmetik. Set intruksi Intel mempunyai instruksi untuk aritmetik integer, menggunakan operand 8-bit dan 16-8-bit. Operasi floating-point ditangani dalam salah satu dari ketiga cara berikut : 1. Chip koprosesor matematika khusus (8087, 80287, 80387). 2. Rutin perangkat lunak yang berfungsi sama dengan koprosesor, atau 3. Perangkat lunak yang mengkonversi nilai floating-point ke integer, menghitung, dan kemudian mengkonversi bilangan kembali ke floating-point.

Instruksi INC dan DEC

Instruksi INC dan DEC menambah 1 atau mengurang 1 nilai dari suatu operand, secara berurutan. Sintaknya sebagai berikut :

INC tujuan

DEC tujuan

Tujuan mungkin register 8-bit atau 16-bit atau operand memori. INC dan DEC lebih cepat dari instruksi ADD dan SUB. Semua status flag dipengaruhi kecuali flag Carry. Contohnya sebagai berikut :

inc al

dec bx

inc membyte

dec byte ptr membyte

dec memword

inc word ptr memword

Instruksi ADD

Instruksi ADD menjumlahkan operand sumber 8 atau 16-bit ke operand tujuan pada ukuran yang sama. Sintaknya sebagai berikut :

ADD tujuan, sumber

Sumber tidak diubah oleh operasi. Ukuran operand harus sesuai dan hanya satu operand memori yang digunakan. Register segment tidak boleh jadi tujuan. Semua status flag dipengaruhi. Contoh sebagai berikut :

add al, 1 add cl, al

Gambar

Tabel berikut menunjukan nilai maksimum dan minimum untuk byte, word dan  double word bertanda :
Gambar 1.2. Kumpulan karakter assembly
Gambar 2.1. Komputer IBM-386
Gambar 2.2. Rancangan CPU sederhana
+7

Referensi

Dokumen terkait

“buffer” untuk pengentasan kemiskinan dan pengangguran. Sayangnya, berbagai penelitian sebelumnya menjelaskan bahwa keberadaan usaha jenis ini selain fungsi dan perannya sangat

Sebagai bagian dari hasil survai pendasaran Proyek Peningkatan Pendapatan Petani Miskin melaui Inovasi (P4MI) di Kabupaten Lombok Timur, Provinsi Nusa Tenggara Barat, tulisan

Gerbong datar untuk barang umum, digunakan untuk barang-barang yang tahan terhadap cuaca, tidak perlu dilindungi terhadap cuaca, seperti mengangkut alat transportasi seperti

[r]

Karyadi Kusliansjah, MT., IAI Arsitektur Bersaing Prospek Arsitektur Kota Tepi Air Kalimantan - Kasus: Kota-kota Sungai Ibu Kota Propinsi Kalimantan Tengah, Kalimantan

Teknik Industri Hibah Fundamental Pengembangan Teori Desain Partisipatif untuk Lansia Indonesia Sebagai Upaya Peningkatan Kualitas Hidup di Usia Lanjut Melalui Desain Ruang Hidup

bahwa sesuai dengan ketentuan Pasal 2 ayat (1) Peraturan Pemerintah Nomor 12 Tahun 1969, penyertaan modal Negara Republik Indonesia dalam rangka pendirian suatu Perusahaan

Pemerintah provinsi dan kabupaten/kota menyelenggarakan perpustakaan umum daerah yang dalam pengembangan koleksinya wajib menyimpan bahan perpustakaan berupa karya tulis,