首页 > 解决方案 > 装配中通过数据成员的数组访问问题

问题描述

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

标签: assemblyemu8086

解决方案


您不能在索引表达式中使用变量的值。所以mov dx,[bx + i]无效。有关16 位汇编的 ModR/M 字节(寻址模式)的有效寻址模式,请参见当前Intel 64 和 IA-32 架构软件开发手册第 509 页第 2 卷第 2.1.5 节。

这就是我感到困惑的地方,汇编程序没有给出任何严重的错误并成功组装。会发生什么而不是放置“i”的值,而是放置 i 的地址

是的。这是正确的(但不需要的)行为。该指令的寻址方式为[BX]+disp16= [BX + disp16]with 方式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和。根据第 508 页的图 2.2 , ModR/M 字节010bDX

Mod 00......
R/M .....000
Reg ..010...
=== 00010000 = 10h

推荐阅读