我们已经讨论过汇编程序的数据定义指令用于为变量分配存储空间.该变量也可以用一些特定值初始化.初始值可以用十六进制,十进制或二进制形式指定.
例如,我们可以用以下任一方式和减号定义一个单词变量'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 summedtop: add ebx, [ecx] add ecx,1 ;move pointer to next element dec eax ;decrement counter jnz top ;if counter not 0, then loop againdone: 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 kernelsection.dataglobal xx: db 2 db 4 db 3sum: db 0
编译并执行上述代码时,会产生以下结果 :
9