汇编语言 数组

我们已经讨论过,汇编器的数据定义指令用于为变量分配存储。还可以使用某些特定值初始化变量。可以十六进制、十进制或二进制形式指定初始化值。

例如,我们可以用以下任一方式定义单词变量 "months":

  1. MONTHSDW12
  2. MONTHSDW0CH
  3. MONTHSDW0110B

数据定义指令也可用于定义一维数组。让我们定义一个一维数字数组。

  1. NUMBERSDW 34, 45, 56, 67, 75, 89

上面的定义声明了一个由 6 个单词组成的数组,每个单词用数字 34、45、56、67、75、89 初始化。这将分配 2x6=12 字节的连续内存空间。第一个数字的符号地址为 NUMBERS,第二个数字的字符地址为 NUMBERS+2 ,依此类推。

让我们再举一个例子。您可以定义一个名为 inventory 的数组,大小为 8,并将所有值初始化为 0,比如:

  1. INVENTORY DW 0
  2. DW 0
  3. DW 0
  4. DW 0
  5. DW 0
  6. DW 0
  7. DW 0
  8. DW 0

可以缩写为:

  1. INVENTORY DW 0, 0 , 0 , 0 , 0 , 0 , 0 , 0

TIMES 指令还可用于对同一值进行多次初始化。使用 TIMES,可以将 INVENTORY 数组定义为:

  1. INVENTORY TIMES 8 DW 0

实例

以下实例通过定义一个 3 元素数组 x 来演示上述概念,该数组存储三个值:2、3 和 4。它将值添加到数组中并显示总和 9:

  1. section .text
  2. global _start ;必须为链接器声明 (ld)
  3. _start:
  4. mov eax,3 ;要求和的字节数
  5. mov ebx,0 ;EBX 将存储总和
  6. mov ecx, x ;ECX 将指向要求和的当前元素
  7. top: add ebx, [ecx]
  8. add ecx,1 ;将指针移动到下一个元素
  9. dec eax ;计数器自减
  10. jnz top ;如果计数器不是 0,则再次循环
  11. done:
  12. add ebx, '0'
  13. mov [sum], ebx ;完成,将结果存储为 sum
  14. display:
  15. mov edx,1 ;消息长度
  16. mov ecx, sum ;消息
  17. mov ebx, 1 ;文件描述 (stdout)
  18. mov eax, 4 ;系统调用号 (sys_write)
  19. int 0x80 ;调用内核
  20. mov eax, 1 ;系统调用号 (sys_exit)
  21. int 0x80 ;调用内核
  22. section .data
  23. global x
  24. x:
  25. db 2
  26. db 4
  27. db 3
  28. sum:
  29. db 0

结果如下:

  1. 9