算术和逻辑指令

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指令分类学习]的更多相关文章

  1. ARM指令分类学习

    指令分类: 1.算数和逻辑指令 2.比较指令 3.跳转指令 4.移位指令 5.程序状态字访问指令 6.存储器访问指令 +++++++++++++++++++++++++++++++++++++++++ ...

  2. [国嵌笔记][024][ARM汇编编程概述]

    汇编程序用途 1.在bootloader与内核初始化时,还没有建立C语言运行环境,需要用到汇编程序 2.在对访问效率要求很高的情况下,需要用到汇编程序 ARM汇编分类 1.ARM标准汇编:适合于Win ...

  3. [国嵌笔记][027][ARM协处理器访问指令]

    协处理器作用 协处理器用于执行特定的处理任务,如数学协处理器可以执行控制数字处理,以减轻处理器的负担.ARM处理器最多可以支持16个协处理器,其中CP15是最重要的一个协处理器 CP15的作用 CP1 ...

  4. [国嵌笔记][021-022][ARM处理器工作模式]

    [ARM处理器工作模式] 处理器工作模式 1.User(urs):用户模式,linux应用程序运行在用户模式 2.FIQ(fiq):快速中断模式 3.IRQ(irq):中断模式 4.Superviso ...

  5. [国嵌笔记][020][ARM家族大检阅]

    ARM芯片:2440(arm9) 6410(arm11) 210(cortex-A8) ARM核:arm9(arm-v4) arm11(arm-v6) cortex-A8(arm-v7) 指令架构:a ...

  6. [国嵌笔记][026][ARM伪指令]

    ARM机器码 1.汇编程序通过汇编器变成机器码,然后才能在ARM处理器上运行 2.ARM机器码是一个32位的数,被分成了多个段,每个段都有各自的含义 3.格式: cond:表示条件(4位) I:表示源 ...

  7. 3.2 ARM指令分类学习

    1 算术移位寄存器和逻辑指令 1.1 mov 传送(Move) Mov {条件} {S} <dest>, <op_1> MOV从另一个寄存器.被移位的寄存器.或者一个立即数装载 ...

  8. [国嵌笔记][023][ARM寻址方式]

    寻找方式 1.处理器根据指令中给出的信息来找到指令所需操作数的方式 2.立即数寻址 操作数本身在指令中给出,立即数前加”#”表示立即数寻址,操作数在指令中 3.寄存器寻址 利用寄存器中的数值作为操作数 ...

  9. [国嵌笔记][029][ARM处理器启动流程分析v2]

    2440启动流程 启动方式:nor flash启动.nand flash启动 地址布局: 选择nor flash启动时,SROM(nor flash)地址为0x00000000 选择nand flas ...

随机推荐

  1. 手机端rem如何适配_rem详解及使用方法2

    作为一个前端开发人员,我们的任务是将UI设计师的图稿运用计算机语言呈现在用户面前.而现在的设备大小尺寸不一,近年来智能手机的普及更是让网页的用户大部分来源与手机,所以让不同大小的移动端屏幕都能较好的还 ...

  2. php消息队列之 think queue消息队列初体验

    使用thinkphp 5的  消息队列 think queue ● php think queue:listen --queue queuename ● php think queue:work -- ...

  3. Ubuntu安装微信

    1.系统是Ubuntu 16.04 64位系统,在网上先去下载electronic-wechat-Linux         https://github.com/geeeeeeeeek/electr ...

  4. c#实现超实用的<证件照换底色>小工具

    1前言     我们在工作和生活中经常要填写一些个人资料,这时候往往需要放证件照上去,但是有时候人家要求是红底或白底,但是偏偏不巧的是你以前照了张蓝底的.这时候你想换个底色,于是在百度上一搜“证件照换 ...

  5. vue2 3d 切换器

    空闲时写了一个3d切换器,灵感来自于转行前画3d工程图,效果如图: 功能:按住鼠标中间,变为3d模式,点击6个页面中的某一个页面,页面旋转放大,恢复到2d图形,3d图消失.再次点击鼠标中间,恢复为3d ...

  6. angular4.0 路由守卫详解

    在企业应用中权限.复杂页多路由数据处理.进入与离开路由数据处理这些是非常常见的需求. 当希望用户离开一个正常编辑页时,要中断并提醒用户是否真的要离开时,如果在Angular中应该怎么做呢? 其实Ang ...

  7. 从0到1搭建spark集群---企业集群搭建

    今天分享一篇从0到1搭建Spark集群的步骤,企业中大家亦可以参照次集群搭建自己的Spark集群. 一.下载Spark安装包 可以从官网下载,本集群选择的版本是spark-1.6.0-bin-hado ...

  8. [Spark内核] 第38课:BlockManager架构原理、运行流程图和源码解密

    本课主题 BlockManager 运行實例 BlockManager 原理流程图 BlockManager 源码解析 引言 BlockManager 是管理整个Spark运行时的数据读写的,当然也包 ...

  9. Python基础-*args和**kwargs魔法变量

    在学习Python时,总会遇到*args和**kwargs这两个魔法变量,那么它们到底是什么? 首先,并不是必须写成*args和**kwargs.只有变量前面的*(星号)才是必须的,你也可以写成*va ...

  10. 微信小程序 - 上拉加载

    demo.wxml  文件 <view wx:for="{{listdata}}" wx:key="listdata" class='listitem'& ...