【咨询】如何让gcc生成的汇编代码“原汁原味”?

回顾深入理解计算机的时候,发现他里面提到的 -Og 选项虽然可以能够保留代码的整体结构 但是当我对一些最简单的指令进行测试的时候,发现gcc编译器直接把他们全部优化掉了。

-O0 选项也没有什么用

有什么好的解决办法吗?

int main()
{
goto end;
end:
return 0;
}

比如我就想要观察一下这个 goto 生成的指令细节(jg jmp之类的)

测试了一下,应该是可以看到 jmp 之类的汇编指令

// test.c
int main()
{
 end:
  goto end;  // 这一行挪了位置
  return 0;
}

gcc -S -masm=intel  test.c
;; test.s

        .file   "test.c"
        .intel_syntax noprefix
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        push    rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        mov     rbp, rsp
        .cfi_def_cfa_register 6
.L2:
        jmp     .L2  ;; jmp 指令
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Debian 8.3.0-6) 8.3.0"
        .section        .note.GNU-stack,"",@progbits

gcc Manual

1 个赞

看来还是死循环才行(笑),谢谢你!

如果这样呢?

int main()
{
  goto end;
  printf("hello\n");
end:
  return 0;
}
1 个赞

当然也行,主要是我不还没有搞懂 CALL 出栈 入栈这些东西(实力不够,哈哈哈哈)