在 Linux/x86 中使用通用寄存器

Use of general-purpose registers in Linux/x86

这是一个一般性问题(例如 Linux 和 x86):

如果不调用系统调用,常规 C 程序将不会(隐式)使用任何通用寄存器,这是真的吗?

这个程序:

#include <stdio.h>

int main(int argc, char **argv) {
    printf("%d", argc);
}

生成此程序集:

    .section    __TEXT,__text,regular,pure_instructions
    .macosx_version_min 10, 10
    .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
    movl    %edi, %ecx
    leaq    L_.str(%rip), %rdi
    xorl    %eax, %eax
    movl    %ecx, %esi
    callq   _printf
    xorl    %eax, %eax
    popq    %rbp
    retq
    .cfi_endproc

    .section    __TEXT,__cstring,cstring_literals
L_.str:                                 ## @.str
    .asciz  "%d"


.subsections_via_symbols

这显然使用了通用寄存器 eaxecxesi。此外,请注意,此代码中没有系统调用,只是对 libc 的 _printf.

的函数调用