Perakitan - Mode Pengalamatan
Kebanyakan instruksi bahasa assembly membutuhkan operan untuk diproses. Alamat operan menyediakan lokasi, tempat penyimpanan data yang akan diproses. Beberapa instruksi tidak memerlukan operan, sedangkan beberapa instruksi lain mungkin memerlukan satu, dua, atau tiga operan.
Ketika sebuah instruksi membutuhkan dua operan, operan pertama umumnya adalah tujuan, yang berisi data dalam register atau lokasi memori dan operan kedua adalah sumbernya. Sumber berisi data yang akan dikirim (pengalamatan langsung) atau alamat (dalam register atau memori) dari data. Umumnya, data sumber tetap tidak berubah setelah operasi.
Tiga mode dasar pengalamatan adalah -
- Daftarkan pengalamatan
- Penanganan segera
- Pengalamatan memori
Register Addressing
Dalam mode pengalamatan ini, register berisi operan. Tergantung pada instruksinya, register mungkin operan pertama, operan kedua atau keduanya.
Sebagai contoh,
MOV DX, TAX_RATE ; Register in first operand
MOV COUNT, CX ; Register in second operand
MOV EAX, EBX ; Both the operands are in registers
Karena pemrosesan data antar register tidak melibatkan memori, ini menyediakan pemrosesan data tercepat.
Pengalamatan Segera
Operan langsung memiliki nilai konstan atau ekspresi. Ketika instruksi dengan dua operan menggunakan pengalamatan langsung, operan pertama mungkin merupakan register atau lokasi memori, dan operan kedua adalah konstanta langsung. Operan pertama menentukan panjang data.
Sebagai contoh,
BYTE_VALUE DB 150 ; A byte value is defined
WORD_VALUE DW 300 ; A word value is defined
ADD BYTE_VALUE, 65 ; An immediate operand 65 is added
MOV AX, 45H ; Immediate constant 45H is transferred to AX
Pengalamatan Memori Langsung
Ketika operan ditentukan dalam mode pengalamatan memori, akses langsung ke memori utama, biasanya ke segmen data, diperlukan. Cara menangani ini menghasilkan pemrosesan data yang lebih lambat. Untuk menemukan lokasi data yang tepat dalam memori, kita memerlukan alamat awal segmen, yang biasanya ditemukan di register DS dan nilai offset. Nilai offset ini juga disebuteffective address.
Dalam mode pengalamatan langsung, nilai offset ditentukan secara langsung sebagai bagian dari instruksi, biasanya ditunjukkan dengan nama variabel. Assembler menghitung nilai offset dan memelihara tabel simbol, yang menyimpan nilai offset semua variabel yang digunakan dalam program.
Dalam pengalamatan memori langsung, salah satu operand merujuk ke lokasi memori dan operan lainnya merujuk ke register.
Sebagai contoh,
ADD BYTE_VALUE, DL ; Adds the register in the memory location
MOV BX, WORD_VALUE ; Operand from the memory is added to register
Pengalamatan Direct-Offset
Mode pengalamatan ini menggunakan operator aritmatika untuk mengubah alamat. Misalnya, lihat definisi berikut yang menentukan tabel data -
BYTE_TABLE DB 14, 15, 22, 45 ; Tables of bytes
WORD_TABLE DW 134, 345, 564, 123 ; Tables of words
Operasi berikut mengakses data dari tabel di memori ke register -
MOV CL, BYTE_TABLE[2] ; Gets the 3rd element of the BYTE_TABLE
MOV CL, BYTE_TABLE + 2 ; Gets the 3rd element of the BYTE_TABLE
MOV CX, WORD_TABLE[3] ; Gets the 4th element of the WORD_TABLE
MOV CX, WORD_TABLE + 3 ; Gets the 4th element of the WORD_TABLE
Pengalamatan Memori Tidak Langsung
Mode pengalamatan ini memanfaatkan kemampuan komputer dari Segmen: Pengalamatan offset . Umumnya, register dasar EBX, EBP (atau BX, BP) dan register indeks (DI, SI), yang dikodekan dalam tanda kurung siku untuk referensi memori, digunakan untuk tujuan ini.
Pengalamatan tidak langsung umumnya digunakan untuk variabel yang mengandung beberapa elemen seperti, array. Alamat awal larik disimpan dalam, katakanlah, register EBX.
Cuplikan kode berikut menunjukkan cara mengakses berbagai elemen variabel.
MY_TABLE TIMES 10 DW 0 ; Allocates 10 words (2 bytes) each initialized to 0
MOV EBX, [MY_TABLE] ; Effective Address of MY_TABLE in EBX
MOV [EBX], 110 ; MY_TABLE[0] = 110
ADD EBX, 2 ; EBX = EBX +2
MOV [EBX], 123 ; MY_TABLE[1] = 123
Instruksi MOV
Kami telah menggunakan instruksi MOV yang digunakan untuk memindahkan data dari satu ruang penyimpanan ke ruang penyimpanan lainnya. Instruksi MOV membutuhkan dua operan.
Sintaksis
Sintaks dari instruksi MOV adalah -
MOV destination, source
Instruksi MOV mungkin memiliki salah satu dari lima bentuk berikut -
MOV register, register
MOV register, immediate
MOV memory, immediate
MOV register, memory
MOV memory, register
Harap dicatat bahwa -
- Kedua operan dalam operasi MOV harus berukuran sama
- Nilai operan sumber tetap tidak berubah
Instruksi MOV terkadang menyebabkan ambiguitas. Misalnya, lihat pernyataan -
MOV EBX, [MY_TABLE] ; Effective Address of MY_TABLE in EBX
MOV [EBX], 110 ; MY_TABLE[0] = 110
Tidak jelas apakah Anda ingin memindahkan satu byte ekivalen atau kata yang setara dengan angka 110. Dalam kasus seperti itu, bijaksana untuk menggunakan a type specifier.
Tabel berikut menunjukkan beberapa penentu tipe umum -
Jenis Penentu | Byte dialamatkan |
---|---|
BYTE | 1 |
KATA | 2 |
DWORD | 4 |
QWORD | 8 |
TBYTE | 10 |
Contoh
Program berikut menggambarkan beberapa konsep yang dibahas di atas. Ini menyimpan nama 'Zara Ali' di bagian data memori, kemudian mengubah nilainya menjadi nama lain 'Nuha Ali' secara terprogram dan menampilkan kedua nama tersebut.
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
;writing the name 'Zara Ali'
mov edx,9 ;message length
mov ecx, name ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov [name], dword 'Nuha' ; Changed the name to Nuha Ali
;writing the name 'Nuha Ali'
mov edx,8 ;message length
mov ecx,name ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
name db 'Zara Ali '
Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -
Zara Ali Nuha Ali