装配 - 数组
我们已经讨论过汇编器的数据定义指令用于为变量分配存储空间。该变量也可以用一些特定值进行初始化。初始化值可以以十六进制、十进制或二进制形式指定。
例如,我们可以通过以下方式定义单词变量“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
例子
以下示例通过定义一个 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 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