Intel 8086汇编中如何获取偏移量?代码问题咨询
问题分析与修正方案
你的代码核心错误在于获取wordl1p偏移地址的方式有误,导致bx存储的是变量值而非偏移地址,间接寻址逻辑完全偏离预期。
错误点明确
mov bx, wordl1p:这条指令会把wordl1p变量的内容(初始1234,后续被改为14487)加载到bx,而非变量在数据段的偏移地址。要获取偏移地址,必须用lea指令或offset关键字。
修正后的完整代码
cpu 8086 segment code mov ax, data mov ds, ax mov ax, 14487 mov [wordl1p], ax lea bx, wordl1p ; 加载wordl1p的偏移地址到bx,等价于 mov bx, offset wordl1p ; 若无需修改未定义内存区域,可删除下方该行 ; mov byte [bx + 2], 116 mov al, [bx + 1] ; bx指向wordl1p起始地址,bx+1对应其高序字节(第二个字节) mov bytes2n, al ; 将高序字节内容复制到bytes2n int 21h hlt segment data bytes2n db 15 wordl1p dw 1234
关键细节解释
偏移地址获取:
lea bx, wordl1p:通过有效地址加载指令,直接将wordl1p在data段的偏移地址存入bx。- 替代写法:
mov bx, offset wordl1p,offset关键字会在汇编阶段直接返回变量的偏移地址,适合静态地址场景。
高序字节访问:
8086采用小端存储模式,dw类型的wordl1p低字节存在低地址,高字节存在高地址。因此[bx]指向低字节,[bx+1]就是你需要的第二个字节(高序字节)。关于
mov byte [bx + 2], 116:
根据data段布局,bytes2n占偏移0,wordl1p占偏移1和2,bx+2指向偏移3的未定义内存区域。如果这行不是你需要的逻辑,建议直接删除。
内容的提问来源于stack exchange,提问作者Jack Skyblue
相关产品推荐
相关产品推荐

