如何阻止GCC优化asm调用?
我有一个家庭作业,我应该写一个c程序,显示传递给控制台调用堆栈中以前函数的参数。我有一段代码:如何阻止GCC优化asm调用?,c,gcc,optimization,assembly,C,Gcc,Optimization,Assembly,我有一个家庭作业,我应该写一个c程序,显示传递给控制台调用堆栈中以前函数的参数。我有一段代码: struct stack_frame { struct stack_frame* next; }; typedef struct stack_frame stack_frame; void recover() { register stack_frame* sfptr __asm__("ebp"); stack_frame * frame = sfptr; traverse
struct stack_frame
{
struct stack_frame* next;
};
typedef struct stack_frame stack_frame;
void recover()
{
register stack_frame* sfptr __asm__("ebp");
stack_frame * frame = sfptr;
traverse_stack(frame, show_bytes);
}
对函数foo(int,short,char)的多次递归调用发生在对recover()的调用之前,该调用启动堆栈遍历,从而将参数输出到所有以前对foo的调用
当我使用GCC4.8.2编译它时,没有进行优化,它运行得非常好。对于-O1,它会中断,因为帧被分配了一个无法访问的地址。0xFFFFD9。我相信这是因为asm正在得到优化
我尝试了许多其他方法来获取ebp寄存器的值,包括
stack_frame frame;
asm volatile("movl %%ebp, %0\n" : "=r"(frame->next));
还有很多其他的。我已经试着添加了重击。我还尝试将frame指定为volatile。我已经看过很多关于这个主题的帖子,包括[问题]:和其他。不管我做了什么,我都是赛格弗劳特城的国王
segfault发生在以下位置:
void traverse_stack(stack_frame* frame, byte_processor show_bytes)
{
if (frame->next != NULL) // segfault here!!!!!!!
traverse_stack(frame, show_bytes);
show_args(frame, show_bytes);
}
show_bytes只是一个函数指针,指向两个函数中的一个,这两个函数将以十六进制形式显示big或little-endian系统中的字节
无论如何,我必须用-m32编译。我没有提供任何附加参数的选择
非常感谢您的帮助。另外,我是一个新手,所以如果可能的话,请温柔地回答。提前感谢。我不确定堆栈帧是否总是以其上一个帧指针开始。您只是想确保,您实际上正在反汇编生成的代码,并在测试此代码时在程序集级别单步执行调试器,对吗?我只是觉得你只是在编译和运行它,并观察segfrult,这就像试图通过放火烧鸡舍来做煎蛋。或者其他一些丰富多彩的比喻。-fno省略框架指针?@放松:我很遗憾地说,我确实在尝试烹饪煎蛋。如果我在组装级别上通过,我将很难破译我所看到的内容。我在c级是单步走。