彙編 - 陣列



我們已經討論過,資料定義指令用於為變數分配儲存空間。變數也可以用一些特定的值進行初始化。初始化值可以用十六進位制、十進位制或二進位制形式指定。

例如,我們可以用以下任一方式定義一個字變數'months':

MONTHS	DW	12
MONTHS	DW	0CH
MONTHS	DW	0110B

資料定義指令也可以用於定義一維陣列。讓我們定義一個一維數字陣列。

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

上述定義聲明瞭一個包含六個字的陣列,每個字分別初始化為34、45、56、67、75、89。這將分配2x6 = 12個位元組的連續記憶體空間。第一個數字的符號地址將為NUMBERS,第二個數字的符號地址將為NUMBERS + 2,以此類推。

讓我們來看另一個例子。您可以定義一個名為inventory、大小為8的陣列,並將所有值初始化為零,如下所示:

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

這可以簡寫為:

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

TIMES指令也可以用於對相同值進行多次初始化。使用TIMES,INVENTORY陣列可以定義為:

INVENTORY TIMES 8 DW 0

示例

下面的例子透過定義一個包含三個值:2、3和4的3元素陣列x來演示上述概念。它將陣列中的值相加並顯示總和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

當上述程式碼編譯並執行時,它會產生以下結果:

9
廣告