我正在大学从事Pintos玩具操作系统,但使用GCC 4.6.2时有一个奇怪的错误。当我推动我的系统调用参数(在内联汇编中只有3个pushl-s)时,一些神秘的数据也出现在堆栈中,并且参数的顺序错误。设置-fno-omit-frame-pointer摆脱了奇怪的数据,但参数仍然是错误的顺序。 GCC 4.5工作正常。知道具体的选项可以解决这个问题吗?
注意:-O0仍会出现问题。
答案 0 :(得分:1)
如果没有代码示例以及来自不同编辑的结果列表,则很难为您提供帮助。但是,这有三个可能的原因导致您的问题:
printf(char *, ...)
可以检查第一项以找出其中有多少项。如果您想调用函数int foo(int a, int b, int c)
,则需要按 c ,然后 b ,最后 a 。volatile
/ __volatile__
。否则,GCC在优化时可以移动它。我需要查看您的代码,以便更好地了解正在发生的事情。
答案 1 :(得分:0)
罪魁祸首是-fomit-frame-pointer,自4.6.2以来默认启用。 -fno-omit-frame-pointer解决了这个问题。
答案 2 :(得分:0)
你是否在系统调用后清理堆栈上的参数? gcc可能没有意识到你触摸堆栈并生成代码取决于它预期的堆栈指针。 -fno-omit-frame-pointer强制gcc使用e / rbp访问定位数据,但它只是隐藏了实际问题。