【发布时间】:2019-07-05 15:33:16
【问题描述】:
这是一个简单的 C 代码
#include <stdio.h>
int a = 5;
static int b = 20;
int main(){
int c = 30;
return 0;
}
编译后没有优化:
.section __TEXT,__text,regular,pure_instructions
.macosx_version_min 10, 13
.globl _main ## -- Begin function main
.p2align 4, 0x90
_main: ## @main
.cfi_startproc
## %bb.0:
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset %rbp, -16
movq %rsp, %rbp
.cfi_def_cfa_register %rbp
xorl %eax, %eax
movl $0, -4(%rbp)
movl $30, -8(%rbp)
popq %rbp
retq
.cfi_endproc
## -- End function
.section __DATA,__data
.globl _a ## @a
.p2align 2
_a:
.long 5 ## 0x5
我的问题是static int b = 20; 在上面的程序集中在哪里?
我知道它们应该在内存的全局部分,但我在编译版本中找不到它。
【问题讨论】:
-
可能无处可去?编译器可能已将其删除,因为您没有使用它。
-
“未启用优化”并不意味着“不对我的代码进行任何转换”。只需来自
main的return b,您就会看到它出现。 -
如果编译器不接触代码,它将输出 C 代码而不是汇编代码,它不会比
cat更有用。无论如何,显然即使-O0也做了一些 优化,这些优化对于编译器来说非常简单明了。 -
@Joe 编译成数字 20 对应的汇编代码是什么,没有以任何方式使用?
-
@DavidSchwartz:它有
_a: .long 5用于未使用的全局变量。 OP 正在查看编译器的完整汇编语言输出,而不仅仅是 机器代码助记符 + 操作数。如果 asm 源中存在数据,也必须将数据组装到(通常是其他部分)输出文件中。