[国嵌笔记][025][ARM指令分类学习]
算术和逻辑指令
1.mov
格式:mov {条件}{s} <dest>, <op>
作用:把一个值从一个地方移动到另一个地方,<dest>必须是寄存器
示例:
@mov指令范例 “@”表示注释
mov r1, #8
mov r2, r1
2.mvn
格式:mvn {条件}{s} <dest>, <op>
作用:把一个值取反后从一个地方移动到另一个地方,<dest>必须是寄存器
示例:
@“0b”表示二进制,”0x”表示十六进制,什么都不加表示十进制
mvn r1, #0b10
mvn r2, #5
mvn r3, r1
3.sub
格式:sub{条件}{s} <dest>, <op1>, <op2>
作用:减法,用<op1>-<op2>把结果放到<dest>寄存器中
示例:
@<dest>和<op1>不能为立即数
mov r0, #4
sub r1, r0, #2
4.add
格式:add{条件}{s} <dest>, <op1>, <op2>
作用:加法,<op1>加上<op2>的和放到<dest>寄存器中
示例:
@可以在调试中直接给寄存器赋值
mov r1, #1
add r2, r1, #1
5.and
格式:and{条件}{s} <dest>, <op1>, <op2>
作用:逻辑与,<op1>与<op2>相与结果放在<dest>寄存器中
示例:
mov r1, #5
and r2, r1, #0
and r3, r1, #1
6.bic
格式:bic{条件}{s} <dest>, <op1>, <op2>
作用:位清除,把<op1>中在<op2>中对应为1的位清零,结果放在<dest>中
示例:
mov r1, #0b1011
bic r2, r1, #0b0101
比较指令
1.cmp
格式:cmp{条件}{P} <op1>, <op2>
作用:比较,<op1>减去<op2>的大于、小于和等于三种情况保存在cprs中的N和Z位中
示例:
mov r1, #2
cmp r1, #1 @NZ 00
cmp r1, #2 @NZ 01
cmp r1, #3 @NZ 10
2.tst
格式:tst{条件}{P} <op1>, <op2>
作用:测试位,把<op1>与<op2>中对应位做按位与操作,结果保存在cprs中的Z位,用来测试<op1>在<op2>中对应位是否为1(条件是否为真)
示例:
mov r1, #0b101
tst r1, #0b010 @Z 1
tst r1, #0b110 @Z 0
跳转指令
1.b
格式:b{条件} <地址>
作用:根据条件跳转到地址处,常用条件有gt(大于)、ge(大于等于)、eq(等于)、ne(不等于)、lt(小于)、le(小于等于);也可以不跟条件,表示无条件跳转
示例:
mov r1, #2
mov r2, #1
cmp r1, r2
bgt branch @(if)如果满足条件跳转到分支,否则执行另一个分支
sub r3, r1, r2
b end @无条件跳转
branch:
add r3, r1, r2
end:
nop @空操作
2.bl
格式:
作用:带链接返回的跳转,在跳转之前保存返回后将要执行的下一条指令的地址到lr(链接寄存器)中,用于函数的返回
示例:
mov r1, #1
mov r2, #2
bl func
mov r0, r3
b end
func:
add r3, r1, r2
mov pc, lr
end:
nop
移位指令
1.lsl
格式:rx , lsl#n
作用:逻辑左移(logical or arithmetic shift left),把rx寄存器中的值左移n位,低位补0。类似的还有asl(算术左移,低位直接补0),lsr(逻辑右移,高位补0),asr(算术右移,高位补符号值)。逻辑移动直接补0,算术移动补符号值。
示例:
mov r1, #0b101
mov r2, r1, lsl#2
mov r2, r1, asl#2
mov r2, r1, lsr#2
mov r2, r1, asr#2
2.ror
格式:rx, ror#n
作用:循环右移(rotate right),把rx寄存器的最低位循环移动到最高位。
示例:
mov r1, #0b11
mov r2, r1, ror#1
3.rrx
格式:rx, rrx#n
作用:带扩展位的循环右移(rotate right with extend),把rx寄存器的值加上cprs中的S位一起循环右移。
示例:
mov r1, #0b11
mov r2, r1, rrx
4.循环指令汇总
LSL 逻辑左移,低位补0值
ASL 算术左移,低位补0值
LSR 逻辑右移,高位补0值
ASR 算术右移,高位补符号(S)值
ROR 循环右移,高位补低位值
RRX 带扩展的循环右移,符号位(S)补低位值
5.程序状态字访问指令
1.mrs和msr
格式:mrs rd, cpsr msr cpsr, rd
作用:程序状态字寄存器不能直接修改,需要用专用指令来修改程序状态寄存器中的值。
示例:
mrs r0, cpsr
orr r0, r0, #0b11111 @使处理器工作在sys(系统模式
msr cpsr, r0
6.存储器访问指令
1.ldr和str
格式:ldr{条件} rd, <地址> str{条件} rd, <地址>
作用:从<地址>中装载到rd中,或把rd的值保存到<地址中>
示例:
mov r1, #ff
ldr r0,=0x30001000 @mov指令不能直接超过8位的值,用伪指令用来把内存地址0x30001000值赋给r0寄存器
str r1, [r0] @把r1中的值保存到到r0指向的地址中
ldr r2, [r0] @把r0指向的地址中的值装载到r2中
.text
.global _start
_start:
@ldr str
ldr r0, =0x30001000
mov r1, #0xff
str r1, [r0]
ldr r2, [r0] @mrs msr
mrs r1, cpsr
orr r1, r1, #0b11111
msr cpsr, r1 @ror
mov r1, #0b11
mov r2, r1, ror#1
mov r3, r1, rrx @lsl
mov r1, #0b101
mov r2, r1, lsl#2
mov r2, r1, asl#2
mov r2, r1, lsr#2
mov r2, r1, asr#2 @bl
mov r1, #1
mov r2, #2
bl func
mov r0, r3
b end func:
add r3, r1, r2
mov pc, lr end2:
nop @b
mov r1, #2
mov r2, #1 cmp r1, r2
bgt branch
sub r3, r1, r2
b end
branch:
add r3, r1, r2 end1:
nop @tst
mov r1, #0b101
tst r1, #0b010
tst r1, #0b110 @cmp
mov r1, #2
cmp r1, #1
cmp r1, #2
cmp r1, #3 @bic
mov r1, #0b1011
bic r2, r1, #0b0101 @and
mov r1, #5
and r2, r1, #0
and r3, r1, #1 @add
mov r1, #1
add r2, r1, #1 @sub
mov r0, #4
sub r1, r0, #2 @mvn
mvn r1, #0b10
mvn r2, #5
mvn r3, r1 @mov
mov r1, #8
mov r2, r1
[国嵌笔记][025][ARM指令分类学习]的更多相关文章
- ARM指令分类学习
指令分类: 1.算数和逻辑指令 2.比较指令 3.跳转指令 4.移位指令 5.程序状态字访问指令 6.存储器访问指令 +++++++++++++++++++++++++++++++++++++++++ ...
- [国嵌笔记][024][ARM汇编编程概述]
汇编程序用途 1.在bootloader与内核初始化时,还没有建立C语言运行环境,需要用到汇编程序 2.在对访问效率要求很高的情况下,需要用到汇编程序 ARM汇编分类 1.ARM标准汇编:适合于Win ...
- [国嵌笔记][027][ARM协处理器访问指令]
协处理器作用 协处理器用于执行特定的处理任务,如数学协处理器可以执行控制数字处理,以减轻处理器的负担.ARM处理器最多可以支持16个协处理器,其中CP15是最重要的一个协处理器 CP15的作用 CP1 ...
- [国嵌笔记][021-022][ARM处理器工作模式]
[ARM处理器工作模式] 处理器工作模式 1.User(urs):用户模式,linux应用程序运行在用户模式 2.FIQ(fiq):快速中断模式 3.IRQ(irq):中断模式 4.Superviso ...
- [国嵌笔记][020][ARM家族大检阅]
ARM芯片:2440(arm9) 6410(arm11) 210(cortex-A8) ARM核:arm9(arm-v4) arm11(arm-v6) cortex-A8(arm-v7) 指令架构:a ...
- [国嵌笔记][026][ARM伪指令]
ARM机器码 1.汇编程序通过汇编器变成机器码,然后才能在ARM处理器上运行 2.ARM机器码是一个32位的数,被分成了多个段,每个段都有各自的含义 3.格式: cond:表示条件(4位) I:表示源 ...
- 3.2 ARM指令分类学习
1 算术移位寄存器和逻辑指令 1.1 mov 传送(Move) Mov {条件} {S} <dest>, <op_1> MOV从另一个寄存器.被移位的寄存器.或者一个立即数装载 ...
- [国嵌笔记][023][ARM寻址方式]
寻找方式 1.处理器根据指令中给出的信息来找到指令所需操作数的方式 2.立即数寻址 操作数本身在指令中给出,立即数前加”#”表示立即数寻址,操作数在指令中 3.寄存器寻址 利用寄存器中的数值作为操作数 ...
- [国嵌笔记][029][ARM处理器启动流程分析v2]
2440启动流程 启动方式:nor flash启动.nand flash启动 地址布局: 选择nor flash启动时,SROM(nor flash)地址为0x00000000 选择nand flas ...
随机推荐
- bzoj 2959: 长跑
Description 某校开展了同学们喜闻乐见的阳光长跑活动.为了能"为祖国健康工作五十年",同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑运动.一时间操场上 ...
- CJOJ 血帆海盗
Description 随着资本的扩大,藏宝海湾贸易亲王在卡利姆多和东部王 国大陆各建立了N/2 个港口.大灾变发生以后,这些港口之间失去了联系,相继脱离了藏宝海湾贸易亲王的管辖,各自为政.利益的驱动 ...
- 基于telegraf+influxdb+grafana进行postgresql数据库监控
前言 随着公司postgresql数据库被广泛应用,尤其是最近多个项目在做性能测试的时候都是基于postgresql的数据库,为了确定性能瓶颈是否会出现在数据库中,数据库监控也被我推上了日程.在网上找 ...
- UNIX域协议(命名套接字)
这里主要介绍命名UNIX域套接字 1.什么是UNIX域套接字Unix域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务通信的一种方式.是进程间通信(IPC)的一种方式.它提供了两类套接字:字 ...
- Linux发行版 CentOS6.5下的分区操作
本文地址http://comexchan.cnblogs.com/ ,尊重知识产权,转载请注明出处,谢谢! 查询磁盘信息并作分区规划 执行下述命令查询磁盘信息: fdisk -l 可知.数据盘大小50 ...
- 摄像头脸部识别 (1)opencv 抓取视频数据并保存
摄像头脸部识别 (1)opencv 抓取视频数据并保存 基于python 和 opencv 3.4.0 (兼容 opencv 2.X 参考注释),详细如代码 import numpy as np im ...
- python爬虫如何爬知乎的话题?
因为要做观点,观点的屋子类似于知乎的话题,所以得想办法把他给爬下来,搞了半天最终还是妥妥的搞定了,代码是python写的,不懂得麻烦自学哈!懂得直接看代码,绝对可用 #coding:utf-8 fro ...
- Vue-cli 创建的项目如何跨域请求
感谢BeArchitect的技术支持 问题描述: 使用 Vue-cli 创建的项目,开发地址是 localhost:8023,需要访问 localhost:9000 上的接口 分析原因: 不同域名之间 ...
- hadoop集群篇--从0到1搭建hadoop集群
一.前述 本来有套好好的集群,可是不知道为什么虚拟机镜像文件损坏,结果导致集群不能用.所以不得不重新搭套集群,借此机会顺便再重新搭套吧,顺便提醒一句大家,自己虚拟机的集群一定要及时做好快照,最好装完每 ...
- 浅谈 URI 及其转义
URI URI,全称是 Uniform Resource Identifiers,即统一资源标识符,用于在互联网上标识一个资源,比如 https://www.upyun.com/products/cd ...