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