> 文章列表 > ARM64 寄存器、常用汇编指令收集

ARM64 寄存器、常用汇编指令收集

ARM64 寄存器、常用汇编指令收集

寄存器

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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

ARM64经常用到的汇编指令

MOV    X1,X0         ;将寄存器X0的值传送到寄存器X1
ADD    X0,X1,X2     ;寄存器X1和X2的值相加后传送到X0
SUB    X0,X1,X2     ;寄存器X1和X2的值相减后传送到X0AND    X0,X0,#0xF    ; X0的值与0xF相位与后的值传送到X0
ORR    X0,X0,#9      ; X0的值与9相位或后的值传送到X0
EOR    X0,X0,#0xF    ; X0的值与0xF相异或后的值传送到X0LDR    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 指令只能用于寄存器之间传值,寄存器和内存之间传值通过 LDRSTR

作者:thinkq
链接:https://www.jianshu.com/p/2f4a5f74ac7a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

程序状态寄存器访问指令


此类指令向通用寄存器或者从通用寄存器往外移动状态寄存器的内容。

1、MRS指令(从 PSR 移动到寄存器)格式:MRS{条件}    通用寄存器 程序状态寄存器(CPSR或SPSR)解释:MRS指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下两种情况:Ⅰ.当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。Ⅱ.当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。示例:MRS R0,CPSR                         ;传送CPSR的内容到R0MRS R0,SPSR                         ;传送 SPSR的内容到R02、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的内容到CPSRMSR SPSR,R0        ;传送R0的内容到SPSRMSR 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;
}

参考:

ARM64 汇编——寄存器和指令 - 简书

汇编指令英文全称_dvlinker的博客-CSDN博客

ARM64指令简易手册 - 简书