MODE PENGALAMATAN
MODE PENGALAMATAN
1.
Immediate Addressing (Pengalamatan Segera)
Suatu proses penyalinan data yang
berukuran byte atau word langsung ke dalam register tujuan. Data yang dimaksud
di sini adalah suatu nilai atau bilangan tertentu atau bisa juga berupa sebuah
konstanta (didefinisikan dengan instruksi EQU). Perlu dicatat bahwa data segera
merupakan data konstan, sedangkan data yang dipindahkan dari register adalah
data berubah (variable).
Contoh :
MOV
AL,11h
menyalin bilangan 11h ke dalam register AL
MOV
AX,1234h
menyalin 1234h ke dalam register AX
A EQU
25h
mendefinisikan konstanta A
MOV
AX,A
menyalin 25h ke dalam register AX
Huruf ‘h’ ditambahkan dibelakang
bilangan untuk menunjukkan bahwa itu adalah bilangan heksadesimal (bedakan
dengan penulisan angka di debug). Ketika bilangan heksadesimal dimulai dengan
suatu huruf, assembler memerlukan data yang dimulai dengan angka ‘0’, jika
tidak (diberi angka ‘0’) maka assembler akan menganggap bilangan tersebut
sebagai variable, jadi kompiler akan mengeluarkan pesan kesalahan.
Contoh :
MOV
AX,FFh
contoh yang salah
MOV
AX,0FFh
ini yang benar
Untuk karakter atau kode – kode
ASCII dapat direpresentasikan dalam bentuk immediate jika data ASCII ditutup
dengan tanda apostrof (‘).
Contoh :
MOV
AL,’A’
menyalin huruf ‘A’ (41h) ke dalam register AL
Yang terlarang dalam mode
pengalamatan segera adalah memberikan nilai untuk segmen register (SS, CS, DS,
ES). Untuk memecahkan hal ini, kita bisa menggunakan register general purpose
(AX, BX, CX, DX) sebagai perantara.
Contoh :
MOV
ES,0FFh
salah, yang benar ada 2 langkah di bawah ini
MOV
AX,0FFh
disalin ke AX dulu
MOV
ES,AX
baru kemudian disalin ke ES
2.
Direct Addressing (Pengalamatan Langsung)
Suatu proses penyalinan data pada
register dan suatu alamat efektif (Effective Address, Alamat ini disimpan pada
byte berikut setelah opcode instruksi).
Contoh :
MOV
AX,[100h]
menyalin data pada alamat 100h ke AX
A DB
89h
mendefinisikan variable A
.
.
MOV
AL,A
direct addressing
Sebenarnya huruf ‘A’ di atas lebih
tepat disebut lokasi memori yang memiliki offset A, yaitu 89h, pada segmen data
(DS). Jadi ‘A’ di sini bisa dibilang sama dengan sebuah nama variable pada
bahasa pemrograman tingkat tinggi (C, C++, Pascal, Basic, dsb), hanya untuk
memudahkan dalam pemahaman. Penyalinan data langsung antarmemori tidak
diijinkan. Untuk memecahkan hal ini, kita bisa menggunakan register general
purpose sebagai perantara.
Contoh :
A DB 10h
B DB
?
definisi variable B, nilai ditentukan / diisi kemudian
.
.
MOV B,A
salah, harusnya dengan perantara sebagai berikut ..
MOV
AX,A
direct addressing
MOV
B,AX
register addressing
3.
Register Direct Addressing
Suatu proses penyalinan data (bisa
byte atau word) dari register ke register atau ke suatu lokasi memori. Proses
tersebut harus menggunakan dua buah operand yang berukuran sama, misalnya AX
dan BX, AL dan BH (tapi ada beberapa instruksi tertentu yang dikecualikan,
misalnya : SHL DX,CL
Contoh :
MOV
AX,BX
untuk operasi 16 bit data (word)
MOV
AL,BL
untuk operasi 8 bit data (byte)
Perlu diwaspadai bahwa ada beberapa
penyalinan data yang terlarang pada pengalamatan ini. Misalnya instruksi MOV
pada register segmen ke register segmen (SS, CS, DS, ES). Untuk memecahkan hal
ini, kita bisa menggunakan register general purpose (AX, BX, CX, DX) sebagai
perantara.
Contoh :
MOV ES,DS
salah, yang benar ada 2 langkah di
bawah ini :
MOV
AX,DS
disalin dulu ke AX
MOV
ES,AX
baru kemudian disalin ke ES
Selain dengan cara di atas, kita
juga bisa menggunakan stack sebagai perantara.
Contoh :
PUSH
DS
PUSH (masukkan) nilai DS ke dalam stack
POP
ES
POP (keluarkan) nilai dari dalam stack ke ES
Perhatikan juga bahwa register
segmen kode (CS) tidak mungkin diubah oleh instruksi MOV, karena alamat
instruksi berikutnya sudah ditentukan oleh IP dan CS (ingat pasangan CS:IP).
Jika hanya CS yang diubah, maka alamat instruksi berikutnya tidak dapat
diprediksi. Oleh karena itu, pengubahan register CS dengan instruksi MOV tidak
diijinkan. Register Addressing dapat juga hanya terdiri atas sebuah register
seperti pada perintah INC CX.
4.
Register Indirect Addressing
Register indirect addressing ini
hampir sama dengan direct addressing, bedanya hanya alamat efektif dari operand
tidak disimpan di byte berikut setelah opcode instruksi, tetapi disimpan pada
salah satu dari register indeks atau register basis, yaitu BX,BP,SI atau DI.
Register Indirect Addressing biasanya digunakan untuk mengakses suatu data yang
banyak (misalnya sebuah array atau string) dengan mengambil alamat efektif dari
data tersebut. Untuk mendapatkan alamat efektif dari suatu data bisa digunakan
perintah LEA (Load Effective Addres) dengan syntax : LEA Register,Data
Untuk mengakses data yang
ditunjukkan oleh Register, setelah didapatkannya alamat efektif harus digunakan
tanda kurung siku (‘[]‘). Jika pada perintah pengaksesannya tidak disebutkan
segmennya, maka yang digunakan adalah segment default. Seperti bila digunakan
register BX, DI, atau SI sebagai penunjuk offset, maka segment DS yang
digunakan. Sedangkan bila digunakan register BP sebagai penunjuk offset, maka
segment SS yang digunakan.
Contoh :
MOV AX,[BX]
menyalin isi dari lokasi memori yang
offsetnya disimpan di dalam register BX (16 bit) pada segmen data (DS) ke
register AX. Misalnya BX = 1000h, ketika instruksi di atas dilakukan, isi dari
DS (yang berukuran word) pada alamat offset 1000h disalin ke dalam register AX.
Perhatikan bahwa isi dari 1000h disalin ke AL dan isi dari 1001h disalin ke AH.
LEA SI,String muat offset String
(String adalah variable yang berisi kumpulan karakter / string) MOV AL,[SI]
menyalin isi dari lokasi memori yang offsetnya disimpan di dalam register SI (8
bit) pada segmen data (DS) ke register AL
Pada direct addressing di atas sudah
dikatakan bahwa tidak diijinkan menyalin data langsung antarmemori. Hal
tersebut juga berlaku pada Register indirect addressing.
Contoh :
MOV [DI],[BX]
salah, menyalin dari memori ke
memori tidak diijinkan, kecuali dengan instruksi string.
Pada beberapa kasus, pengalamatan
tidak langsung memerlukan ukuran data khusus yang ditetapkan dengan direktif
assembler khusus BYTE PTR, WORD PTR, atau DWORD PTR. Direktif ini menunjukkan
ukuran data memori yang dialamatkan oleh penunjuk memori (PTR).
Contoh:
MOV AL,[DI]
jelas merupakan instruksi penyalinan
data berukuran byte (tandanya memakai register AL sebagai tujuannya).
MOV [DI],10h
salah, karena instruksi ini tidak
jelas, apakah mengalamatkan lokasi memori yang berukuran byte, word, atau dword
. Assembler tidak menentukan ukuran 10h tersebut. Yang benar seperti contoh
berikut.
MOV BYTE PTR [DI],10h
jelas menentukan lokasi yang
dialamatkan oleh DI sebagai lokasi memori yang berukuran byte.
5.
Indirect Addressing
Merupakan mode pengalamatan tak langsung. Field alamat mengacu pada alamat
word di dalam memori, yang pada gilirannya akan berisi alamat operand yang
panjang atau untuk mentransfer DATA/byte/word antar register dan lokasi yang
alamatnya ditunjukkan oleh isi suatu register.
Contoh
AX Þ Pindahkan isi register AX ke dalam alamat memori yang ditunjukkan oleh isi
register BX
Contoh
ADD (A) Þ tambahkan isi memori yang
ditunjuk oleh isi alamat A ke akumulator Keuntungan yang diperoleh adalah ruang
bagi alamat menjadi besar sehingga semakin banyak alamat yang dapat referensi.
Sedangkan kerugiannya adalah diperlukan referensi memori ganda dalam satu fetch
sehingga memperlambat proses operasi.
6.
Displacement Addressing
Merupakan mode pengalamatan yang
menggabungkan kemampuan pengalamatan langsung dan pengalamatan register tidak
langsung (Register Indirect Addressing). Metode ini mensyaratkan intruksi
memiliki dua buah field alamat, sedikitnya sebuah field yang eksplisit (field
eksplisit bernilai A dan field implisit mengarah pada register).
Operand berada pada alamat A
ditambah isi register.
Tiga model displacement:
a.
Relative Addressing
Register yang direferensi secara
implisit adalah program counter (PC). Alamat efektif didapatkan dari alamat
instruksi saat itu ditambahkan ke field alamat. Memanfaatkan konsep lokalitas
memori untuk menyediakan operand-operand berikutnya.
b.
Base Register Addressing
Register yang direferensikan berisi
sebuah alamat memori, dan field alamat berisi perpindahan dari alamat itu.
Referensi register dapat eksplisit maupun implisit. Memanfaatkan konsep
lokalitas memori.
c.
Indexing
Indexing adalah field alamat
mereferensi alamat memori utama, dan register yang direferensikan berisi
pemindahan positif dari alamat tersebut. Merupakan kebalikan dari model base
register. Field alamat dianggap sebagai alamat memori dalam indexing. Manfaat
penting dari indexing adalah untuk eksekusi program-program iteratif.
7.
Stack Addressing
Stack adalah array lokasi yang
linier, yang merupakan blok lokasi yang terbalik (butir ditambahkan ke puncak
stack sehingga setiap saat blok akan terisi secara parsial)
Yang berkaitan dengan stack adalah
pointer yang nilainya merupakan alamat bagian paling atas stack. Dua elemen
teratas stack dapat berada di dalam register CPU, yang dalam hal ini stack
pointer mereferensi ke elemen ketiga stack. Stack pointer tetap berada di dalam
register. Dengan demikian, referensi-referensi ke lokasi stack di dalam memori
pada dasarna merupakan pengalamatan register tidak langsung.