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
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
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
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
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
.
MOV B,A
salah,
harusnya dengan perantara sebagai berikut ..
MOV AX,A direct
addressing
MOV B,AX register 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)
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
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
MOV
[BX], 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.
Sign up here with your email
ConversionConversion EmoticonEmoticon