8086汇编中如何用变量值作为偏移量访问内存地址?
8086汇编中用变量值作为基址变址偏移的解决方法
8086汇编里,你写的mov ax, word ptr [BX+SI+var]之所以会把var的地址当成偏移,是因为该指令的寻址模式只支持立即数作为位移量——汇编器会把var解析成它在段内的固定偏移地址(比如你看到的0002h),而非var内存单元里存储的数值。
要使用var的数值作为偏移,必须先把这个值加载到寄存器,再调整基址/变址寄存器,最终通过合法的基址变址寻址访问目标内存。以下是两种常用实现方式:
方式1:调整变址寄存器SI
假设var是字节变量(存储3fh):
mov al, var ; 将var中存储的3fh读取到AL cbw ; 将AL的字节值扩展为AX的字值(避免16位运算溢出) add si, ax ; 把var的值加到SI上,此时SI = 原SI + 3fh mov ax, word ptr [bx+si] ; 访问BX+SI(即原BX+SI+3fh)处的字数据
如果var是字变量:
add si, [var] ; 直接将var的字值加到SI mov ax, word ptr [bx+si]
方式2:调整基址寄存器BX
逻辑和方式1一致,只是改为调整BX:
mov ax, [var] ; 读取var的字值到AX add bx, ax ; BX = 原BX + var的值 mov ax, word ptr [bx+si] ; 访问目标地址
关键说明
8086的有效地址仅支持基址寄存器(BX/BP) + 变址寄存器(SI/DI) + 立即数位移的组合,无法直接引用内存变量作为位移量。因此必须先将变量值转移到寄存器,再参与地址计算。
内容的提问来源于stack exchange,提问作者Bepsi_3000
相关产品推荐
相关产品推荐

