c - 如何解释反汇编的 C 代码

标签 c assembly x86-64

假设我在 C 编译器生成的目标文件上运行 objdump -d,我得到了这个反汇编:

0000000000400b5e <main>:
 400b5e: 55 push %rbp
 400b5f: 48 89 e5 mov %rsp,%rbp
 400b62: bf 50 0a 49 00 mov $0x490a50,%edi
 400b67: e8 04 0b 00 00 callq 401670 <_IO_puts>
 400b6c: 5d pop %rbp
 400b6d: c3 retq 
 400b6e: 66 90 xchg %ax,%ax

我不确定如何解释这里的所有内容。走线:

400b62: bf 50 0a 49 00 mov $0x490a50,%edi

我知道 mov 语句在做什么,但是 400b62 是什么意思? bf 50 0a 49 00 是什么意思?我在 Internet 上找不到任何解释如何阅读这些内容的内容。

最佳答案

400b62 是指令的地址。 bf 50 0a 49 00 是组成指令的字节。在这种情况下,位于 400b62 的指令将寄存器 %edi 设置为 0x490a50。这里 bf 表示“set edi”,50 0a 49 00 是 0x490a50 的小字节序字节(与 Intel 处理器一样)。

如果您希望能够阅读每条指令,则需要进行一些解码,但可以做到。根据我的经验,最好的引用是 Intel® 64 and IA-32 Architectures Software Developer Manuals ,但它们不适合胆小的人。

关于c - 如何解释反汇编的 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46738723/

相关文章:

assembly - 从 64 位 asm 调用 Printf 时如何传递参数?

c++ - 重负载下 C/C++ 中的内存泄漏检查

c - 如何使用 fattach() 编译 C 代码

c - 汇编程序中eax寄存器的值

assembly - 如何在 XMM 寄存器之间移动 128 位值?

x86-64/Windows 下正确的上下文切换

检查用户提供的值是否为整数,如果不要求正确的值

c++ - 为什么要在 PE 文件中创建不同的代码/数据/bss 部分?

assembly - 这是C64 6502组件的什么方言?

web-services - Ubuntu 16.04服务器amd64安装失败