Montaj - Diziler

Değişkenler için depolama ayırmak için assembler veri tanımlama direktiflerinin kullanıldığını daha önce tartışmıştık. Değişken, belirli bir değerle de başlatılabilir. Başlatılan değer onaltılık, onluk veya ikili formda belirtilebilir.

Örneğin, aşağıdaki yollardan biriyle 'ay' kelimesini tanımlayabiliriz -

MONTHS	DW	12
MONTHS	DW	0CH
MONTHS	DW	0110B

Veri tanımlama yönergeleri, tek boyutlu bir diziyi tanımlamak için de kullanılabilir. Tek boyutlu bir sayı dizisi tanımlayalım.

NUMBERS	DW  34,  45,  56,  67,  75, 89

Yukarıdaki tanım, her biri 34, 45, 56, 67, 75, 89 sayılarıyla başlayan altı kelimeden oluşan bir dizi bildirir. Bu, 2x6 = 12 bayt ardışık bellek alanı tahsis eder. İlk numaranın sembolik adresi NUMARALAR olacaktır ve ikinci numaranınki NUMBERS + 2 vb. Olacaktır.

Başka bir örnek alalım. Boyut 8 envanter adlı bir dizi tanımlayabilir ve tüm değerleri sıfır ile başlatabilirsiniz.

INVENTORY   DW  0
            DW  0
            DW  0
            DW  0
            DW  0
            DW  0
            DW  0
            DW  0

Hangisi kısaltılabilir -

INVENTORY   DW  0, 0 , 0 , 0 , 0 , 0 , 0 , 0

TIMES yönergesi, aynı değere birden çok ilklendirme için de kullanılabilir. TIMES kullanılarak INVENTORY dizisi şu şekilde tanımlanabilir:

INVENTORY TIMES 8 DW 0

Misal

Aşağıdaki örnek, üç değeri depolayan 3 öğeli bir x dizisi tanımlayarak yukarıdaki kavramları gösterir: 2, 3 ve 4. Diziye değerleri ekler ve toplamı 9 -

section	.text
   global _start   ;must be declared for linker (ld)
	
_start:	
 		
   mov  eax,3      ;number bytes to be summed 
   mov  ebx,0      ;EBX will store the sum
   mov  ecx, x     ;ECX will point to the current element to be summed

top:  add  ebx, [ecx]

   add  ecx,1      ;move pointer to next element
   dec  eax        ;decrement counter
   jnz  top        ;if counter not 0, then loop again

done: 

   add   ebx, '0'
   mov  [sum], ebx ;done, store result in "sum"

display:

   mov  edx,1      ;message length
   mov  ecx, sum   ;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
global x
x:    
   db  2
   db  4
   db  3

sum: 
   db  0

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

9