汇编求助:Invalid effective address报错(局部数组分配场景)
解决x86汇编中
lea eax, [ebp-edi]的“Invalid effective address”错误 错误原因
x86架构的内存寻址规则不允许[寄存器1-寄存器2]这种直接相减的有效地址格式。合法的有效地址只能是以下组合之一:
- 立即数(如
[0x1234]) - 单个基址/变址寄存器(如
[ebp]、[esi]) - 基址寄存器 + 立即数(如
[ebp-4]) - 变址寄存器×比例 + 立即数(如
[esi*4 + 8]) - 基址寄存器 + 变址寄存器×比例 + 立即数(如
[ebp + esi*4 - 4])
你的代码里[ebp-edi]属于两个寄存器直接相减,不符合寻址规则,因此报错。
解决方案
这里提供两种符合规则的改写方式,都能实现你遍历10个4字节局部数组元素的需求:
方法1:先计算地址到寄存器
通过mov+sub指令先算出ebp-edi的地址,再使用该地址:
mov edi, 4 mov ecx, 10 read: mov eax, ebp sub eax, edi ; 计算ebp-edi的地址存入eax push eax call readVal add edi, 4 loop read add esp, 40
方法2:使用合法的基址+变址寻址
调整偏移量的存储方式,用基址加负偏移的合法形式:
mov esi, -4 ; 初始偏移为-4,对应ebp-4 mov ecx, 10 read: lea eax, [ebp + esi] ; 合法的基址+变址寻址 push eax call readVal sub esi, 4 ; 偏移量减4,指向下一个元素 loop read add esp, 40
内容的提问来源于stack exchange,提问作者Rheagar
相关产品推荐
相关产品推荐

