回顾深入理解计算机的时候,发现他里面提到的 -Og 选项虽然可以能够保留代码的整体结构 但是当我对一些最简单的指令进行测试的时候,发现gcc编译器直接把他们全部优化掉了。
-O0 选项也没有什么用
有什么好的解决办法吗?
int main()
{
goto end;
end:
return 0;
}
比如我就想要观察一下这个 goto 生成的指令细节(jg jmp之类的)
回顾深入理解计算机的时候,发现他里面提到的 -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
看来还是死循环才行(笑),谢谢你!
如果这样呢?
int main()
{
goto end;
printf("hello\n");
end:
return 0;
}
当然也行,主要是我不还没有搞懂 CALL 出栈 入栈这些东西(实力不够,哈哈哈哈)