这是正确的组装吗?

时间:2011-06-04 18:21:45

标签: assembly x86

我可以在汇编中处理这样的数组吗?

db a 10,20,30,40,50

然后说:

mov si,0

然后引用像这样的元素

mov AX,a[si]

2 个答案:

答案 0 :(得分:2)

从技术上讲,是的,但编写

会更有效率
mov si, offset a
mov ax, [si]

还有一件事:a被定义为一个字节数组。 ax是16位寄存器。因此,mov ax,[si]会使ax包含a的前两个字节(即al=10ah=20)。

你可能想要的是

 mov al, [si]

 mov al, a[si]

答案 1 :(得分:1)

是的,这是允许/支持的。

@elder_george至少有一些事情是正确的:你经常想把地址放入寄存器而不是把它编码到指令中。在你通过数组的相当典型的情况下,你可能需要类似的东西:

    mov bx, offset a
    xor si, si
next_char:
    mov al, bx[si]
    ; process al
    inc si
    cmp si, 5
    jle next_char

但是,如果可能的话,从最后到开始处理通常会更方便:

    mov bx, offset a
    mov si, 5
next_char:
    mov al, bx[si]
    ; process al
    dec si
    jnz next_char

或者,您可以将基础和索引的角色转换为另一个(现在大部分已过时)优化:

    mov esi, offset a
    mov ecx, 5
next_char:
    mov al, esi[ecx]
    ; process al
    loop next_char

你只能用32位寄存器做这个特殊的技巧 - ecx可以充当“基”寄存器,但cx不能(并且 与[e] cx一起工作。相反,bx和bp都可以充当基址寄存器,但loop不能用于它们。