Tutorial Addressing pada Mikroprosesor x86
Pendahuluan
Pada tutorial sebelumnya, kita telah mempelajari bagaimana siklus instruksi (yang disederhanakan pada 4 tahap: Fetch Instruction, Decode Instruction, Execute dan Write Output) menggunakan simulator PEP7. Tutorial kali ini kita akan menggunakan program Debug (bawaan MS Windows XP atau Win 7)
untuk menjelaskan mode pengalamatan beserta contoh studi kasus.
Mode Pengalamatan
Ada beberapa mode pengalamatan pada CPU antara lain:
- Immediate Addressing
- Direct Addressing
- Register Addressing
- Indirect Addressing
Immediate Addressing
Adalah sebuah bentuk pengalamatan paling sederhana. Tidak ada referensi kemana-mana. Operand (data yang akan diolah) benar-benar ada dalam instruksinya. Keuntungan dari mode pengalamatan ini adalah Menghemat siklus instruksi sehingga proses keseluruhan menjadi cepat (karena tidak memerlukan referensi memori). Contoh mode pengalamatan immediate adalah:
MOV ax, 200h.
Keterangan:
Kita akan "memasukkan" data 200h (hexa) ke register AX, sehingga AX akan berisi data 0200.
Direct Addressing
Adalah sebuah mode pengalamatan sederhana karena hanya memerlukan satu referensi memory sebagai operandnya. Artinya operand (data yang akan diolah) diletakkan di memory sehingga lebih besar dari operand yang "hanya" tertulis di instruksinya. Contoh mode pengalamatan langsung (direct addressing) adalah sebagai berikut:
MOV ax,[200h]
Keterangan:
Kita akan "memasukkan" data yang berada di memori alamat 200h ke dalam register AX. Ingat.. yang kita masukkan adalah data yang berada di alamat 200h dan bukan angka 200h.
Register Addressing.
Adalah sebuah bentuk "pengcopyan" isi register ke register yang lain. Contoh pengalamatan register adalah sebagai berikut:
MOV ax,bx
Keterangan:
Kita akan memasukkan (mengcopy) isi dari register BX ke dalam register AX.
Indirect Addressing.
Adalah sebuah mode pengalamatan yang memerlukan lebih dari satu referensi (baik memory atau register) untuk mengambil operand-nya.
Contoh mode pengalamatan tidak langsung adalah:
MOV [bx],ax
Keterangan:
Kita akan memasukkan nilai yang berada di dalam alamat memory yang ditunjukkan pada register BX. Jadi kita harus melihat dulu berapa nilai BX (misal 200h) kemudian kita harus menengok isi memory di alamat 200h tersebut baru kita pindahkan isinya ke register AX.
Dasar Arsitektur Prosesor x86.
Sebelum kita masuk pada implementasi mode pengalamatan pada arsitektur x86 menggunakan program DEBUG, ada baiknya kita mengenal terlebih dulu register pada prosesor x86.
CPU dengan Prosesor x86 memiliki beberapa register yaitu:
16 bit General Purpose Registers. Register yang biasanya digunakan untuk keperluan-keperluan khusus. Akan dibahas pada tutorial berikutnya.
AX, BX, CX, dan DX yang di-breakdown menjadi 8 bit AH, AL, BH, BL, CH, CL, DH, dan DL.
Segment registers. Biasanya digunakan untuk instruksi-instruksi spesial atau multi-segmen programming.
CS DS ES FS GS SS
Index and pointers. Biasanya digunakan bersamaan dengan segmen register untuk menunjuk pada alamat yang lebar (diatas 1MB)
SI, DI, BP, IP, dan SP
AX, BX, CX, dan DX yang di-breakdown menjadi 8 bit AH, AL, BH, BL, CH, CL, DH, dan DL.
Segment registers. Biasanya digunakan untuk instruksi-instruksi spesial atau multi-segmen programming.
CS DS ES FS GS SS
Index and pointers. Biasanya digunakan bersamaan dengan segmen register untuk menunjuk pada alamat yang lebar (diatas 1MB)
SI, DI, BP, IP, dan SP
Keterangan lebih lengkap, dapat dibaca disini.
Implementasi:
1.Menjalankan program DEBUG
Sekarang kita akan mencoba mempelajari 4 mode pengalamatan di atas menggunakan program DEBUG. Untuk menjalankan program debug, kita tidak perlu menginstall secara khusus. Cukup buka start -> Run -> cmd kemudian ketik debug dan kita akan menjumpai prompt debug (biasanya cuma sebuah garis kecil)
2. Melihat perintah-perintah dalam program DEBUG
Untuk melihat perintah apa saja yang bisa kita gunakan dalam program debug, ketik tanda tanya (?) hingga muncul tampilan:
Pada tutorial ini, saya hanya akan menggunakan perintah a (assemble), d (dump), r (register) dan t (trace).
3. Melihat isi register awal
Sebelum kita mencoba macam-macam, kita lihat dulu isi data awal di setiap register. Ketik r kemudian enter.
Dari gambar di atas, kita bisa melihat isi register general purpose (ax, bx, cx dan dx) semua berisi 0000h sedangkan IP (pointer instruksi) berada pada alamat 0100h yang berarti instruksi berikutnya yang akan diproses ada di alamat 100h.
4. Membuat program untuk Immediate Addressing:
- Seperti telah dijelaskan di atas, contoh immediate addressing adalah mov ax, 200
- Ketik a cs:100 (assemble code segment 100) yang berarti kita akan menulis instruksi di alamat 100h (sesuai alamat Instruction Pointer).
- Untuk mengakhiri penulisan kode program, cukup enter saja.
- Untuk menjalankan program yang telah kita buat, ketik t (trace) seperti terlihat pada gambar di bawan ini
- Dari output di atas, dapat kita lihat bahwa register ax telah berisi data 0200.
5. Membuat program untuk Direct Addressing
- Seperti telah dijelaskan di atas, contoh Direct Addressing adalah mov ax, [200]
- Seperti biasa, cek terlebih dulu isi register menggunakan r. Saya mereset seluruh isi register hanya untuk memudahkan tutorial ini saja.
- Ketik kode dibawah ini:
- Sebelum kita menjalankan program ini, kita cek terlebih dulu isi operand di alamat 200 menggunakan perintah d ds:200 (dump data segment 200).
- Dari perintah dump di atas, kita dapat melihat bahwa isi dari alamat 200 adalah 81 CD. Data inilah yang nanti akan kita masukkan ke register ax.
- Jalankan listing (instruksi) yang telah kita ketik tadi dengan t (trace)
- Dari output di atas kita bisa melihat sekarang isi register ax adalah CD81. Ingat posisinya LSB (least significant bit) adalah bit kanan dan MSB (most significant bit) di bit kiri.
- Contoh register addressing adalah pen-copy-an data antar register. Misalnya mov bx, ax
- Dengan menggunakan contoh sebelumnya dimana register ax telah berisi data CD81h akan kita copy ke register bx.
- IP (instruction pointer) berada di alamat 103h yang berarti kita bisa menuliskan program di alamat tersebut.
- Berikut contohnya:
- Dari output di atas, kita bisa melihat bahwa register BX nilainya sama dengan register AX yaitu CD81h
- Terakhir (untuk tutorial ini), kita akan mencoba mode pengalamatan tidak langsung
- Contoh mode pengalamatan tidak langsung, kita akan memindahkan isi register AX ke memori yang alamatnya ditunjuk oleh isi register BX
- Perintahnya adalah mov [bx],ax
- Pertama, kita masukkan dulu nilai ABCDh di register AX
- Kedua, kita masukkan nilai BBBBh pada register BX
- Ketiga, kita lihat isi memori di alamat BBBBh
- Keempat kita eksekusi
- Berikut langkah lengkapnya:
Selamat mencoba..
smangat mas jatii..!! maju terus...
the best dosen in universe... :)
wkwk.. Lebay sekali. Nggak sedunia akherat sekalian Toro. He3x.