赞
踩
ARM64 有34个寄存器,包括31个通用寄存器、SP、PC、CPSR。
寄存器 | 位数 | 描述 |
---|---|---|
x0-x30 | 64bit | 通用寄存器,如果有需要可以当做32bit使用:WO-W30 |
FP(x29) | 64bit | 保存栈帧地址(栈底指针) |
LR(x30) | 64bit | 通常称X30为程序链接寄存器,保存子程序结束后需要执行的下一条指令 |
SP | 64bit | 保存栈指针,使用 SP/WSP来进行对SP寄存器的访问。 |
PC | 64bit | 程序计数器,俗称PC指针,总是指向即将要执行的下一条指令,在arm64中,软件是不能改写PC寄存器的。 |
CPSR | 64bit | 状态寄存器 |
x0-x7: 用于子程序调用时的参数传递,X0还用于返回值传递
x0 - x30
是31个通用整形寄存器。每个寄存器可以存取一个64位大小的数。 当使用 x0 - x30
访问时,它就是一个64位的数。当使用 w0 - w30
访问时,访问的是这些寄存器的低32位,如图:
CPSR(状态寄存器)
NZCV是状态寄存器的条件标志位,分别代表运算过程中产生的状态,其中:
- N, negative condition flag,一般代表运算结果是负数
- Z, zero condition flag, 指令结果为0时Z=1,否则Z=0;
- C, carry condition flag, 无符号运算有溢出时,C=1。
- V, oVerflow condition flag 有符号运算有溢出时,V=1。
作者:thinkq
链接:https://www.jianshu.com/p/2f4a5f74ac7a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- MOV X1,X0 ;将寄存器X0的值传送到寄存器X1
- ADD X0,X1,X2 ;寄存器X1和X2的值相加后传送到X0
- SUB X0,X1,X2 ;寄存器X1和X2的值相减后传送到X0
-
- AND X0,X0,#0xF ; X0的值与0xF相位与后的值传送到X0
- ORR X0,X0,#9 ; X0的值与9相位或后的值传送到X0
- EOR X0,X0,#0xF ; X0的值与0xF相异或后的值传送到X0
-
- LDR X5,[X6,#0x08] ;ld:load; X6寄存器加0x08的和的地址值内的数据传送到X5
- LDP x29, x30, [sp, #0x10] ; ldp :load pair ; 一对寄存器, 从内存读取数据到寄存器
- ldp x1, x2, [x10, #0x10] // 从 x10 + 0x10 指向的地址里面取出 2个 64位的数,分别存入x1, x2
- ldp x29, x30, [sp], #16 // 从sp地址取出 16 byte数据,分别存入x29, x30. 然后 sp+=16;
-
- STR X0, [SP, #0x8] ;st:store,str:往内存中写数据(偏移值为正); X0寄存器的数据传送到SP+0x8地址值指向的存储空间
- STUR w0, [x29, #-0x8] ;往内存中写数据(偏移值为负)
- STP x29, x30, [sp, #0x10] ;store pair,存放一对数据, 入栈指令
-
- CBZ ;比较(Compare),如果结果为零(Zero)就转移(只能跳到后面的指令)
- CBNZ ;比较,如果结果非零(Non Zero)就转移(只能跳到后面的指令)
- CMP ;比较指令,相当于SUBS,影响程序状态寄存器CPSR
-
- B ;跳转指令,可带条件跳转与cmp配合使用
- BL ;带返回的跳转指令, 返回地址保存到LR(X30)
- BLR ; 带返回的跳转指令,跳转到指令后边跟随寄存器中保存的地址(例:blr x8 ;跳转到x8保存的地址中去执行)
- RET ;子程序返回指令,返回地址默认保存在LR(X30)

其中 MOV
指令只能用于寄存器之间传值,寄存器和内存之间传值通过 LDR
和 STR
作者:thinkq
链接:https://www.jianshu.com/p/2f4a5f74ac7a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
此类指令向通用寄存器或者从通用寄存器往外移动状态寄存器的内容。
- 1、MRS指令(从 PSR 移动到寄存器)
- 格式:MRS{条件} 通用寄存器 程序状态寄存器(CPSR或SPSR)
- 解释:MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下两种情况:
- Ⅰ.当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
- Ⅱ.当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。
- 示例:
- MRS R0,CPSR ;传送CPSR的内容到R0
- MRS R0,SPSR ;传送 SPSR的内容到R0
-
- 2、MSR指令(从寄存器移动到 PSR)
- 格式:MSR{条件} 程序状态寄存器(CPSR或SPSR)_<域>,操作数
- 解释:MSR指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。<域>用于设置程序状态寄存器中需要 操作的位,32位的程序状态寄存器可分为4个域:
- 位[31:24]为条件位域,用f表示;
- 位[23:16]为状态位域,用s表示;
- 位[15:8] 为扩展位域,用x表示;
- 位[7:0] 为控制位域,用c表示;
- 该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。
- 示例:
- MSR CPSR,R0 ;传送R0的内容到CPSR
- MSR SPSR,R0 ;传送R0的内容到SPSR
- MSR CPSR_c,R0 ;传送R0的内容到SPSR,但仅仅修改CPSR中的控制位域

作者:Tenloy
链接:https://www.jianshu.com/p/b9301d02a125
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
linux 4.19.113内核diam:arch_local_irq_save
/*
* CPU interrupt mask handling.
*/
static inline unsigned long arch_local_irq_save(void)
{
unsigned long flags;
asm volatile(
"mrs %0, daif // arch_local_irq_save\n"
"msr daifset, #2"
: "=r" (flags)
:
: "memory");
return flags;
}
参考:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。