assembly - 装配中通过数据成员的数组访问问题
问题描述
我想在数据成员中移动我的索引并通过将索引添加到数组的起始地址来访问它(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 字节(寻址模式)的有效寻址模式,请参见当前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 字节为010b
DX
Mod 00......
R/M .....000
Reg ..010...
=== 00010000 = 10h
推荐阅读
- easyphp - 注意:未定义的偏移量:第 18 行 C:\Program Files (x86)\EasyPHP-Devserver-17\eds-dashboard\index.php 中的 3
- php - SQL 加入另一个表
- c# - 我应该在分配后处理注入的变量吗
- javascript - Ember:即使刷新后模型中的某些属性也不会改变
- oracle - 如何在 oracle apex 的报告中使用复选框在表中插入值
- php - PHP:使用透明bg从PNG获取真实图像大小
- reactjs - React.memo 与打字稿反应
- .htaccess - 替换 - 在 htaccess 中用 + 查询字符串签名
- winappdriver - Win App Driver 中的动作 MoveByOffset:如何查看或减慢速度?
- docker - 如何使 nginx 作为可从主机访问的 docker 服务运行?