我们使用g ++编译器将提供的C代码转换为汇编语言。要查看C编译器生成的汇编代码,我们可以在命令行上使用“ -S”选项:
句法:
$ gcc -S filename.c
这将导致gcc运行编译器,生成一个程序集文件。假设我们编写了一个C代码并将其存储在文件名“ geeks.c”中。
// C code stored in geeks.c file
#include
// global string
char s[] = "GeeksforGeeks";
// Driver Code
int main()
{
// Declaring variables
int a = 2000, b =17;
// Printing statement
printf("%s %d \n", s, a+b);
}
运行命令:
$ gcc -S geeks.c
这将使gcc运行编译器,并生成一个汇编文件geeks.s ,并且不再进行。 (通常,它随后将调用汇编器以生成目标代码文件。)
汇编代码文件包含各种声明,包括以下行集:
.section __TEXT, __text, regular, pure_instructions
.macosx_version_min 10, 12
.globl _main
.align 4, 0x90
_main: ## @main
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp0:
.cfi_def_cfa_offset 16
Ltmp1:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp2:
.cfi_def_cfa_register %rbp
subq $16, %rsp
leaq L_.str(%rip), %rdi
leaq _s(%rip), %rsi
movl $2000, -4(%rbp) ## imm = 0x7D0
movl $17, -8(%rbp)
movl -4(%rbp), %eax
addl -8(%rbp), %eax
movl %eax, %edx
movb $0, %al
callq _printf
xorl %edx, %edx
movl %eax, -12(%rbp) ## 4-byte Spill
movl %edx, %eax
addq $16, %rsp
popq %rbp
retq
.cfi_endproc
.section __DATA, __data
.globl _s ## @s
_s:
.asciz "GeeksforGeeks"
.section __TEXT, __cstring, cstring_literals
L_.str: ## @.str
.asciz "%s %d \n"
.subsections_via_symbols
上面的代码中的每条缩进行都对应一条机器指令。例如, pushq指令指示应将寄存器%rbp的内容压入程序堆栈。有关局部变量名称或数据类型的所有信息已被剥离。我们仍然看到对全球的参考
变量s [] =“ GeeksforGeeks” ,因为编译器尚未确定此变量将存储在内存中的哪个位置。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。