汇编基础(2) -- ARM64

这篇具有很好参考价值的文章主要介绍了汇编基础(2) -- ARM64。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

ARM架构中,ARM64(也称为AArch64)是一种64位处理器架构,它是ARMv8指令集的一部分。与之前的32位ARM架构相比,ARM64提供了更大的寄存器容量、更广阔的地址空间和更高的计算能力。

64位版本的指令集和32位版本的指令集有一些区别,这些区别主要涉及到以下几个方面:

  • 寄存器:ARM64架构提供了31个通用寄存器,每个寄存器的容量为64位。相比之下,32位ARM架构只有16个通用寄存器,每个寄存器的容量为32位。

  • 操作数大小:在ARM64架构中,所有数据都是以64位的形式进行处理。相比之下,32位ARM架构只能处理32位的整数和单精度浮点数。

  • 内存地址空间:在ARM64架构中,虚拟地址空间最大可达256TB,可以同时支持多达4亿个进程。相比之下,32位ARM架构只支持最大4GB的虚拟地址空间,并且最多只能支持4096个进程。

  • 执行速度:由于ARM64架构的寄存器容量更大、操作数更大,所以在大多数情况下,ARM64指令集的执行速度比32位ARM指令集更快。

  • 兼容性:ARM64架构与32位ARM架构不兼容,因此32位的应用程序不能在ARM64架构的处理器上直接运行。文章来源地址https://www.toymoban.com/news/detail-730591.html

寄存器

寄存器 说明
x0-x7 通用寄存器,用于函数参数传递和返回值存储
x8 通用寄存器,可用作附加参数传递
x9-x15 通用寄存器,用于临时数据存储
x16 通用寄存器,可用作线程/进程本地数据存储区域指针
x17 通用寄存器,可用作异常链接寄存器
x18 通用寄存器,可用作平台相关寄存器
x19-x28 通用寄存器,用于临时数据存储
x29 (fp) 帧指针寄存器,用于保存当前函数的帧指针
x30 (lr) 链接寄存器,用于保存返回地址
sp 栈指针寄存器,指向当前栈顶位置
pc 程序计数器寄存器,存储下一条要执行的指令的地址
cpsr 当前程序状态寄存器,保存处理器的当前状态信息,如条件标志位、中断使能位、处理模式等
nzcv 零、负、进位和溢出条件标志位,记录上一条指令结果的状态
f0-f31 浮点寄存器,用于浮点运算
v0-v31 矢量寄存器,用于SIMD(单指令多数据)操作
w0 32位宽的低位部分,对应于x0寄存器
s0 16位宽的低位部分,对应于x0寄存器的低16位
b0 8位宽的最低字节部分,对应于x0寄存器的最低字节

指令

