ARM 64协程切换上下文的汇编代码解读
贺志国
2023.8.11
在ARM 64位架构中,有一组通用寄存器(General Purpose Registers)、一组浮点寄存器(Floating-point Registers)和一组特殊寄存器(Special Registers)。
通用寄存器(x0-x30)是用于存储数据和计算结果的寄存器。这些寄存器可以用于存储整数、指针和地址等数据。其中,寄存器x0-x7有特殊用途,例如x0通常用于存储函数的返回值,x1-x7用于传递函数参数。
与通用寄存器类似,浮点寄存器也有一定的编号规律。在ARM 64位架构中,浮点寄存器从d0到d31,共有32个。这些寄存器可以用于存储和进行浮点数计算。ARM 64位架构支持SIMD(Single Instruction Multiple Data)指令集,用于高效地进行向量化计算。在汇编语言中,可以使用特定的寄存器名称来引用浮点寄存器,例如d0表示浮点寄存器0,d8表示浮点寄存器8等。在编写ARM 64位汇编代码时,可以使用这些浮点寄存器进行浮点数的加载、存储和运算操作。
特殊寄存器包括:
程序计数器(Program Counter,PC):存储下一条将要执行的指令的地址。
栈指针(Stack Pointer,SP):指向当前栈的顶部。
链接寄存器(Link Register,LR):存储函数调用前的返回地址。
状态寄存器(Condition Flags):存储比较和算术操作的结果。
程序状态寄存器(Program Status Register,PSR):存储处理器的运行状态和控制位。
上述寄存器在汇编语言中通过特定的寄存器名称来引用,例如x0代表通用寄存器0,d8表示浮点寄存器8,sp代表栈指针寄存器,pc代表程序计数器等。
以下是一段ARM 64协程切换上下文的汇编代码:
.text; ; 以下是代码段
.align 4 ; 按2^4=16字节的倍数对齐地址,空隙默认用0来填充
.globl ctx_swap ; 全局入口函数是ctx_swap
; 以下单个寄存器和内存变量的空间均为64位(8字节)
ctx_swap: ; 定义全局函数ctx_swap
stp x0, x30, [sp,#-16]! ; 将x0, x30的值存储到sp - 16的地址上,并且执行sp -= 16
stp d8, d9, [sp,#-16]! ; 将d8, d9的值存储到sp - 16的地址上,并且执行sp -= 16
stp d10, d11, [sp,#-16]! ; 将d10, d11的值存储到sp - 16的地址上,并且执行sp -=