在 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
这显然使用了通用寄存器 eax
、ecx
和 esi
。此外,请注意,此代码中没有系统调用,只是对 libc 的 _printf
.
的函数调用
这是一个一般性问题(例如 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
这显然使用了通用寄存器 eax
、ecx
和 esi
。此外,请注意,此代码中没有系统调用,只是对 libc 的 _printf
.