指令类型 示例指令 说明
数据传输 LDR X0, [X1] 从内存中加载数据到寄存器
STR X0, [X1] 将寄存器中的数据存储到内存
算术运算 ADD X0, X1, X2 将两个寄存器中的值相加
SUB X0, X1, X2 将两个寄存器中的值相减
逻辑运算 AND X0, X1, X2 将两个寄存器中的值进行按位与
ORR X0, X1, X2 将两个寄存器中的值进行按位或
控制流 B label 分支到标签处执行
BL label 分支并且保留返回地址
CMP X0, X1 比较两个寄存器中的值
BEQ label 如果上一次比较结果为相等,则分支到标签处执行
B label 无条件跳转到标签处执行
BL label 分支与链接 跳转到标签处执行,并保存返回地址
BR Xn 无条件跳转到寄存器Xn中存储的地址
B.cond label 根据特定条件进行跳转
BLR Xn 无条件跳转到寄存器Xn中存储的地址,并保存返回地址
BR Xn 无条件跳转到寄存器Xn中存储的地址,并恢复返回地址及上下文
BLR Xn 跳转到寄存器Xn中存储的地址,并保存返回地址及上下文
乘法和除法 MUL X0, X1, X2 将两个寄存器中的值相乘
SDIV X0, X1, X2 将两个寄存器中的值相除
浮点运算 FADD D0, D1, D2 将两个浮点寄存器中的值相加
FSUB D0, D1, D2 将两个浮点寄存器中的值相减
FMUL D0, D1, D2 将两个浮点寄存器中的值相乘
FDIV D0, D1, D2 将两个浮点寄存器中的值相除
压栈 STP X0, X1, [SP, #-16]! 将两个寄存器的值压入栈中
STR X0, [SP, #-8]! 将一个寄存器的值压入栈中
出栈 LDP X0, X1, [SP], #16 从栈中弹出两个寄存器的值
LDR X0, [SP], #8 从栈中弹出一个寄存器的值
设置栈指针 MOV SP, X0 将指定寄存器的值设置为栈指针
获取栈指针 MOV X0, SP 将栈指针的值保存到指定寄存器

实例分析

  • 包含if语法的函数:
int ifFunction(int x, int y) {
    int result;
    if (x > y) {
        result = x + y;
    } else {
        result = x - y;
    }
    return result;
}

ifFunction:
    cmp x0, x1      // 比较 x 和 y
    ble else_label  // 如果 x <= y,跳转到 else_label 标签处
    add x0, x0, x1  // 如果 x > y,执行 x + y
    ret             // 返回结果
else_label:
    sub x0, x0, x1  // 如果 x <= y,执行 x - y
    ret             // 返回结果

  • 包含for语法的函数:
int forFunction(int n) {
    int sum = 0;
    for (int i = 1; i <= n; i++) {
        sum += i;
    }
    return sum;
}

forFunction:
    mov w1, 1       // 将 1 赋值给寄存器 w1,作为循环计数器 i 的初始值
    mov w0, 0       // 将 0 赋值给寄存器 w0,作为累加和 sum 的初始值
loop:
    add w0, w0, w1  // 累加计数器 i 的值到累加和 sum
    add w1, w1, 1   // 计数器 i 自增 1
    cmp w1, x0      // 比较计数器 i 和 n 的值
    ble loop        // 如果 i <= n,跳转到 loop 标签处继续循环
    ret             // 返回累加和 sum

  • 包含switch语法的函数:
int switchFunction(int x) {
    int result;
    switch (x) {
        case 1:
            result = 10;
            break;
        case 2:
            result = 20;
            break;
        case 3:
            result = 30;
            break;
        default:
            result = -1;
    }
    return result;
}

switchFunction:
    cmp w0, 1       // 比较寄存器 w0(x)的值与每个 case 的值
    b.eq case_1     // 如果相等,跳转到 case_1 标签处
    cmp w0, 2
    b.eq case_2
    cmp w0, 3
    b.eq case_3
    mov w0, -1      // 默认情况下,将 -1 赋值给寄存器 w0(result)
    ret
case_1:
    mov w0, 10      // 如果 x == 1,将 10 赋值给寄存器 w0(result)
    ret
case_2:
    mov w0, 20      // 如果 x == 2,将 20 赋值给寄存器 w0(result)
    ret
case_3:
    mov w0, 30      // 如果 x == 3,将 30 赋值给寄存器 w0(result)
    ret

参考

到了这里,关于汇编基础(2) -- ARM64的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【ARM64 常见汇编指令学习 13 -- ARM 汇编 ORG 伪指令学习】

    上篇文章:ARM64 常见汇编指令学习 12 – ARM 汇编函数 的学习 下篇文章:ARM64 常见汇编指令学习 14 – ARM 汇编 .balign,.balignw,.balign 伪指令学习 在ARM汇编中,\\\" org \\\"是一个汇编器伪指令,用于设置下一条指令的装入地址。\\\" org \\\"后面跟着的是一个表达式,这个表达式的值就是下一条

    2024年02月14日
    浏览(50)
  • 【ARM 常见汇编指令学习 5 -- arm64汇编指令 wzr 和 xzr】

    上篇文章:ARM 常见汇编指令学习 4 – ARM64 比较指令 cbnz 与 b.ne 区别 下篇文章:ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或) ARMv8 在硬件层名引入了一个新的 zero 寄存器 : XZR (64-bits), WZR (32-bits)。比如要将某一变量赋值为0x0, 由于ARM不允许直接操作内存单元上的数据

    2024年02月15日
    浏览(101)
  • ARM64汇编04 - 条件码

    关于分支控制与条件码的作用可以去看 《CSAPP》的第 3.6 节,讲的非常清楚,建议看看,这里就不重复了。 我们直接使用一个例子来简单理解汇编是如何实现分支控制的: 编译后,使用 ida 打开,查看其核心逻辑: 1处的 w19 与 w20 储存着 a 与 b 的值,CMP 会对这两个值做比较。

    2024年03月11日
    浏览(45)
  • 【ARM64 常见汇编指令学习 14 -- ARM 汇编 .balign,.balignw,.balign 伪指令学习】

    上篇文章:ARM64 常见汇编指令学习 13 – ARM 汇编 ORG 伪指令学习 下篇文章:ARM64 常见汇编指令学习 15 – ARM 标志位的学习 .balignl 是一个伪操作符,伪操作符的意思就是机器码里,并没有一个汇编指令与其对应,是编译器来实现其功能的。. balignl 是 .balign 的变体。 .balignl 完整

    2024年02月14日
    浏览(47)
  • 【ARM64 常见汇编指令学习 21 -- ARM RET 与 ERET】

    请阅读 【嵌入式开发学习必备专栏 】 在 ARMv8 架构中, RET 指令用于从函数或者过程返回。它主要负责从当前过程跳转回调用者,并恢复调用者的程序计数器 (PC) 的值。 语法: Xn 是一个可选的寄存器,通常为 X30 (也称为 LR ,链接寄存器),其中包含返回地址。如果没有指

    2024年04月10日
    浏览(168)
  • ARM64 寄存器、常用汇编指令收集

    ARM64 有34个寄存器,包括31个通用寄存器、SP、PC、CPSR。 寄存器 位数 描述 x0-x30 64bit 通用寄存器,如果有需要可以当做32bit使用:WO-W30 FP(x29) 64bit 保存栈帧地址(栈底指针) LR(x30) 64bit 通常称X30为程序链接寄存器,保存子程序结束后需要执行的下一条指令 SP 64bit 保存栈指针,使用

    2023年04月20日
    浏览(44)
  • 【ARM64 常见汇编指令学习 20 -- ARM 指令 .include与 .asciz 详细介绍】

    在 ARM 汇编语言中, .include 命令用于插入另一个源文件的内容。它的作用类似于 C 语言中的 #include 预处理命令。这个命令通常在源文件的顶部使用,但也可以在任何地方使用。 语法如下: 这里的 \\\"filename\\\" 是你想要包含的文件名。这个文件名可以是绝对路径,也可以是相对于

    2024年02月11日
    浏览(58)
  • 【ARM 常见汇编指令学习 3 -- ARM64 无符号位域提取指令 UBFX】

    上篇文章:ARM 常见汇编指令学习 2 – 存储指令 STP 与 LDP 下篇文章:ARM 常见汇编指令学习 4 – ARM64 比较指令 cbnz 与 b.ne 区别 在代码中如何监控寄存器的某1bit, 或者某几bit ? ARM 提供了一个汇编指令:UBFX 就可以用于该功能。 UBFX 有2种语法分别是对32bit 寄存器和64bit寄存器。

    2024年02月15日
    浏览(40)
  • 【ARM 常见汇编指令学习 4 -- ARM64 比较指令 cbnz 与 b.ne 区别】

    上篇文章:ARM 常见汇编指令学习 3 – ARM64 无符号位域提取指令 UBFX 下篇文章:ARM 常见汇编指令学习 5 – arm64汇编指令 wzr 和 xzr B.NE 指令格式 B.NE指令的含义是:如果上一个指令的结果不等于零(即条件标志位Z为0),那么跳转到指定的地址。如果结果等于零,则继续执行下一

    2024年02月14日
    浏览(79)
  • ARM 汇编基础知识

            我们在进行嵌入式 Linux 开发的时候是绝对要掌握基本的 ARM 汇编,因为 Cortex-A 芯片一 上电 SP 指针还没初始化, C 环境还没准备好,所以肯定不能运行 C 代码,必须先用汇编语言设置好 C 环境,比如初始化 DDR 、设置 SP 指针等等,当汇编把 C 环境设置好了以后才可

    2024年02月09日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包