我想在数据成员中移动索引并通过将索引添加到数组的起始地址来访问它(mov dx,[bx + i]),但我没有给出其地址的值。我该怎么办?
; This method of array access
mov ah,2
lea bx,arr ; load address of DW array
mov i,2 ; DW data member
int 21h
mov dx,[bx + i] ; this line is having problem
add dx,30h
int 21h
答案 0 :(得分:2)
您不能在索引表达式中使用变量的值。因此mov dx,[bx + i]
是无效的。请参阅当前Intel 64 and IA-32 Architectures Software Development Manual的第509页的第2卷第2.1.5节 ,以获取有效的16位ModR / M字节寻址模式(寻址模式)。钻头组装。
那是我感到困惑的地方,汇编器不会出现任何严重错误,并且可以成功地进行汇编。发生什么事而不是输入“ i”的值,而是输入地址
是的。这是正确的(但不受欢迎的)行为。该指令的寻址模式为[BX]+disp16
= [BX + disp16]
,模式为10111b
(请参见《使用手册》中的表格)。因此,这里的disp16是变量的地址,而不是其值。 所以指令正在使用该地址作为索引。您没有想要实现的寻址模式。您必须先将索引放入寄存器,然后再从表中使用适当的寻址模式。
所以换行
mov dx, [bx + i] ; this line is having problem
到
mov si, i ; i is a WORD variable
mov dx, [bx+si] ; correct addressing mode
这将为寄存器[BX+SI]
生成一个正确的寻址模式00000b
= 010b
和DX
。根据第508页上的图2.2 , ModR / M字节为
Mod 00......
R/M .....000
Reg ..010...
=== 00010000 = 10h