Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何阻止GCC优化asm调用?_C_Gcc_Optimization_Assembly - Fatal编程技术网

如何阻止GCC优化asm调用?

如何阻止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

我有一个家庭作业,我应该写一个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_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级是单步走。