我们使用g++编译器将提供的C代码转换为汇编语言。要查看C编译器生成的汇编代码,我们可以使用 “-S” 命令行上的选项:
null
语法:
$ gcc -S filename.c
这将导致gcc运行编译器,生成一个程序集文件。假设我们编写一个C代码并将其存储在一个名为“geeks.C”的文件中。
C
// C code stored in geeks.c file #include <stdio.h> // global string char s[] = "GeeksforGeeks" ; // Driver Code int main() { // Declaring variables int a = 2000, b =17; // Printing statement printf ( "%s %d " , s, a+b); } |
运行命令:
$ gcc -S geeks.c
这将导致gcc运行编译器,生成一个程序集文件 极客。s ,不要再往前走了。(通常它会调用汇编程序生成一个对象代码文件。) 汇编代码文件包含各种声明,包括一组行:
CPP
.section __TEXT, __text, regular, pure_instructions .macosx_version_min 10, 12 .global _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 .global _s ## @s _s: .asciz "GeeksforGeeks" .section __TEXT, __cstring, cstring_literals L_.str: ## @.str .asciz "%s %d " .subsections_via_symbols |
上述代码中的每一个缩进行对应一条机器指令。例如 普什克 指令指示寄存器的内容 %rbp 应该被推到程序堆栈上。关于局部变量名或数据类型的所有信息都已被删除。我们仍然看到对全球经济的提及 变量 s[]=“Geeksforgeks” ,因为编译器尚未确定该变量将存储在内存中的哪个位置。 本文由 萨希尔·拉吉普特 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END