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的值相减后传送到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 指令只能用于寄存器之间传值,寄存器和内存之间传值通过 LDRSTR


作者: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;
}

参考:

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

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

ARM64指令简易手册 - 简书文章来源地址https://www.toymoban.com/news/detail-419173.html

到了这里,关于ARM64 寄存器、常用汇编指令收集的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【汇编中的寄存器分类与不同寄存器的用途】

    寄存器分类 在计算机体系结构中,8086CPU,寄存器可以分为以下几类: 1. 通用寄存器: 通用寄存器是用于存储数据和执行算术运算的寄存器。在 x86 架构中,这些通用寄存器通常包括 AX、BX、CX、DX、SI、DI、BP 和 SP。其中,AX、BX、CX 和 DX 寄存器可以分别作为累加器(accumulat

    2024年02月09日
    浏览(41)
  • 通用寄存器-汇编复习(1)

    弄清寄存器表达,原理和配件及汇编实验验证。 8086cpu寄存器,字在寄存器存储 往期文章: 汇编语言基础-汇编复习(0)_luozhonghua2000的博客-CSDN博客 一个典型的 CPU(此处讨论的不是某一具体的 CPU)由运算器、控制器、寄存器(CPU工作原理)等器件构成,这些器件靠内部总线相连。前

    2024年02月07日
    浏览(34)
  • 16位汇编通用寄存器

    1、输入命名debug,进入调试程序 2、r 命令显示寄存器 3、a命令输入汇编指令 4、t命令单步执行汇编指令 5.数据溢出后标志位NC 变为NY, 0变成1 最后A

    2023年04月11日
    浏览(48)
  • 【汇编语言】CS、IP寄存器

    理论:CPU执行何处的指令,取决于CS:IP 应用:程序员可以通过改变CS、IP中的内容,进行控制CPU即将要执行的目标指令; 问题:如何改变CS、IP中的值? 设想: 1、通过使用Debug中的R命令进行修改寄存器的值,例如rcs, rip。 结论:不可以。原因是:Debug是调试手段,并非程序方

    2024年02月08日
    浏览(38)
  • 汇编语言——第11章 标志寄存器

    目录 ​​​​​​​ 引言 11.1 ZF标志 11.2 PF标志 11.3 SF标志 检测点11.1 11.4 CF标志 11.5 OF标志 检测点11.2 11.6 abc指令 11.7 sbb指令 11.8 cmp指令 11.9 检测比较结果的条件转移指令 检测点11.3 11.10 DF标志和串传送指令 1、DF标志 2、串传送指令 11.11 pushf和popf 11.12 标志寄存器在Debug中的表示

    2024年02月07日
    浏览(32)
  • 8086汇编语言寄存器清零学习

    mov ax, 0      这样应清零了; sub ax, ax     这样也清了; xor ax, ax     这样也清零了;自己跟自己异或,异或是同则结果为0、不同结果为1;自己和自己,每一位都是相同的,异或后结果为0; and ax, 0     和0相与,这样也清零了; 自己写代码用 xor ax, ax ,用这个就对了,都

    2024年02月11日
    浏览(31)
  • 【汇编语言】栈区与SS:SP寄存器

    汇编语言 - 栈 栈是一块特殊的内存空间,本文涉及的CPU为8086CPU,所有与内存地址有关的数字皆为16进制 栈的运行规律 - 先进后出,后进先出 以下为入栈的过程: 以下是出栈的过程: 以上就是栈的运行机制,栈的入栈叫做push,出栈叫做pop 在8086CPU中,栈是一块特殊的内存空

    2023年04月08日
    浏览(47)
  • 寄存器内存读写指令(二) —— 多寄存器读写 LDM / STM

    有的时候,CPU可能会遇到 a++; b++; c++,这个时候为了提升效率,CPU可能会一次将多个寄存器里的变量保存到内存中。这个时候之前介绍的 LDR / STR 指令虽然也能实现,但只能操作一个寄存器的读写。 因此,考虑到这点,下面介绍多个寄存器的读写指令 将 多个寄存器 的数据写

    2024年02月07日
    浏览(48)
  • ARM寄存器组织

     ARM有37个32位长的寄存器: 1个用做PC(Program Counter); 1个用做CPSR(Current Program Status Register); 5个用做SPSR(Saved Program Status Registers); 30个通用寄存器。 ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄存器均为32位的寄存器。6个状态寄存器,用以标识CPU的工作状

    2024年02月01日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包