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

📅  最后修改于: 2021-05-25 20:04:53             🧑  作者: Mango

我们使用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基础课程》。