1.用户模式的系统调用依次传递的寄存器为:
rdi,rsi,rdx,rcx,r8和r9;
2.内核接口的系统调用一次传递的寄存器为:
rdi,rsi,rdx,r10,r8和r9;注意这里和用户模式的系统调用只有第4个寄存器不同,其他都相同。
3.系统调用通过syscall指令进入,不像32位下的汇编使用的是int 0x80指令;
4.系统调用号放在rax寄存器里;
5.系统调用限制最多6个参数;
6.系统调用的返回结果,也就是syscall指令的返回放在rax寄存器中;
7.只有整形值和内存型的值可以传递给内核
测试代码:
.data
msg : .string "Hello, World! Linux 64bit\n"
len = . - msg
.text
.global _start
_start:
mov $1, %rax #write 系统调用
mov $1, %rdi #fd:1 stdout
mov $msg, %rsi #string msg
mov $len, %rdx #len 长度
syscall
mov $60, %rax #exit 系统调用
mov $0, %rdi #参数
syscall
编译
as -o hello64.o hello64.s
ld -s -o hello64 hello64.o
输出:
Hello, World! Linux 64bit
32bit 寄存器 | 64bit 寄存器 |
eax | rax |
ebx | rbx |
ecx | rcx |
edx | rdx |
esi | rsi |
edi | rdi |
esp | rsp |
ebp | rbp |
r8 | |
r9 | |
r10 | |
r11 | |
r12 | |
r13 | |
r14 | |
r15 | |
eax(ax, ah, al) | r8d ,r8w, r8b |
32 , 16, 8, 8 | 32, 16, 8 |