Montaj - Değişkenler

NASM, çeşitli define directivesdeğişkenler için depolama alanı ayırmak için. Define assembler direktifi, depolama alanı tahsisi için kullanılır. Bir veya daha fazla baytı ayırmak ve başlatmak için kullanılabilir.

İlklendirilmiş Veriler için Depolama Alanı Tahsis Etme

Başlatılan veriler için depolama ayırma ifadesi sözdizimi şöyledir:

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

Nerede, değişken adı her depolama alanı için tanımlayıcıdır. Derleyici, veri segmentinde tanımlanan her değişken adı için bir ofset değeri ilişkilendirir.

Tanımlama yönergesinin beş temel biçimi vardır -

Direktif Amaç Depolama alanı
DB Bayt Tanımla 1 bayt ayırır
DW Kelime Tanımla 2 bayt ayırır
DD Doubleword tanımlayın 4 bayt ayırır
DQ Quadword tanımlayın 8 bayt ayırır
DT On Bayt Tanımla 10 bayt ayırır

Aşağıda, define yönergelerinin kullanımına ilişkin bazı örnekler verilmiştir -

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

Lütfen unutmayın -

  • Her karakter baytı, ASCII değeri olarak onaltılık olarak saklanır.

  • Her ondalık değer otomatik olarak 16 bitlik ikili eşdeğerine dönüştürülür ve onaltılık bir sayı olarak saklanır.

  • İşlemci, küçük endian bayt sırasını kullanır.

  • Negatif sayılar, 2'nin tümleyen gösterimine dönüştürülür.

  • Kısa ve uzun kayan noktalı sayılar sırasıyla 32 veya 64 bit kullanılarak temsil edilir.

Aşağıdaki program, define yönergesinin kullanımını göstermektedir -

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'

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

y

İlklendirilmemiş Veriler için Depolama Alanı Tahsis Etme

Rezerv direktifleri, başlatılmamış veriler için yer ayırmak için kullanılır. Rezerv direktifleri, rezerve edilecek alan birimlerinin sayısını belirten tek bir işlenen alır. Her bir tanımlama yönergesinin ilgili bir yedek yönergesi vardır.

Rezerv direktifinin beş temel biçimi vardır -

Direktif Amaç
RESB Bayt ayır
RESW Bir Kelime Rezerve Et
RESD Doubleword ayırtın
RESQ Bir Quadword ayırtın
DİNLENME On Bayt Ayırtın

Çoklu Tanımlar

Bir programda birden çok veri tanımlama ifadesine sahip olabilirsiniz. Örneğin -

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

Birleştirici, birden çok değişken tanımı için bitişik bellek ayırır.

Çoklu İlklendirmeler

TIMES yönergesi, aynı değere birden çok başlatmaya izin verir. Örneğin, 9 boyutunda işaretler adlı bir dizi, aşağıdaki ifade kullanılarak tanımlanabilir ve sıfır olarak başlatılabilir -

marks  TIMES  9  DW  0

TIMES yönergesi, dizileri ve tabloları tanımlamada kullanışlıdır. Aşağıdaki program ekranda 9 yıldız işareti gösterir -

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 '*'

Yukarıdaki kod derlendiğinde ve yürütüldüğünde, aşağıdaki sonucu verir -

*********