gpt4 book ai didi

assembly - x86 Intel 汇编器 LEA

转载 作者:行者123 更新时间:2023-12-02 21:11:58 31 4
gpt4 key购买 nike

查看以下代码:
(ebp-0x8 -> int)
(ebp-0x4 -> int*)

=> 0x80483f3 <main+6>:  mov    DWORD PTR [ebp-0x8],0x0
0x80483fa <main+13>: mov DWORD PTR [ebp-0x4],0x0
0x8048401 <main+20>: mov DWORD PTR [ebp-0x8],0xa

0x8048408 <main+27>: lea eax,[ebp-0x8]
0x804840b <main+30>: mov DWORD PTR [ebp-0x4],eax

0x804840e <main+33>: mov eax,0x0
0x8048413 <main+38>: leave
0x8048414 <main+39>: ret

真的需要 LEA 命令吗?我知道以下表达式是错误且无效的,无论左侧的地址是否错误,但是是否没有类似的方法可以使其成为这样?

=> 0x80483f3 <main+6>:  mov    DWORD PTR [ebp-0x8],0x0
0x80483fa <main+13>: mov DWORD PTR [ebp-0x4],0x0
0x8048401 <main+20>: mov DWORD PTR [ebp-0x8],0xa

0x804840b <main+30>: mov DWORD PTR [ebp-0x4],ebp-0x8

0x804840e <main+33>: mov eax,0x0
0x8048413 <main+38>: leave
0x8048414 <main+39>: ret

我认为这是不可能的,但我想确定一下。

最后一个问题,表达式 ebp-0x8理论上会返回ebp寄存器的内容减去0x8。所以表达式[ebp-0x8]将返回地址内存的内容“ebp寄存器的内容减去0x8。现在我想知道LEA命令如果只获取内存中某些字节的内容,如何获取内存地址。

很抱歉,如果有一些愚蠢的问题,但[]有时可能会非常令人困惑。

最佳答案

为了使第二个代码片段正常工作,您需要将减法作为单独的指令进行。换句话说,而不是

DWORD PTR [ebp-0x4],ebp-0x8

你需要

mov eax,ebp
sub eax,0x8
mov DWORD PTR [ebp-0x4],ax

使用lea的优点是它将算术运算与mov指令结合起来。所以而不是两条指令

mov eax,ebp
sub eax,0x8

您可以使用单个指令

lea eax,[ebp-0x8]

lea指令的意思是“加载有效地址”。第二个操作数指定地址,计算该地址所需的任何计算均由处理器中的地址生成逻辑完成。

另一方面,sub 指令使用处理器的通用算术逻辑单元 (ALU)。

总之,lea 指令通过使用处理器的地址生成逻辑将两条指令合并为一条指令,以执行原本需要在 ALU 中完成的数学计算。

关于assembly - x86 Intel 汇编器 LEA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32931181/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com