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

x86 NASM新手提问:mov eax, ebx与lea eax, [ebx]是否等效?

x86 NASM中mov eax, ebx与lea eax, [ebx]的效果对比

核心结论

当ebx中存储任意值(无论是内存地址还是普通整数)时,mov eax, ebx和lea eax, [ebx]的执行结果完全一致——都是把ebx寄存器里的值直接复制到eax中。

这是因为lea(Load Effective Address)的作用是计算内存操作数的有效地址,当操作数是单纯的寄存器寻址([ebx])时,有效地址就是ebx本身的值,所以和直接mov寄存器值的效果没有区别。


针对你提供的代码分析

先看完整代码:

section .data
    a db 1
section .bss
    b resb 1

section .text
    global _start
_start:
    mov ebx, a 
    ;or 
    ;inc byte [b]
    ;mov ebx, b

    mov eax, [ebx]
    mov eax, ebx 
    lea eax, [ebx]

exit:
    mov eax, 1
    int 0x80

情况1:ebx存储a的地址(执行mov ebx, a)

  • 第12行mov eax, [ebx]:从ebx指向的内存地址(即a的地址)读取1字节数据(值为1),零扩展到32位的eax中,此时eax = 0x00000001。
  • 第13行mov eax, ebx:直接把ebx里的a的地址复制到eax,此时eax等于a的内存地址。
  • 第14行lea eax, [ebx]:计算[ebx]的有效地址(也就是ebx里的a的地址),赋值给eax,结果和第13行完全一致。

情况2:ebx存储b的地址(执行inc byte [b] + mov ebx, b)

  • inc byte [b]会把b这个未初始化的字节加1,变为1。
  • 第12行mov eax, [ebx]:从b的地址读取1字节数据(值为1),零扩展到eax,此时eax = 0x00000001。
  • 第13行mov eax, ebx:把ebx里的b的地址复制到eax,此时eax等于b的内存地址。
  • 第14行lea eax, [ebx]:同样得到b的地址,和第13行结果一致。

关键区别提醒

要注意mov eax, [ebx]和另外两个指令的本质差异:

  • mov eax, [ebx]是内存读操作,会访问ebx指向的内存地址,取出数据后赋值给eax。
  • mov eax, ebx和lea eax, [ebx]都是寄存器间的数据传递,不会访问内存(lea在这里仅做地址计算,不触发内存读写)。

内容的提问来源于stack exchange,提问作者Ma Yuchen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:42:34