Perakitan - Variabel

NASM menyediakan berbagai define directivesuntuk memesan ruang penyimpanan untuk variabel. Direktif define assembler digunakan untuk alokasi ruang penyimpanan. Ini dapat digunakan untuk mencadangkan serta menginisialisasi satu atau lebih byte.

Mengalokasikan Ruang Penyimpanan untuk Data yang Diinisialisasi

Sintaks untuk pernyataan alokasi penyimpanan untuk data yang diinisialisasi adalah -

[variable-name]    define-directive    initial-value   [,initial-value]...

Di mana, nama-variabel adalah pengidentifikasi untuk setiap ruang penyimpanan. Assembler mengaitkan nilai offset untuk setiap nama variabel yang ditentukan di segmen data.

Ada lima bentuk dasar dari define directive -

Pengarahan Tujuan Ruang penyimpanan
DB Tentukan Byte mengalokasikan 1 byte
DW Tentukan Word mengalokasikan 2 byte
DD Tentukan Doubleword mengalokasikan 4 byte
DQ Tentukan Quadword mengalokasikan 8 byte
DT Tentukan Sepuluh Bytes mengalokasikan 10 byte

Berikut adalah beberapa contoh penggunaan perintah define -

choice		DB	'y'
number		DW	12345
neg_number	DW	-12345
big_number	DQ	123456789
real_number1	DD	1.234
real_number2	DQ	123.456

Harap dicatat bahwa -

  • Setiap byte karakter disimpan sebagai nilai ASCII dalam heksadesimal.

  • Setiap nilai desimal secara otomatis diubah menjadi setara biner 16-bit dan disimpan sebagai angka heksadesimal.

  • Prosesor menggunakan pengurutan byte little-endian.

  • Bilangan negatif diubah menjadi representasi komplemen 2 nya.

  • Angka floating-point pendek dan panjang masing-masing direpresentasikan menggunakan 32 atau 64 bit.

Program berikut menunjukkan penggunaan direktif define -

section .text
   global _start          ;must be declared for linker (gcc)
	
_start:                   ;tell linker entry point
   mov	edx,1		  ;message length
   mov	ecx,choice        ;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
choice DB 'y'

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

y

Mengalokasikan Ruang Penyimpanan untuk Data yang Tidak Dimulai

Arahan cadangan digunakan untuk memesan ruang untuk data yang tidak diinisialisasi. Arahan cadangan mengambil operan tunggal yang menentukan jumlah unit ruang yang akan dipesan. Setiap direktif definisikan memiliki arahan cadangan terkait.

Ada lima bentuk dasar dari reserve directive -

Pengarahan Tujuan
RESB Pesan Byte
RESW Pesan Kata
RESD Pesan Doubleword
RESQ Pesan Quadword
BERISTIRAHAT Pesan Sepuluh Bytes

Definisi Ganda

Anda dapat memiliki beberapa pernyataan definisi data dalam sebuah program. Misalnya -

choice	  DB 	'Y' 		 ;ASCII of y = 79H
number1	  DW 	12345 	 ;12345D = 3039H
number2    DD  12345679  ;123456789D = 75BCD15H

Assembler mengalokasikan memori yang berdekatan untuk beberapa definisi variabel.

Beberapa Inisialisasi

Direktif TIMES memungkinkan beberapa inisialisasi ke nilai yang sama. Misalnya, sebuah array bernama tanda ukuran 9 dapat didefinisikan dan diinisialisasi ke nol menggunakan pernyataan berikut -

marks  TIMES  9  DW  0

Direktif TIMES berguna dalam mendefinisikan array dan tabel. Program berikut menampilkan 9 tanda bintang di layar -

section	.text
   global _start        ;must be declared for linker (ld)
	
_start:                 ;tell linker entry point
   mov	edx,9		;message length
   mov	ecx, stars	;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
stars   times 9 db '*'

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

*********