X86_64 寄存器
rax:函数返回值
rsp:栈指针寄存器,指向栈顶
rdi:函数第一参数
rsi:函数第二参数
rdx:函数第三参数、I/O操作时提供外部设备接口的端口地址
rcx:函数第四参数、循环操作和字串处理的计数控制
r8:函数第五参数
r9:函数第六参数
注意一点:对于x86-64,当参数个数超过6时,前6个参数可以通过寄存器传递,而第7~n个参数则会通过栈传递,并且数据大小都向8的倍数对齐。也就是说,对于7~n个参数,依然满足从右往左入栈,只是对于前6个参数,它们是通过寄存器来传递的。另外,寄存器的访问速度相对于内存来说要快得多,因此为了提高空间和时间效率,实际中其实不建议参数超过6个。
rbx:基址寄存器,被调用者保护。
rbp:基址指针寄存器,用于提供堆栈内某个单元的偏移地址,与rss段寄存器联用,可以访问堆栈中的任一个存储单元,被调用者保存
r10, r11, r12, r13, r14, r15:用作数据存储,被调用者保护。
rip:指令指针寄存器,存放代码段中指令的偏移地址.
FR:(Flags Register)标志寄存器,用于存放反映处理器和运行程序执行结果状态的控制标志和条件码标志。
所谓调用者保存和被调用者保存:
- 调用者保存:
也叫易失性寄存器,在程序调用的过程中,这些寄存器中的值不需要被保存(即压入到栈中再从栈中取出),如果某一个程序需要保存这个寄存器的值,需要调用者自己压入栈。 - 被调用者保存:
也叫非易失性寄存器,在程序调用过程中,这些寄存器中的值需要被保存,不能被覆盖;当某个程序调用这些寄存器,被调用寄存器会先保存这些值然后再进行调用,且在调用结束后恢复被调用之前的值。