我正在阅读一本C语言书,它很多内容都与asm有关,并且正在用GDB来查看寄存器和内存。 问题是,当我编译和反汇编完全相同的源文件(实际上使用cd书附带的源文件)时,汇编指令看起来与本书中的内容有很大不同。 这本书使用英特尔风味的大会,我把“集拆卸英特尔”在gdb,所以它不是..只是说明是在不同的顺序,有些都在一起不同,还有一些其他的怪癖。gdb的奇怪结果
例如,在该书中有EIP寄存器MOV指令:对应于初始化变量i为0,在for循环中
(gdb) x/i $eip
mov DWORD PTR[ebp-4], 0x0
(I = 0,I < 10,I ++ )
然而,在我的GDB控制台,与在同一个地方断点(设置打破为主;运行)我看到这一点:
(gdb) x/i $eip
mov DWORD PTR[esp+0x1c], 0x0
察觉到它的引用不同的瑞吉如果我检查esp的值,它本身就是0x1c,而不是ebp 。但是,如果我尝试检查0x1c或者esp + 0x1c处的内容,它告诉我我无法查看这些地址
因此,随着本书的继续,我无法遵循,因为它开始跟踪ebp,ebp-4等内容的踪迹,并且在我的asm中,ebp寄存器似乎没有任何事情发生。该书写于2008年,所以我不能想象它如此过时以至于gcc或gdb的版本更改会引入显着的更改(或者做到了这一点?)......是否有可能存在一些编译器优化或默认情况下打开的某些内容会产生这样的不同结果?
在此先感谢
编辑:奇怪。我尝试了每个建议,但没有成功。然后我做了a.out并重新编译为新的,现在它工作正常(指令与本书不同,但我可以查看与本书相对应的地址;只要我可以遵循相应的模式,一切都很好,不必是完全相同的asm,这只会让它太容易!) 再次感谢您的所有帮助和建议。
谢谢。本书使用的是32位英特尔版本,我都是用gcc编译的(我需要检查版本并更新qeustion),运行linux。本书基于Ubuntu(同样需要检查版本),我正在运行最新的Arch安装。 我会假设与相同的体系结构和相同的编译器(gcc)的机器代码将是相同的没有? 无论哪种方式,我觉得奇怪的是,一个值正在被初始化到我无法检查的地址,也奇怪它被$ esp引用,即堆栈指针... – speakingcode 2012-02-09 05:11:06
不,没有理由它应该是相同的。你可以用'-O0'或'-march = i386'来玩。但这完全不同,这并不奇怪。 – 2012-02-09 05:14:01