当前位置: 首页 > 文档资料 > 汇编中文教程 >

阵列(Arrays)

优质
小牛编辑
140浏览
2023-12-01

我们已经讨论过汇编程序的数据定义指令用于为变量分配存储空间。 变量也可以用一些特定值初始化。 初始化值可以以十六进制,十进制或二进制形式指定。

例如,我们可以通过以下任一方式定义单词变量'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

例子 (Example)

以下示例通过定义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