LightBlog

II.1 MODE PENGALAMATAN PROGRAM MEMORI Mode pengalamatan program memori menggunakan instruksi JMP dan CALL, terdiri dari tiga bentuk yan...

pengalamatan program memori

II.1 MODE PENGALAMATAN PROGRAM MEMORI

Mode pengalamatan program memori menggunakan instruksi JMP dan CALL, terdiri dari tiga bentuk yang berbeda: langsung, relatif, dan tak langsung. Bagian ini mengenalkan tiga bentuk pengalamatan di atas dengan menggunakan instruksi JMP untuk mengilustrikan operasinya.

Pengalamatan Program Memori Langsung

Pengalamatan program memori langsung adalah pengalamatan yang digunakan mikriprosesor pertama untuk semua lompatan (jump) dan panggilan (call). Pengalamatan program memori langsung juga digunakan dalam bahasa tingkat tinggi seperti bahasa BASIC dengan instruksi GOTO dan GOSUB. Mikroprosesor menggunakan bentuk pengalamatan ini, tetapi tidak sesering penggunaan pengalamatan program memori relatif dan tidak langsung.
Instruksi untuk pengalamatan program memori langsung menyimpan alamat dengan opcode. Sebagai contoh, jika program melompat ke lokasi memori 10000H untuk instruksi berikutnya, alamat (10000H) disimpan mengikuti opcode dalam memori. Gambar 3-14 menunjukkan instruksi intersegmen langsung JMP dan empat byte yang digunakan untuk menyimpan alamat 10000H. Instruksi JMP ini mengisi CS dengan 1000H dan IP dengan 0000H agar dapat melompat ke lokasi memori 10000H untuk instruksi berikutnya. (Lompatan intersegmen adalah lompatan ke setiap lokasi memori dalam seluruh sistem memori). Lompatan langsung sering disebut far jump (lompatan jauh) karena lompatan tersebut dapat melompat ke setiap lokasi memori untuk melaksanakan instruksi berikutnya. Pada mode riil, far jump dapat mengakses setiap lokasi dalam memori 1 Mbyte pertama dengan mengubah CS dan IP. Pada mode operasi terproteksi, far jump mengakses sebuah deskriptor segmen kode baru dari tabel deskriptor sehingga memungkinkannya melompat ke setiap lokasi memori dalam seluruh alamat sepanjang 4 Gbyte pada mikroprosesor 80386 sampai pentium 4.
Instruksi lain yang menggunakan pengalamatanprogram langsung adalah instruksi intersegmen atau far CALL. Biasanya, nama sebuah alamat memori disebut label. Ketika menggunakan label dengan instruksi CALL atau JMP, sebagian besar assembler memilih bentuk yang paling tepat dari pengalamatan program.

Pengalamatan Program Memori Relatif

Pengalamatan program memori relatif tidak terdapat dalam mikroprosesor awal, melainkan pada keluarga mikroprosesor ini. Istilah relatif berarti “relatif terhadap pointer instruksi (IP)”. Sebagai contoh, jika instruksi JMP melompati memori dua byte berikutnya, alamat yang berhubungan dengan pointer instruksi adalah 2 ditambah pointer instruksi. Hasil penjumlahan tersebut menghasilkan alamat instruksi program selanjutnya. Sebuah instruksi JMP relatif ditunjukkan pada gamabr 3-15 . Perhatikan bahwa instruksi JMP adalah instruksi satu byte, dengan displacement satu byte atau dua byte yang menambah pointer instruksi. Displacement satu byte digunakan pada short jump, dan displacement dua byte digunakan untuk near jump dan call. Kedua jenis lompatan tersebut termasuk lompatan intersegmen. (lompatan intersegmen adalah lompatan di setiap tempat dalam suatu segmen kode). Pada 80386 ke atas, displacemen dapat mempunyai nilai 32-bit, sehingga mampu menggunakan pengalamatan relatif di setiap lokasi dalam 4Gbyte segmen kodenya.
Instruksi JMP dan CALL relatif berisi 8-bit atau 16-bit displacemen bertanda yang memungkinkan referensi memori maju (forward) dan referensi memori munder (reverse). (versi 80386 ke atas mempunyai displacemen 8-bit atau 32- bit). Semua assembler secara otomatis menghitung jarak untuk displacement dan memilih bentuk satu, dua, atau empat byte yang cocok. Jika jarak terlalu jauh untuk displacemen dua byte untuk mikroprosesor 8086 sampai 80286, beberapa assembler menggunakan lompatan langsung. Displacemen 8-bit (short) mempunyai jangkauan lompatan anatara +127 dan -128 byte dari instruksi berikutnya, sedangkan displacemen 16-bit (near) mempunyai jangkauan +/- 2Gbyte. Displacemne 32-bit hanya dapat digunakan dalam mode terproteksi. 



Pengalamatan Program Memori Tak Langsung

Mikroprosesor mengizinkan beberapa bentuk pengalamatan program memori tak langsung dengan instruksi JMP dan CALL. Table- 310 merupakan daftar beberapa instruksi lompatan program tak langsung yang diizinkan, yang dapat menggunakan register 16bit (AX, BX, CX, DX, SP, BP, DI, atau SI); register relatif ([BP],[BX], [DI],  atau [SI]);  dan  register  setiap  relatif  dengan  suatu  displacemen.  Pada  80386  ke  atas, extended register juga dapat digunakan untuk menyimpan alamat atau alamat tak langsung dari JMP dan CALL relatif. Sebagai contoh JMP EAX akan menyebabkan program melompat ke lokasi memori yang dialamati register EAX.

