
彙編 - 陣列
我們已經討論過,資料定義指令用於為變數分配儲存空間。變數也可以用一些特定的值進行初始化。初始化值可以用十六進位制、十進位制或二進位制形式指定。
例如,我們可以用以下任一方式定義一個字變數'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
廣告