假设我在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是什么意思?我在网上找不到任何解释如何阅读这些东西的东西。

最佳答案

400b62是指令的地址。bf 50 0a 49 00是构成指令的字节。在这种情况下,400b62处的指令将寄存器%edi设置为0x490a50。这里的bf表示“set edi”,而50 0a 49 00表示0x490a50的字节,以小尾数顺序排列(就像英特尔处理器那样)。
如果你想读每一条指令,它需要一点解码,但可以做到。在我的经验中,最好的参考是Intel® 64 and IA-32 Architectures Software Developer Manuals,但它们不适合胆小的人。

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

10-09 04:15