Gambar 3-15


Tabel


Jika register 16-bit  menyimpan  alamat  instruksi  JMP  maka  lompatannya  adalah  dekat  (near).  Sebagai contoh, jika register BX berisi 1000H dan instruksi JMP dieksekusi, mikroprosesor melompat ke alamat offset 1000H dalam segmen kode tersebut.
Jika reguster relatif menyimpan alamat maka lompatannya juga dianggap sebagai lompatan tak langsung. Sebagai contoh, JMP[BX] mengacu lokasi memori dalam segmen data pada alamat offset yang terdapat pada BX. Alamat offsetnya berupa angka 16-bit yang digunakan sebagai alamat offset dalam lompatan intersegmen. Tipe lompatan ini kadang-kadang disebut sebagai indirect-indirect atau double indirect-jump.
Gambar 3-16 menunjukkan sebuah tabel lompatan yang disimpan dalam memori, mulai dari lokasi memori TABEL. Tabel lompatan ini dirujuk oleh sebuah program pendek pada contoh 3-13.  Pada contoh ini, register BX diisi dengan 4 sehingga ketika instruksi JMP TABEL [BX] dikombinasikan dengan TABEL, alamat efektifnya adalah isi dari masukan ke dua dalam tabel lompatn.
Contoh 3-13
0000 BB 00004 MOV BX, 4 ; address loc2
0003 FF A7 23A1 R JMP TABEL[BX] ;jump to loc2

II.2 MODE PENGALAMATAN MEMORI STACK

Stack memainkan peranan penting dalam semua mikroprosesor. Stack menyimpan data sementara dan menyimpan alamat kembali untuk prosedur. Memori stack merupakan memori LIFO (last-in, first-out), yang menjelaskan bagaiman data disimpan dan diambil dari steck. Data disimpan dalam stack dengan instruksi PUSH dan diambi dengan instruksi POP. Instruksi POP juga menggunakan stack untuk menyimpan alamat kembali untuk prosedur dan instruksi RET(return) untuk memindahkan alamat kembali dari stack.
Memori stack diatur oleh dua register: stack pointer (SP) dan segmen stack (SS). Ketika sebuah word dimasukkan ke dalam stack [lihat gamabr 3-17(a)], 8-bit atas disimpan dalam lokasi yang dialamati SP-1. Adapun 8-bit bawah disimpan dalam lokasi yang dialamati SP-2. SP kemudian dikurangi 2 sehingga data word berikutnya disimpan dalam lokasi memori stack selanjutnya. Register SP/ESP selalu menunjukkan suatu area memori yang terletak dalam segmen stack. Pada memori riil, regster SP/ESP dijumlahkan dengan SS X 10H untuk membentuk alamat memori stack. Pada mode proteksi, register SS menyimpan selektor yang mengakases sebuah deskriptor untuk alamat basis segmen stack.



 Gambar 3-17 




Ketika data dikeluarkan dari stack [lihat gambar 3-17(b)], 8-bit bawah dipindahkan dari lokasi memori yang dialamati oleh SP. Adapun 8-bit atas dipindahkan dari lokasi yang dialamati oleh SP+1. Register SP kemudian dinaikkan 2.  Tabel 3-11  merupakan daftar instruksi PUSH dan POP yang terdapat dalam mikroprosesor. Perlu diketahui bahwa PUSH dan POP selalu menyimpan dan mengambil data word -bukan byte- pada mikroprosesor 8086 samapai 80286. Versi 80386 ke atas memungkinkan word atau double word ditransfer dari dan stack.Data dapat disimpan ke dalam stack dari setiap register 16-bit atau register segmen; dan  \pada 80386 ke atas dari extended register 32-bit. Data dapat dikeluarkan dari stack ke setiap register 16-bit atau setiap register segmen, keculai CS. Alasan data tidak boleh dikeluarakan dari stack ke CS adalah pengaruhnya yang akan mengubah bagan alamat instruksi berikutnya.


Tabel 3-11

Instruksi PUSHA dan POPA menyimpan (push) dan mengeluarkan (pop) semua register ke dalam stack, kecuali register segmen. Instruksi ini tidak terdapat pada mikroprosesor awal 8086/8088. Instruksi immediate push merupakan instruksi baru yang terdapat pada mikroprosesor 80286 sampai Pentium. Contoh pada tabel 3-11 menunjukkan cara mentransfer register dengan instruksi PUSHA dan POPA. Versi 80386 ke atas juga mengizinkan extended register untuk disimpan (push) dan dikeluarkan(pop).

Contoh 3-14 berisi daftar program  pendek yang menyimpan (push) isi AX, BX dan CX ke dalam stack. Instruksi POP pertama mengembalikan nilai yang disimpan  dalam stack dari CX dan menempatkannya dalam AX. Instruksi POP kedua menempatkan nilai asli BX ke dalam CX. Instruksi POP terakhir menempatkan nilai asli AX ke dalam BX.    

Brey, Barry B. 2005 Mikroprosesor Intel 8086/8088/80186/80286/80386/80486, Pentium, Pentium Pro Prosesor, Pentium II, Pentium III, Pentium 4. Penerbit ANDI Yogyakarta

0 komentar: