You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:50:36