gpt4 book ai didi

c - 学习反汇编

转载 作者:太空狗 更新时间:2023-10-29 15:22:51 25 4
gpt4 key购买 nike

为了理解下面发生的事情,我正在编写小型 C 程序然后将其逆向,并试图理解它的 objdump 输出。

C 程序是:

#include <stdio.h>

int function(int a, int b, int c) {
printf("%d, %d, %d\n", a,b,c);
}

int main() {
int a;
int *ptr;

asm("nop");
function(1,2,3);
}

函数的 objdump 输出为我提供了以下内容。

080483a4 <function>:
80483a4: 55 push ebp
80483a5: 89 e5 mov ebp,esp
80483a7: 83 ec 08 sub esp,0x8
80483aa: ff 75 10 push DWORD PTR [ebp+16]
80483ad: ff 75 0c push DWORD PTR [ebp+12]
80483b0: ff 75 08 push DWORD PTR [ebp+8]
80483b3: 68 04 85 04 08 push 0x8048504
80483b8: e8 fb fe ff ff call 80482b8 <printf@plt>
80483bd: 83 c4 10 add esp,0x10
80483c0: c9 leave

请注意,在调用 printf 之前,偏移量为 8、16、12 的三个 DWORD(它们必须是 function 的参数,顺序相反)被压入堆栈。稍后将推送一个必须是格式字符串地址的十六进制地址。

我的疑问是

  1. 我没有将 3 个 DWORDS 和格式说明符直接压入堆栈,而是希望看到 esp 被手动递减,然后将值压入堆栈。如何解释这一行为?

最佳答案

好吧,有些机器有一个堆栈指针,有点像任何其他寄存器,所以你推送东西的方式是,是的,先递减,然后存储。

但是有些机器,比如 x8632/64 有一个执行宏操作的push 指令:递减指针做商店。

顺便说一句,宏观操作有一段有趣的历史。有时,某些机器上的某些示例比使用简单指令执行基本操作要慢。

我怀疑今天是否经常出现这种情况。现代 x86 非常复杂。 CPU 会将您的操作码本身分解为微操作,然后将其存储在缓存中。微操作有特定的管道和时隙要求,最终结果是最近 x86 内部有一个 RISC cpu,整个过程非常快并且具有良好的架构层代码密度.

关于c - 学习反汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4650707/

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