Assembly彙編 數組
我們已經討論了用於為變量分配存儲的數據定義指令的彙編。變量也可以用一些特定的值被初始化。可以指定初始化值,十六進製,十進製或二進製形式。
例如,我們可以定義一個字變量months 以下方式之一:
MONTHS DW 12 MONTHS DW 0CH MONTHS DW 0110B
數據定義指令也可以被用於定義一個一維數組。讓我們定義一個一維數組存儲數字。
NUMBERS DW 34, 45, 56, 67, 75, 89
上述定義數組聲明六個字每個初始化的數字34,45,56,67,75,89。此分配2×6=12個字節的連續的存儲器空間。符號地址的第一個數字的號碼,以及該第二個數字將號碼+2,依此類推。
讓我們舉了另一個例子。可以定義一個數組大小為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 TIMES 8 DW 0
例如:
下麵的示例演示通過上述概念定義一個3元素數組x,其中存儲了三個值:2,3和4。它添加數組中的值並顯示的總和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 yiibai to the current element to be summed top: add ebx, [ecx] add ecx,1 ;move yiibaier 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