当前位置:网站首页>B.1#【编程语言】—1 arm 汇编指令
B.1#【编程语言】—1 arm 汇编指令
2022-08-03 05:23:00 【SEVENTHD7】
1.1 处理器内部数据传输指令
MSR & MRS
用于在状态寄存器和通用寄存器之间传送数据
MRS: 状态寄存器到通用寄存器的传送指令。
({R0-R12} <== CPSR,SPSR)
MRS R0, CPSR @ 将特殊寄存器 CPSR 里面的数据传递给 R0,即R0=CPSR
MSR: 通用寄存器到状态寄存器的传送指令。
(CPSR,SPSR<== {R0-R12})
MSR CPSR, R0 @ 将 R0 中的数据复制到 CPSR 中,即 CPSR=R0
MOV
MOV 指令用于将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄
存器里面,使用示例如下:
MOV R0, R1 @ 将寄存器 R1 中的数据传递给 R0,即 R0=R1
MOV R0, #0X12 @ 将立即数 0X12 传递给 R0 寄存器,即 R0=0X12
1.2 存储器访问指令
ARM 不能直接访问存储器,比如 RAM 中的数据,一般先将要配置的值写入到 Rx(x=0~12)寄存器中,然后借助存储器访问指令将 Rx 中的数据写入到寄存器中。
指令 | 描述 |
---|---|
LDR Rd, [Rn , #offset] | 从存储器 Rn+offset 的位置读取数据存放到 Rd 中 |
STR Rd, [Rn, #offset] | 将 Rd 中的数据写入到存储器中的 Rn+offset 位置 |
LDR 指令
LDR 主要用于从存储加载数据到寄存器 Rx 中, LDR 也可以将一个立即数加载到寄存器 Rx中, LDR 加载立即数的时候要使用“=”,而不是“#”。在嵌入式开发中, LDR 最常用的就是读取 CPU 的寄存器值。
LDR R0, =0X0209C004 @ 将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004
LDR R1, [R0] @ 读取地址 0X0209C004 中的数据到 R1 寄存器中
上述代码就是读取寄存器中的值,读取到的寄存器值保存在 R1 寄存器中,
上面代码中 offset 是 0,也就是没有用到 offset。
STR 指令
LDR 是从存储器读取数据, STR 就是将数据写入到存储器中
LDR R0, =0X0209C004 @ 将寄存器地址 0X0209C004 加载到 R0 中,即 R0=0X0209C004
LDR R1, =0X20000002 @ R1 保存要写入到寄存器的值,即R1=0X20000002
STR R1, [R0] @ 将 R1 中的值写入到 R0 中所保存的地址中
LDR 和 STR 都是按照字进行读取和写入的,也就是操作的 32 位数据,如果要按照字节、半字进行操作的话可以在指令“LDR”后面加上 B 或 H,比如按字节操作的指令就是 LDRB 和
STRB,按半字操作的指令就是 LDRH 和 STRH。
str和 stur的区别是,stur右边的立即数是负数,u代表立即数是负数
跟ldr和ldur一样,u都是负数
str x0,[x1,#0x10] //正数 x0->[x1+0x10]
stur x0,[x1,#-0x10] //负数 x0->[x1-0x10]
STP 指令
stp p是pair,把一对寄存器写入到右边内存
stp w0,w1,[x2] //把w0和 w1里面的值,写入到右边内存,[x2]中,w0在左边,w1在右边
在oc中的调用
fn2的声明
int fn2(int a,int b,int *c);//fn2的声明
调用
int c = 1;
int d = 2;
int e = 0;
result = fn2(c, d,&e);
NSLog(@"result=%d",result);
汇编函数定义
_fn2:
//w0 存储参数1,w1存储参数2.因为w0和w1共同组成x0,第三个参数向后延续一个寄存器,所以参数3存入x1中
stp w0,w1,[x2] //把w0和 w1里面的值,写入到右边内存,[x2]中,w0在左边,w1在右边
mov x0,x2//把x2的值存入返回值x0中
ret
调试结果
(lldb) re read x2
x2 = 0x000000016fd9540c
(lldb) x 0x000000016fd9540c
0x16fd9540c: 00 00 00 00 02 00 00 00 01 00 00 00 0a 00 00 00 ................
0x16fd9541c: 01 00 00 00 c0 e4 6d 83 02 00 00 00 00 88 3e 80 ......m.......>.
(lldb) re read w0
w0 = 0x00000001
(lldb) re read w1
w1 = 0x00000002
(lldb) si
(lldb) x 0x000000016fd9540c
0x16fd9540c: 01 00 00 00 02 00 00 00 01 00 00 00 0a 00 00 00 ................
0x16fd9541c: 01 00 00 00 c0 e4 6d 83 02 00 00 00 00 88 3e 80 ......m.......>.
(lldb) si
(lldb) re read x0
x0 = 0x000000016fd9540c
这个x0就是返回值,赋值给int类型是取走后8位,就是 0x6fd9540c,转换成10进制就是1876513804
打印结果:
result=1876513804
3 压栈和出栈指令
我们通常会在 A 函数中调用 B 函数,当 B 函数执行完以后再回到 A 函数继续执行。要想再跳回 A 函数以后代码能够接着正常运行,那就必须在跳到 B 函数之前将当前处理器状态保存起来(就是保存 R0-R15 这些寄存器值),当 B 函数执行完成以后再用前面保存的寄存器值恢复R0-R15 即可。保存 R0-R15 寄存器的操作就叫做现场保护,恢复 R0~R15 寄存器的操作就叫做恢复现场。在进行现场保护的时候需要进行压栈(入栈)操作,恢复现场就要进行出栈操作。
指令 描述
POP < reg list> 出栈
PUSH < reg list> 入栈
4 跳转指令
指令 描述
B < LABEL > 跳转到 label
BX < Rm > 间接跳转,跳转到存放于 Rm 中的地址处,并且切换指令集
BL < LABEL > 跳转到标号地址,并将返回地址保存在 LR 中
BLX < Rm > 结合 BX 和 BL 的特点,跳转到 Rm 指定的地址,并将返回地址保存在 LR 中,切换指令集
B指令
这是最简单的跳转指令, B 指令会将 PC 寄存器的值设置为跳转目标地址, 一旦执行 B 指
令, ARM 处理器就会立即跳转到指定的目标地址。如果要调用的函数不会再返回到原来的执行
处,那就可以用 B 指令。
BL指令
BL 指令相比 B 指令,在跳转之前会在寄存器 LR(R14)中保存当前 PC 寄存器值,所以可以通过将 LR 寄存器中的值重新加载到 PC 中来继续从跳转之前的代码处运行,这是子程序调用一个基本但常用的手段。
5 算术运算指令
指令 计算公式
ADD Rd, Rn, Rm / #immed Rd = Rn + Rm / #immed
ADC Rd, Rn, Rm / #immed (带进位) Rd = Rn + Rm / #immed + 进位
SUB Rd, Rn, Rm / #immed Rd = Rn – Rm / #immed
SUB Rd, #immed Rd = Rd - #immed
SUB Rd, Rn, #immed Rd = Rn - #immed
SBC Rd, Rn, Rm / #immed (带借位) Rd = Rn - Rm / #immed - 借位
MUL Rd, Rn, Rm Rd = Rn * Rm
UDIV Rd, Rn, Rm (无符号) Rd = Rn / Rm
SDIV Rd, Rn, Rm (有符号) Rd = Rn / Rm
6 逻辑运算指令
AND Rd, Rn, Rm Rd = Rn & Rm
ORR Rd, Rn, Rm Rd = Rn | Rm
BIC Rd, Rn, Rm Rd = Rn & (~Rm)
ORN Rd, Rn, Rm Rd = Rn | (~Rm)
EOR Rd, Rn, Rm Rd = Rn ^ Rm
边栏推荐
- 自监督论文阅读笔记 DetCo: Unsupervised Contrastive Learning for Object Detection
- 中国生产力促进中心”十四五”规划与发展规模分析报告2022~2028年
- EIP-5058 能否防止NFT项目方提桶跑路?
- Qlik Sense 判空详解(IsNull)
- 自监督论文阅读笔记 Ship Detection in Sentinel 2 Multi-Spectral Images with Self-Supervised Learning
- php连接数据库脚本
- 中国生物反应器行业发展现状及前景规划分析报告报告2022~2028年
- 寄存器常见指令
- MySQL 安装报错的解决方法
- Execute the mysql script file in the docker mysql container and solve the garbled characters
猜你喜欢
自监督论文阅读笔记 S3Net:Self-supervised Self-ensembling Network for Semi-supervised RGB-D Salient Object Det
Oracle 注释详解(--、/**/、rem)
自监督论文阅读笔记Index Your Position: A Novel Self-Supervised Learning Method for Remote Sensing Images Sema
寄存器常见指令
自我监督学习和BERT模型
边缘辅助无人机网络的分层联邦学习
ansible的安装和部署详细过程,配置清单基本操作
【HQL】(二) 查询使用正则表达式做列选择
自监督论文阅读笔记 Multi-motion and Appearance Self-Supervised Moving Object Detection
嵌入式实验三(代码几乎都要改才能运行)
随机推荐
Router-view
[frp intranet penetration]
Greetings(状压DP,枚举子集转移)
动漫 吞噬星空
网络间通信
Playing with Markdown(2) - Extraction and Manipulation of Abstract Syntax Trees
【 command execution and middleware loopholes 】
自监督论文阅读笔记FIAD net: a Fast SAR ship detection network based on feature integration attention and self
中国柔性制造系统(FMS)市场发展动态及未来趋势预测报告2022~2028年
MySQL 排序
自监督论文阅读笔记 Self-Supervised Visual Representation Learning with Semantic Grouping
Sentinel初次使用Demo测试
【DC-4 Range Penetration】
【DC-5 Range Penetration】
Mysql 预准备语句详解(prepare、execute、deallocate)
自监督论文阅读笔记 Self-Supervised Deep Learning for Vehicle Detection in High-Resolution Satellite Imagery
mysql 客户端SSL错误2026 (HY000)
深度学习基本概念
spark sql 报错 Can‘t zip RDDs with unequal numbers of partitions
block底层探索