我可以在汇编中处理这样的数组吗?
db a 10,20,30,40,50
然后说:
mov si,0
然后引用像这样的元素
mov AX,a[si]
答案 0 :(得分:2)
从技术上讲,是的,但编写
会更有效率mov si, offset a
mov ax, [si]
还有一件事:a
被定义为一个字节数组。 ax
是16位寄存器。因此,mov ax,[si]
会使ax
包含a
的前两个字节(即al=10
,ah=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
不能用于它们。