i386汇编读取内存值时寄存器数值异常跳升问题
问题成因
核心问题是操作数大小不匹配引发的内存越界读取:
.data段中direction_offset用db定义,属于单字节变量,仅占用1字节内存,存储的有效值只有0x03- 32位x86汇编场景下,执行
mov esi, [direction_offset]时,esi是32位(4字节)寄存器,NASM默认会从direction_offset对应的内存地址连续读取4字节数据赋值给esi - 你的
direction_offset后紧跟direction数组,所以读取的4字节中,除首字节是预期的0x03,后3字节都是direction数组前3个元素的数值,经x86小端模式拼接后就得到了调试时看到的异常大值。
修复方案
任选一种即可:
- 修改变量定义,将
direction_offset改为4字节双字类型,匹配32位寄存器读取长度:
direction_offset dd 3 direction db -15,1,15,-1
- 读取时指定操作数大小,做零扩展后赋值给32位寄存器:
; 仅读取direction_offset的1个字节,高位补0填充为32位后赋值给esi movzx esi, byte [direction_offset] mov edi, [direction + esi]
内容的提问来源于stack exchange,提问作者Snappie
相关产品推荐
相关产品推荐

