汇编语言 数组

  • 数组

    我们已经讨论过,汇编程序的数据定义指令用于为变量分配存储空间。变量也可以用一些特定的值初始化。初始化值可以以十六进制,十进制或二进制形式指定。例如,我们可以通过以下两种方式之一来定义单词变量“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,依此类推。
    让我们举另一个例子。您可以定义一个名为大小为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 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