在Linux / x86

时间:2015-05-08 21:45:49

标签: linux linux-kernel cpu-registers

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

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

1 个答案:

答案 0 :(得分:1)

这个程序:

#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的函数调用。