Caller Saved Register & Callee Saved Register
        
        
    2024-12-18 21:18:31+08:00
    Caller Saved Register & Callee Saved Register
在使用汇编编程时,调用间需要保存与恢复寄存器,这些寄存器可以由调用者保存恢复(Caller Saved Register)也可以由被调用者保存恢复(Callee Saved Register)。
由于调用者不知道哪些寄存器会被修改,因此只能将所有 Caller Saved Register 进行保存恢复,但这样做效率低下。
因此使用 Callee Saved Register 由被调用者根据需要保存和恢复会被改变的寄存器更常用。需要保存的寄存器如下:
| 架构 | 被调用者保存的寄存器 | 
|---|---|
| AMD64 | r12-r15, rbx, rsp, rbp | 
| aarch64 | r19-r29 SP v8-v15 | 
v8-v15 是 SIMD 寄存器,被调用者只需要保存低 64 位,高 64 位由调用者保存。
        Linux 64 位调用规约
        
        
    2024-12-18 21:18:31+08:00
    Linux 64 位调用规约
调用规约是在关于程序调用和返回的约定,参考维基百科。
x86_64
| 参数 | 寄存器 | 
|---|---|
| 整数或指针(1-6) | RDI, RSI, RDX, RCX, R8, R9 | 
| 浮点数(1-8) | XMM0 - XMM7 | 
| 更多参数 | 栈(SP) | 
| 整数返回值 | RAX | 
| 浮点数返回值 | XMM0 | 
RAX 的低 32 位为 EAX;EAX 的低 16 位为 AX;AX 的高 8 位为 AH,低8位为 AL。
aarch64
| 参数 | 寄存器 | 
|---|---|
| 64位整数或指针(1-8) | X0-X7 | 
| 32位整数 | W0-W7 | 
| 单精度浮点数(1-8) | S0-S7 | 
| 双精度浮点数(1-8) | D0-D7 | 
| 更多参数 | 栈(SP) | 
| 返回值 | X0 | 
        gcc 扩展汇编
        
        
    
    
2024-12-18 21:18:31+08:00