有人可以告诉我在 emu8086 中访问数组元素的最有效方法吗?
作为一个例子,我得到了这个数组:
tab db 30h,35h,32h,37h,38h,39h,31h
写
mov si, offset tab
然后使用si
访问元素是不是错误?如tab[si]
、tab[si+1]
、tab[si+n]
等lodsb
/lodsw
吗?
写
然后用si访问元素是不是错了?像mov si, offset tab
,tab[si]
,tab[si+1]
...等等。tab[si+n]
那确实是非常错误的!假设 emu8086 可以接受
tab[si]
,其中位移分量(部分)位于方括号之外,那么您将错误地将偏移量添加到数组两次。一次进入 SI 的初始化(mov si, offset tab
),再次进入使用寻址模式的加载/存储指令tab[si]
。
四种解决方法:
使用
mov si, offset tab
设置 SI,并使用 [si]
访问第一个元素,使用 [si+1]
访问第二个元素。
使用
xor si, si
设置SI(与mov si, 0
相同)并使用tab[si]
访问第一个元素,使用tab[si+1]
访问第二个元素。
使用
mov si, offset tab
设置 SI 并访问所有
带有 [si]
的元素,因为在访问之间您将增加 SI 寄存器作为循环逻辑的一部分。
使用
xor si, si
(与mov si, 0
相同)设置SI并访问所有
带有 tab[si]
的元素,因为在访问之间您将增加 SI 寄存器作为循环逻辑的一部分。
我有义务一直使用 lodsb/lodsw 吗?
绝对不行。但如果您需要编写最紧凑的解决方案,那么通常使用这些字符串原语就可以完成这项工作。