Assembly 程序集中通过数据成员的数组访问问题

Assembly 程序集中通过数据成员的数组访问问题,assembly,emu8086,Assembly,Emu8086,我想在数据成员中移动我的索引,并通过将索引添加到数组的起始地址(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 i

我想在数据成员中移动我的索引,并通过将索引添加到数组的起始地址(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

不能在索引表达式中使用变量的值。所以
mov-dx,[bx+i]
是无效的。关于16位组件的ModR/M字节(寻址模式)的有效寻址模式,请参见本手册第509页第2卷第2.1.5节


这就是我困惑的地方,汇编程序并没有给出任何严重的错误,而且汇编成功。如果不把‘i’的值放在‘i’的地址上,会发生什么

对。这是正确的(但不必要的)行为。本指令的寻址模式为
[BX]+disp16
=
[BX+disp16]
,模式为
10111b
(请参见说明手册中的表格)。所以这里disp16是变量的地址,而不是它的值因此指令使用地址作为索引。对于您想要实现的目标,没有寻址模式。您必须首先将索引放入寄存器,然后使用表中适当的寻址模式

那就换线吧

mov dx, [bx + i]   ; this line is having problem

这将为寄存器
DX
生成一个正确的寻址模式
[BX+SI]
=
00000b
010b
。根据第508页的图2.2,ModR/M字节为


不能在索引表达式中使用变量的值。所以
mov-dx,[bx+i]
是无效的。关于16位组件的ModR/M字节(寻址模式)的有效寻址模式,请参见本手册第509页第2卷第2.1.5节


这就是我困惑的地方,汇编程序并没有给出任何严重的错误,而且汇编成功。如果不把‘i’的值放在‘i’的地址上,会发生什么

对。这是正确的(但不必要的)行为。本指令的寻址模式为
[BX]+disp16
=
[BX+disp16]
,模式为
10111b
(请参见说明手册中的表格)。所以这里disp16是变量的地址,而不是它的值因此指令使用地址作为索引。对于您想要实现的目标,没有寻址模式。您必须首先将索引放入寄存器,然后使用表中适当的寻址模式

那就换线吧

mov dx, [bx + i]   ; this line is having problem

这将为寄存器
DX
生成一个正确的寻址模式
[BX+SI]
=
00000b
010b
。根据第508页的图2.2,ModR/M字节为


这就是我困惑的地方,汇编程序并没有给出任何严重的错误,而且汇编成功。如果不把‘i’的值放在寄存器中,它会把索引的地址放在寄存器中,那么一开始就不会有这个问题。这就是寄存器的用途。这就是我感到困惑的地方,汇编程序并没有给出任何严重错误,而且汇编成功。如果不把‘i’的值放在寄存器中,它会把索引的地址放在寄存器中,那么一开始就不会有这个问题。这就是寄存器的用途。
Mod 00......
R/M .....000
Reg ..010...
=== 00010000 = 10h