将C/C++代码转换为汇编语言

我们使用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
喜欢就支持一下吧
点赞6 分享