位置:首页 > > Assembly 数组

Assembly 数组

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

例如,我们可以定义一个字变量months 以下方式之一:

MONTHS	DW	12
MONTHS	DW	0CH
MONTHS	DW	0110B

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

NUMBERS	DW 34, 45, 56, 67, 75, 89

上述定义数组声明六个字每个初始化的数字34,45,56,67,75,89。此分配2×6=12个字节的连续的存储器空间。符号地址的第一个数字的号码,以及该第二个数字将号码+2,依此类推。

让我们举了另一个例子。可以定义一个数组大小为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 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 yiibai to the current element to be summed
top:  add  ebx, [ecx]
      add  ecx,1      ;move yiibaier 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