tnblog
首页
视频
资源
登录

ARM8 汇编指令

1438人阅读 2024/7/10 16:08 总访问:3467441 评论:0 收藏:0 手机
分类: 嵌入式

ARM8 汇编指令

ARM8 汇编指令参考


关于ARM8汇编指令可以参考线上链接:https://developer.arm.com/documentation/ddi0596/2021-09/Base-Instructions

常用命令如下

汇编代码 注释
b.ne label 不等时跳转到label
cbz w10, 1f w10值等于0时跳转到1f
ret 子程序返回指令,返回地址默认保存在LR(X30),代替了mov pc, lr
ldr x0, =__main 大范围的地址读取:把标号__main(地址)读入x0
adr x0, vector 小范围的地址读取:把标号vector(地址)读入x0,标号距当前指令PC的偏移小于1M
stp x29, x30, [sp, #-16]! 入栈:把x29, x30存储到sp-16指向的空间后,sp自减16
ldp x29, x30, [sp], #16 出栈:把sp指向的空间内容载入到x29, x30后,sp加16
mrs x0, sctlr_el1 读sctlr_el1内容到x0(系统寄存器,都通过mrs msr来操作)
msr sctlr_el1, x0 写x0内容到sctlr_el1
svc #2 系统调用指令(触发一个同步异常,CPU则会陷入EL1)
.global _start 声明_start为全局符号(让链接脚本能看到)
.quad 0x3FA0 在存储器中分配8个字节,初值设为0x3FA0
.align 4 2^4 =16字节对齐
.macro myAdd, x, y 宏函数,类似myAdd(x, y)
add \x, \x, \y 宏函数内容,执行add指令
.endm 宏定义结束
myAdd x0, x2 调用宏函数myAdd,等价于add x0, x0, x2

延时函数举例

  1. .globl _start // 声明_start为全局符号
  2. _start: // 程序入口
  3. mov x0, #3 // 将立即数3赋值给寄存器x0
  4. bl delay // 调用延时函数delay
  5. reset_end: // 无限循环标签reset_end
  6. b reset_end // 无条件跳转到reset_end
  7. delay: // 延时函数开始
  8. ldr x4, =0x03 // 将立即数0x03加载到寄存器x4
  9. loop_delay: // 循环延时标签loop_delay
  10. sub x4, x4, #1 // 将寄存器x4的值减1
  11. cmp x4, #0 // 比较寄存器x4与0
  12. cbz x4, delay_end // 如果x4等于0则跳转到delay_end
  13. b.ne loop_delay // 如果x4不等于0则跳转到loop_delay继续循环
  14. delay_end: // 延时结束标签delay_end
  15. ret // 返回到调用者
  1. # 编译
  2. make
  3. # 启动 qemu
  4. qemu-system-aarch64 -machine virt -cpu cortex-a57 -nographic -kernel start -S -s


x4赋值3


然后每次递减1判断为0时,通过cbz跳转到delay_end函数,否则还是通过b.ne循环递减。

宏函数(macro)


宏函数(macro)是在汇编代码中定义的一组指令片段,可以通过宏的名称多次调用,以避免重复代码。
下面写一个简单相加的宏函数简单举例。

  1. .macro myAdd, x, y
  2. add \x, \x, \y
  3. .endm
  4. .globl _start
  5. _start: // 程序入口
  6. mov x2, #1
  7. mov x0, #2
  8. myAdd x0, x2 // 调用myAdd宏函数
  9. mov x0, xzr

异常级别的宏函数处理

异常状态 描述
EL0: 用户态(User Mode) 普通应用程序运行的模式,没有特权。 0x0
EL1: 内核态(Kernel Mode) 操作系统内核运行的模式,具有较高特权。 0x4
EL2: Hypervisor Mode 虚拟化层运行的模式,用于管理虚拟机,有最高的特权级别之一。 0x8
EL3: Secure Monitor Mode 安全监控模式,通常用于安全操作,例如信任区(TrustZone)中的安全监控。 0xC
  1. .macro switch_el, xreg, el1_label, el2_label // 宏函数定义,接收两个参数:寄存器xreg和标号el1_label
  2. mrs \xreg, CurrentEL // 读取当前异常级别(CurrentEL)到寄存器xreg
  3. cmp \xreg, 0x4 // 比较寄存器xreg的值是否等于0x4EL1
  4. b.eq \el1_label // 如果xreg等于0x4,则跳转到标号el1_label
  5. cmp \xreg, 0x8 // 比较寄存器xreg的值是否等于0x4EL2
  6. b.eq \el2_label // 如果xreg等于0x8,则跳转到标号el2_label
  7. .endm // 宏函数结束
  8. .globl _start // 声明_start为全局符号
  9. _start: // 程序入口
  10. mov x0, #0x4 // 将立即数0x4赋值给寄存器x0
  11. switch_el x0, 1f, 2f // 调用宏函数switch_el,判断当前EL并跳转
  12. mov x2, #2 // 如果没有跳转,继续执行,将立即数2赋值给寄存器x2
  13. reset_end: // 无限循环标签reset_end
  14. b reset_end // 无条件跳转到reset_end
  15. 1: // 标号1
  16. mov x1, #0x30 // 将立即数0x30赋值给寄存器x1
  17. b reset_end // 跳转到reset_end,进入无限循环
  18. 2: // 标号2
  19. mov x2, #0x30 // 将立即数0x30赋值给寄存器x2
  20. b reset_end // 跳转到reset_end,进入无限循环


虽然不能在宏函数中执行,但是我们可以通过反汇编查看它接下来需要执行的代码是宏函数里面需要执行的汇编。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

ARM8 64位汇编简介

ARM8 64位汇编简介[TOC] 版本差异 特性 ARM7 ARM8 内存 仅支持 32 位地址空间 支持 64 位和 32 位地址...

ARM8 异常处理

ARM8 异常处理[TOC] ARM8 异常向量表 ARMv8 异常向量表分类4大类(Execution Levels)EL3(Exception Level 3): 安全监...

ARM8 U-boot启动源码分析(学习笔记)

ARM8 U-boot启动源码分析(学习笔记)[TOC] 什么是U-Boot?U-Boot是嵌入式系统中首先执行的程序之一。也是开源引导程序。...
这一世以无限游戏为使命!
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术