【发布时间】:2012-02-09 04:33:07
【问题描述】:
我正在阅读一本关于 asm 并使用 GDB 研究寄存器和内存的 C 书籍。 问题是,当我编译和反汇编完全相同的源代码时(实际上是使用随书 cd 提供的源文件),汇编指令看起来与书中的内容有很大不同。 这本书使用了 intel 风格的汇编,我将“set disassembly intel”放在 gdb 中,所以不是这样。只是说明的顺序不同,有些完全不同,还有一些其他的怪癖。
比如书中的eip寄存器中有一条mov指令:
(gdb) x/i $eip
mov DWORD PTR[ebp-4], 0x0
对应将变量i初始化为0,在一个for循环中(i = 0, i
但是,在我的 gdb 控制台中,断点位于同一位置(set break main; run)我看到了:
(gdb) x/i $eip
mov DWORD PTR[esp+0x1c], 0x0
注意它同时引用了一个不同的寄存器 - esp 而不是 ebp 如果我检查 esp 的值,它本身就是 0x1c。但是,如果我尝试检查 0x1c 或 esp+0x1c 处的内容,它会告诉我我无法查看这些地址
所以随着这本书的继续,我根本无法跟进,因为它开始跟踪 ebp、ebp-4 等中的内容,而在我的 asm 中似乎没有任何内容发生在 ebp 寄存器中
这本书写于 2008 年,所以我无法想象它已经过时了,以至于 gcc 或 gdb 的版本更改会带来如此重大的变化(或者是这样做的?)......是否有可能一些编译器优化或默认打开的东西会产生如此不同的结果?
提前致谢
编辑:奇怪。我尝试了每个建议,但没有任何效果。然后我做了 rm a.out 并重新编译,现在它工作正常(说明仍然与书不同,但我可以检查与书对应的地址;只要我能遵循相应的模式,一切都很好,不必是完全相同的asm,那只会让它太容易了!) 再次感谢您的所有帮助和建议。
【问题讨论】:
标签: gcc assembly gdb machine-code memory-address