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
相关产品推荐
相关产品推荐

