汇编基础(2) -- ARM64

2023-11-07

简介

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架构的处理器上直接运行。

寄存器

寄存器 说明
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

参考

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汇编基础(2) -- ARM64 的相关文章

随机推荐

  • 让CPU画出图形(其实很简单的)

    本例子是当初微软的一个题目 希望windows任务管理器的CPU的占有率 是一个正旋曲线 如果是你 你会如何解决这个问题呢 先上图吧 由于cpu要处理其他电脑程序 只能画出来大概的模样 其实我当时想这个问题时候 是不是考虑对cpu进行操作
  • JS中Symbol的介绍

    1 引入Symbol类型的背景 ES5 的对象属性名都是字符串 这容易造成属性名冲突的问题 举例 使用别人的模块 对象 又想为之添加新的属性 这就容易使得新属性名与原有属性名冲突 2 Symbol类型简介 symbol是一种原始数据类型 其
  • 计算机网络---第五章传输层---UDP

    1UDP的端口号是53 需要应用层提供可靠性服务 2网络层的复分用指的是协议 传输层的复分用指的是进程 3UDP首部为8B 伪首部长度为12B 5使用UDP协议的原因在于要找到目的进程以及更加可靠 6IP电话实时媒体会议流媒体使用UDP 7
  • MySQL复习

    MySQL学习 1 初始MySQL 1 1 什么是数据库 数据库 DB BataBase 作用 存储数据 管理数据 1 2 数据库分类 关系型数据库 SQL MySQL Oracle sql Server 各个表之间 表中行和列之间的关系进
  • js对象属性的命名规范

    1 首先 我们要知道 js对象属性命名有三种方法 1 对象字面量形式命名 这时的属性 可以是任意的字符串 包括空串和空格字符串 也可以是js的变量形式 即以字母 下划线 开头 后面跟字母 数字 下划线和 还可以是纯数字 let obj a1
  • 华为服务器imana安装系统,华为服务器imana配置

    华为服务器imana配置 内容精选 换一换 当前 越来越多的软件采用微服务架构 构建一个产品时会大量使用微服务 不同微服务之间访问时涉及到域名访问 拥有自建IDC的企业 在使用CCE时通常需要在CCE集群与自建IDC之间通信 而且当IDC有
  • Python+Django实现基于人脸识别的门禁管理系统,附带源码!!

    已下项目为实战开发经验 微信搜索关注公众号 python语言空间 获取更多项目源码及资源 项目介绍 基于人脸识别的门禁管理系统 Python Django RESTframework JsonWebToken Redis Dlib 该项目为
  • redhat 红帽7.8安装教程(图文超详细)

    1 打开vm创建 点击创建虚拟机 选择Linux 红帽7系列版本 这个网络类型无所谓 后期还可以改 方向键上下来控制选择第一个 然后按enter Ctrl Alt可以把光标从虚拟机中拉出来 后边还需要创建新的一个用户 密码需要有高安全性
  • 一、在linux下安装jenkins

    前提 在linux中已经安装了jdk 1 安装jenkins的方式一 直接使用命令下载 官网 https pkg origin jenkins io redhat sudo wget O etc yum repos d jenkins re
  • 面试题:有一个箱子容积为v,同时有n个物品,每个物品有一个体积。要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间最小。

    面试题 有一个箱子容积为v 同时有n个物品 每个物品有一个体积 要求从n个物品中 任取若干个装入箱内 使箱子的剩余空间最小 输入 箱子的容积 v 物品个数 n 每个物品占的空间 x1 x2 xn 输出 最小剩余空间 s 解题思路 背包类动态
  • SpringCloud服务调用(RestTemplate)

    文章目录 RestTemplate介绍 RestTemplate方法介绍 RestTemplate调用微服务 使用微服务架构的分布式系统 微服务之间通过网络通信 我们通过服务提供者与服务消费者来描述微服务间的调用关系 服务提供者 服务的被调
  • 桌面在计算机的路径,电脑桌面文件存放路径

    电脑桌面存放的文件路径 系统默认配置是这样的 sytemroot Documents and Settings 用户名 桌面 要想某个登录账户的桌面文件放到桌面的时候实际存储在非系统分区下的任意路径该如何操作呢 解决办法是 修改注册表法如下
  • 腾讯云服务器镜像TencentOS Server操作系统详细介绍

    腾讯云TencentOS Server镜像是腾讯云推出的Linux操作系统 完全兼容CentOS生态和操作方式 TencentOS Server操作系统为云上运行的应用程序提供稳定 安全和高性能的执行环境 TencentOS可以运行在腾讯云
  • webpack5区分生产环境打包文件(通过环境变量区分)

    webpack5区分生产环境打包文件 package json name webpeck version 1 0 0 description main index js scripts test echo Error no test spe
  • JAVA排查bug的相关命令

    jamp 主要用于打印指定Java进程 或核心文件 远程调试服务器 的共享对象内存映射或堆内存细节 举例 root iZwz9hv1phm24s3jicy8x1Z crm ps ef grep java root 2529802 1 0 J
  • 安卓 webview作为recycleview item显示不全解决办法

    import android annotation SuppressLint import android content Context import android os Build import android support ann
  • 视频无损放大软件:Topaz Video Enhance Al (Win&Mac) 激活版

    Topaz Video Enhance AI是一款由Topaz Labs开发的强大视频增强软件 它利用人工智能和机器学习技术 可以将低分辨率 模糊或噪声严重的视频转换为更清晰 更详细的高分辨率视频 Topaz Video Enhance A
  • 少儿学人工智能编程好还是机器人编程好

    少儿学人工智能编程好还是机器人编程好 小孩的学习一直以来都是家长们非常关心和重视的一件事情 很多的家长在培养孩子的学习方面也可以说相当的耐心的 会给孩子选择一些能够有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说
  • vs+vm双机调试

    基础 VS2017安装成功 wdk10 注意事项 关闭 主机 客户机 防火墙 互相ping都能ping通 一 具体操作步骤 工具安装就不说了 不会的百度一下 只说一下一些关键的地方 1 安装好虚拟机后 给虚拟机增加一个串口设备 具体操作见图
  • 汇编基础(2) -- ARM64

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