汇编语言 数组
我们已经讨论过,汇编器的数据定义指令用于为变量分配存储。还可以使用某些特定值初始化变量。可以十六进制、十进制或二进制形式指定初始化值。
例如,我们可以用以下任一方式定义单词变量 "months":
MONTHSDW12MONTHSDW0CHMONTHSDW0110B
数据定义指令也可用于定义一维数组。让我们定义一个一维数字数组。
NUMBERSDW 34, 45, 56, 67, 75, 89
上面的定义声明了一个由 6 个单词组成的数组,每个单词用数字 34、45、56、67、75、89 初始化。这将分配 2x6=12 字节的连续内存空间。第一个数字的符号地址为 NUMBERS,第二个数字的字符地址为 NUMBERS+2 ,依此类推。
让我们再举一个例子。您可以定义一个名为 inventory 的数组,大小为 8,并将所有值初始化为 0,比如:
INVENTORY DW 0DW 0DW 0DW 0DW 0DW 0DW 0DW 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 .textglobal _start ;必须为链接器声明 (ld)_start:mov eax,3 ;要求和的字节数mov ebx,0 ;EBX 将存储总和mov ecx, x ;ECX 将指向要求和的当前元素top: add ebx, [ecx]add ecx,1 ;将指针移动到下一个元素dec eax ;计数器自减jnz top ;如果计数器不是 0,则再次循环done:add ebx, '0'mov [sum], ebx ;完成,将结果存储为 sumdisplay:mov edx,1 ;消息长度mov ecx, sum ;消息mov ebx, 1 ;文件描述 (stdout)mov eax, 4 ;系统调用号 (sys_write)int 0x80 ;调用内核mov eax, 1 ;系统调用号 (sys_exit)int 0x80 ;调用内核section .dataglobal xx:db 2db 4db 3sum:db 0
结果如下:
9