关于GCC 7.5从C代码生成的汇编代码的问题[重复]

问题描述 投票:0回答:1

我有一个简单的C代码,可以通过GCC 7.5生成汇编代码:

void swap(int* a, int* b)
{
    int c;
    c = *a;
    *a = *b;
    *b = c;
}
int main()
{
    int a = 16, b = 32;
    swap(&a, &b);
    return 0;
}

我使用此命令获取汇编代码:gcc -Wall -S -o main.s main.c,在main.s中找到以下行:

main:
.LFB1:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    subq    $16, %rsp            #line 9
    movq    %fs:40, %rax         #line 10
    movq    %rax, -8(%rbp)       #line 11
    xorl    %eax, %eax           #line 12
    ......

我有两个问题:

  1. 为什么subq的第一个操作数在第9行是16?我只宣告2整数变量,我认为应该是8
  2. 代码行是什么10到12在干什么它似乎与我的C没有任何关系程序
assembly gcc x86-64
1个回答
0
投票

我只有问题2的答案

第10行到第12行正在返回您的代码。

第12行

xorl正在将您的返回寄存器清零。在这种情况下,返回寄存器为eax。对应于0。

第11行

rbp是返回基本指针。它指示堆栈指向的位置。但是在这里,我们采用-8,即rip,即重新运行地址。

第10行

FS寄存器与线程信息块对齐,该线程信息块包含各种特定于线程的信息。

© www.soinside.com 2019 - 2024. All rights reserved.