-
一、
arm
的认知及基本概念
< br>
(
一
).arm
的基本概念
1.
什么是
arm
arm
是
一家英国电子公司的名字,全名是
Advanced RISC Machine
这家企
业设计了大量高性能、廉价、耗能低的
RISC
(精简指令集)
处理器,
ARM
公司
只设计芯片而不生
产,它将
技术授权给世界上许多公司和厂商。目前采用
arm
技术知识产权内核的微处理器,即通常
所说的
arm
微处理器
所以<
/p>
arm
也是对一类微处理器的通称。
arm
指令集体系版本号(软件)为
V1 ~ V7
目前
V1 ~ V3
已很少见。从
p>
V4
版不再与以
前的版本兼容。
arm
的
CPU
系列(硬件)
主要有
ARM7 ~ ARM11
2.
典型的嵌入式处理器
arm
占市场
79.5%
ARM
mips
占市场
13.9%
MIPS
microSPARC
占市场
3.1%
SUN
PowerPc
占市场
2.8%
IBM
其它
占市场
0.8%
3. arm
的应用范围:
工业控制:如机床、自动控制等
无线通信:如手机
网络应用:如
电子产品:如音视频播放噐、机顶
盒、游戏机、数码相机、打印机
其它各领域:如军事、医疗、机器人、智能家居等
4.
计算机体系结构
见图:冯
.
诺依曼计算机体系图
p>
冯
.
诺依曼体系结构
处理器使用同一个存储器,经由同一个总线传输
完成一条指令需要
3
个步骤:即取指令
->
指令译码
->
执行指令
指令和数据共享同一总线的结构
哈佛体系结构
将程序指令存储和数据存储分开
中央处理器首先到程序指令存储器中读取程序指令。解码后到
数据地址,再到相应的
数据存储器读取数据,然后执行指令
程序指令存储与数据存储分开,可以使指令和数据有不同的数
据宽度。
5.
复杂指令集与精简指令集
CISC
复杂指令集:
采用冯
.
诺依曼体系结
构。
数据线和指令线分时复用
(只能通过一辆车)
。
存储器操作指令多
汇编程序相对简单
指令结束后响应中断
CPU
电路丰富
面积
大功耗大
RISC
精简指令集:采用哈佛体系结构。数据线和指令线分离(同时能通过多辆车)
。
对存储器操作有限
汇编程序占空间大
在适当地方响应中断
CPU
电路较少
体积
小功耗低
ARM
采用
RISC
精简指令集
Thumb
是
ARM
体系结构中一种
16
位的指令集。
从
ARMv4T
之后,的
ARM
处理器有一种
16
-bit
指令模式,叫做
Thumb
,
较短的指
令码提供整体更佳的编码密度,
更有效地使用有限的内
存带宽。
所有
ARM9
和后来的家族,
包括
XScale
都纳入了
Thumb
技术。
p>
即
ARM
有两种指令集:
< br>RISC
、
Thumb
6. arm
的思想
1) arm
体系的总思想:
在不牺
牲性能的同时,尽量简化处理器。同时从体系结构上灵活支持处理器扩展。采用
RISC
结构。
RISC
处理器简化了处理器结
构,
减少复杂功能指令的同时,
提高了处理器速度。
ARM
及
M
IPS
都是典型的
RISC
处理器
p>
2)
arm
的流水线结构
arm
处
理器使用流水线来增加处理器指令流的速度,这样可以使几个操作同时进行。并
使处理和
存储器系统连续操作。
arm
处理器分为三级:取指
->
译码
->
执行<
/p>
取指:指令从存储器中取出
译码:对指令使用的寄存器进行译码
执行:从寄存器组中读取寄存器,
执行移位和
ALU
操作,寄存器被写回到寄存器组
中
3)
ARM
处理器支持的类型
字节
8
位
半字
16
位
字
32
位
**
所有数据操作都以字为单位
**ARM
指令的长度刚好是一个字,
Thumb
指令长度刚好是半个字
4) ARM
处理器状态
ARM
处
理器内核使用
ARM
结构,该结构包含
32
位的
ARM
指令集和
16
位
Thumb
指令集,
因此
ARM
有两种操作状态
ARM
状
态:
32
位
Thumb
状态:
< br>16
位
5)
处理器模式
ARM
处理器共有
< br>7
种运行模式:
用户:
正常程序工作模式,不能直接切换到其它模式
系统:
用于支持操作系统的特权任务,可以直接切换到其它模式
快中断:支持高速数据传输及通道
处理,
FIQ
异常响应时进入此模式
中断:
用于通用中断处理,
IRQ
异常响应时进入此模式
管理:
操作系统保护代码,系统复位和软件中断响应时进入此模式
中止:
用于支持虚拟内存或存储器保护,用于
MMU
未定义:支持硬件协处理器的软件
仿真,未定义指令异常响应时进入此模式。
(
二
)
、经典平台硬件组成<
/p>
见图:
arm
硬件组成图
开发板
一般是由一块组成的,
有核心器件和外围器件接口等,
但是有的
是由两块板子组
成,主版和核心板,主版上主要是外围接口,外围器件等,核心板上主要
是核心器件,还有
一些晶振电路等
1.
核心板
(
天嵌
2440)
CPU
处理器
S3C2440AL
,主频
400MHz
(最高可达
533MHz
)
SDRAM
内存
板载
64MB
SDRAM
(标准配置)
,
32bit
数据总线
SDRAM
时钟频率高
达
100MHz
(
支持运行
133MHz
)
Nand Flash
板载
64MB
Nand Flash
或
256MB Nand
Flash
(标准配置)
Nor
Flash
板载
2MB Nor
Flash
(最高可升级到
8MB
)<
/p>
CorePower
专业
1.25V
核心电压供电
Power
核心板
采用
3.3V
供电
Powerled
核心板电源指示灯
核心板接口
接口型号为
DC-2.0
双列直插
SDRAM
:随机存储器,普遍使用的内存。用作主存。
NOR
Flash
和
NAND
Flash
是现在市场上两种主要的非易失闪存。
NOR
的
特点是芯片内执行,应用程序可以直接在
flash
闪存内运
行,不必再把
代码读到系统
RAM
中。
NAN
D
结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的
速度也很快。
2.
主板
电源
并口线
复位
RTC
电源
RS232
电平转换
DB9
插座
音频
IIS,AC97
按键、
PS/2
与
IC
接口
数码管
触摸屏
以太网卡
主
USB HUB
1
转
4
3.
寄存器
p>
见图:
ARM
模块和内核框图
寄存器是中央处理器内的组成部份。
p>
寄存器是有限存贮容量的高速存贮部件,
用来暂存指令、
数据和位址。
在中央处理器的
控制部件中,包含的
寄存器有指令寄存器
(IR)
和程序计数器
(PC)
。在中央处理器的算术及逻
辑部件中,包含的寄存
器有累加器
(ACC)
。
IR
用于存储指令
PC
用于存储程序运行的地址(即当前指令在内存中的位置)
寄存器是由一个指令的输出或输入可以直接索引到的暂存器群
组。
所有的计算机指令都
是进入寄存器后被直接读取
ARM
的
汇编编程,本质上就是针对
CPU
寄存器的编程。
//*******
重点
需要背讼
************
*************************************
ARM
寄存器分为
2
类:普通寄存器和状态寄
存器
(1)
通用寄存器和计数器:共
32
个,
p>
15
个通用寄存器
R0 -R7
未备份寄存器
R0(a1)
R1(a1)
R2(a3) R3(a4) R4(v1) R5(v2) R6(v3) R7(v4)
R8 -R12
备份寄存器
R8(v5)
R9
(SB,v6) R10(SL,v7) R11(EP
,v8) R12(IP)
数据寄存器
R15(PC)
程序计数器
它的值是当前正在执行的指令在内存中的位置。
p>
当指令执行结束后,
CPU
会自动将
PC
值加上一个单位,
PC
< br>值指向
下一条即将执行的指令的地址
p>
如果通过汇编指令对
PC
寄存器赋值,就会
完成一次程序的跳转(如
从子函数跳转回主函数内)
R14(LR)
链接寄存器
存放子程序的返回地址
例如:
在主函数内,如果调用子函数,程序会进入到子函数内执行。
当子函数执行完毕后,需要
回到
主函数内,
所以,
< br>在子函数调用前需要将这个地址先保存起来,
否则无法
找
到这个地址。
LR
用于
保存这个地址,这个地址也称为子程序返回地址。当子函数
结束后,再将
LR
内的地址赋给
PC
即可。
如果子程序再调用孙程序,
LR
如何保存地址呢?
p>
先把当前
LR
内的值压入内存的栈区,然后
LR
再保存孙程序的返回
地址。当孙程
序执行完后通过
PC
跳转到
p>
子程序内,
此时将栈区内的子程序返回地址取出保存在
LR
内。
当子程序
执行完后
,再通过
PC
跳转到主函数内。
R13(SP)
栈指针寄存器
用于存放堆栈的栈顶地址。
SP<
/p>
相当于指针变量,
保存的是栈顶的地址,
出栈时,
从
SP
指向的内
存中取出数据,入栈时将新的内存地址
压入栈
顶,而
SP
相当于链表的头指针
(he
ad)
。
原则上说
R0-R12
可以保存任何数据。
其中
R0-R7
用来临时存储数据,
R8-R12
系
统没有用来做任何特殊用途,常用于中断
而在汇
编与
C
语言的交互中,定制了
A
TPCS
标准
寄存器
:
R4-R11
用来保存局部变量
参数:
参
数小于等于
4
,用
R0-R3
保存参数,参数多于
4
,剩余的传入堆栈
函数返回:结果为
32
位整数,通过
R0
返回
结果为
6
4
位整数,通过
R0
,
R1
返回
对于位数更多的结果,通过内存传递
(2)
状态寄存器
:
状态寄存器用于保存程序的当前状态
CPSR
当前程序状态寄存器
一个寄
存器为
32
位,
每一位数据代表不同的
状态。
分为三个部分
(
条件代
码标志位、控制位、保留区位
)
31 32 29 28
.... 7 6 5 4
3
2
1
0
N
Z
C
V
I F T M4 M3 M2 M1 M0
其中
N Z C V
称为条件标志位<
/p>
(即保存的是条件的运算结果,
真和
假)
N=1
表示运算结果为负数
,N=0
表示运算结果为正数。
Z=1
表示运算结果为
0
,
Z=0
表示运算结果为非零。
C=1
表示运算结果产生了进位。
V=1
运算结果的符号位发生了溢出。
p>
这
4
个位的组合,代表了各种条件,如下:
0000
EQ
Z
置位
相等
/
等于
0
0001
NE
Z
清
0
不等
进位
/
无符号
无进位
/
无符
负数
非负数
溢出
无溢出
0010
CS/HS
高于或等于
0011
CC/LO
号低于
0100
MI
0101
PL
0110
VS
0111
VC
1000
HI
1001
LS
于
1010
GE
于
1011
LT
1100
GT
1101
LE
1110
AL
1111
NV
C
置位
C
清
0
N
置位
N
清
0
V
置位
V
清
0
<
/p>
C
置位且
Z
清<
/p>
0
C
清
p>
0
或
Z
置位
N
等于
V
无符号高于
无符号低于
或等
有符号大于
或等
有符号
小于
有符号大于
N
不等于
V
Z
清
0
p>
且
N
等于
V
p>
Z
置位或
N
不等于
V
有符号小于或等于
任何状态
总是(
always
)
无
从不(
never
)
IFT
称为控制位
I
I=1
禁用
IRO
< br>中断
F
F=1
禁用
FIQ
< br>中断
T
表示
CPU
当前的状态,
1
代表正在
Thumb
指令集状态,
< br>0
表
示正在
ARM
指令集状态。
M0
至
M4
表示中断类型(控制位内的模式位)
0b10000
User
用户中断
0b10001
FIQ
快速中断
0b10010
IRQ
声卡、
调制解调器等外部设备产生的
中断
0b10011
Supervisor
管理程序或监控程序产生的中断
0b10111
Abort
异常中断
0b11011
Undefined
未定义中断
0b11111
System
系统中断
SPSR
保存的程序状态寄存器,
结构与
p>
CPSR
完全一样,
用来保存
CPSR
的值。
以便出现异常时恢复
CPSR
的值
(3)
流水线对
pc
值的影响
CPU
内部的组成部分:指令寄存器
,指令译码器,指令执行单元(包括
ALU
和
< br>通用寄存器组)
CPU
执行指令的步骤:取指
->
译码
->
执行
取指:将指令从内存或指令
cach
e
中取入指令寄存器
译码
:
指
令译码器对指令寄存器中的指令进行译码操作,
辨识
add
p>
,
或是
sub
等操
作
执行:指令执行单元根据译码的结果进行运算并保存结果
流水线操作:并发多条流水线(以
3
条为例)
1
取指
译码
执行
2
取指
译码
执行
3
取指
译码
执行
提高时间效率
(
三
)
p>
、学习内容
1.
汇编
(
对裸板机的控制,以及驱动程序控制
)
2.
内核移植(
uboot
移植、内核编译、文件系统移植、应用程序移植)
3.
驱动程序编写
//^^^^^^^^^^^^^^^^^^^^^^^^^^
下午
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(
四
)
p>
、
ADS
的使用
p>
ADS
是汇编或
C
语言编译调试工具
可生成的文件:
.axf
含调试信息
的可执行
ELF
文件
.bin
可烧写的二进制映像文件
.hex
可烧写的十六进制映像文件
ADS
配置
在磁盘中新建一个目录
D:arm
,用来存储所写的代码
点击目录:
File->new,<
/p>
创建一个可执行的
ARM
映象工程
ARM Executable Image
生成
ELF
格式映像(
bi
n)
ARM Object Library
生成
armar
格式目标库文件
Empty Project
创建不包含任何库或源文件的工程
Makefile Importer Wizard
用于
Vc
Thumb
ARM
Interworking
Image
用于
ARM
和
thumb
指令混合代码生成的
ELF
映像
Thumb Executable image
用
thumb
指令生成
ELF
格式映像
Thumb Object
Library
用于
Thumb
指令
的代码生成的
armar
格式文件
选
ARM
Executable
Image
,工程文件名
2440ART
加源文件
project -> Add
Files
新建
填加已有
生成目标的配置
内双击
TargetSettins:
post-linker
选择
ArM
fromELF
Language Settins:Architecture
or Processor
选择相应的编译器
ARM920T
Arm Linker:output
内
RO 0x30000000
options
内
Image
entry point
设为
0x30000000
layout
内
Object
2440init.o Section Init
Listings
内
Image
map
Arm fromELF: output
format
内
Plain
binary
output
filename
内
***.bin
编译
make
调试
AXD
是调试器
设置,
debug ->
打开
AXD
调试界面,选择
option->con
fig target
选项
p>
选ARMUL(模拟调试器)
,然后选择确定.进入调试界面.
p>
ARMUL
是虚拟调试环境(虚拟开发板)
如果用
开发板真实环境调试,则需要使用
JTAG
连开发板后,在此处
选
H-JTAG
用
<
br>;AREA
<
br>R0 <
br>
<
br>标号代表一个地址, <
br>DA 字节的存储单元并初始化为
,ADD <
br>都是以二进制形式存在
file-
项,加载刚才编译所的的
.
axf
调试文件.
execute->run to cousor
项.使程序进入用户主程序
可以用F8来一条一条执行语句,也可用F10,可以设置断
点.
p>
(
五
).
汇编语言
基本结构
例:
AREA
Init,CODE,READONLY
定义代码段,段名
Init;
代码段,只读
ENTRY
;
伪操作,第一条指令的入口
Start
p>
;
标号,一段代码的开始,用于标记,无意义,必须
顶格
MOV
r0,#10
;
将
p>
10
存入
r0
寄存
器,整型常量前面用
#
号
MOV
r1,#3
;
将
p>
3
存入
r1
寄存器
,
r0
和
r1
相当于两个变量,
只是名称固定,在寄存器的存储空间内
ADD
r0,r0,r1
;
将
p>
r0
内数据与
r1
内数据相加,
相加后数据放在
r0
内<
/p>
;Stop
;
p>
停止标号,下面的代码用于停止运行程序
;
MOV
r0,#0x18
;
软件异常中断响应
;
LDR
r1,=0x20026
;ADP
停止运行,应用退出
;
SWI
0x123456
;ARM
半主机软件中断
END
1).
基本概念
(2)
寄存器:如
、
R1
等
ARM
的汇编编程,本质上就是针对
CPU
寄存器的编程。
(3)
指令:即操作码,直接控制
CPU
,如
MOV
包括跳
转指令、数据处理指令、乘法指令、
PSR
访问指令、加载或存
储指令、数据交
换指令、移位指令等
(4)
伪
操作:作用于编译器
,
大多用于定义和控制。如
AREA
包括符号定义、数据定义、控制等
(5)
标
号:仅是一种标识。在跳转语句中,可以指向要跳转到的标识号位置
在
ARM
汇编中,
段内标号的地址在汇编时确定,
段外
标
号的地址值在连接时确定
(6)
符
号
:
即标号
(
代表地址
)
、变量名、数字常量名等。符号的命名规则如下:<
/p>
a.
符号由大小写字母、数字以及下划线组成;
b.
除局部标号以数字开头外,其它的符号不能以数字开头;
c.
符号区分大小写,且所有字符都是有意义的;
d.
符号在其作用域范围你必须是唯一的;
e.
符号不能与系统内部或系统预定义的符号同名;
f.
符号不要与指令助记符、伪指令同名。
2).
段定义
在汇编语言中,以相对独立的指令或数据序列的程序段组成程
序代码
段的划分:数据段、代码段。一个汇编程序至少有一个代码段
(1)
代码段
上面的例子为代码段。
AREA
定义一个段,并说明所定义段的相关属性,
CODE
用以指明为代码段
ENTRY
标识程序的入口点。
p>
END
为程序结束。
(2)
数据段
AREA
DA
TAAREA
,
TA,BIINIT,ALLGN=2
DISPBUF SPACE 200
RCVBUF
SPACE 200
DA<
/p>
TA
用以指明为数据段,
p>
SPACE
分配
200
0
指令和伪操作在后面详细描述
3).
汇编语言结构
[
标号
]
[
指令或伪操作
]
所有标号必须在一行的顶格书写,其后不加冒号
所有指令均不能顶格写
指令助记符大小写敏感,不能大小写混合,只能全部大写或全
部小写
;
为注释
@
代码行注释,同
;
#
整行注释或直接操作数前缀
为换行符
ENTRY
为程序的入口
END
为程序的结束
//*************************************
***************************************
二、
ARM
的寻址方式
最简单的汇编指令格式是操作码和操作数
如
:MOV
r0,#10
操作码:即
CPU
指令
如
MOV ADD
操作数
:即表示数据是在寄存器中还是在内存中,是绝对地址还是相对地址
p>
操作数部分要解决的问题是,
到哪里去获取操作数,
获取操作数的方式就是寻
址方式。
ARM
每一条指令都是
32
位机器码,对应
CPU
的位数
ARM
指令格式:
p>
在
32
位中分为
7
个位域,每个位域分别存储不同意义的编码(二进制数)
31 ~ 28 27~25
24 ~ 21
20
19~16
15~12
11 ~ 0
---
--------------------------------------------------
------
| Cond | 001
|
Opcode
| S |
Rn
|
Rd
|
Operand2 |
---------------
--------------------------------------------
对应输入的一条指令为:
Opcode:
指令操作码
用
p>
4
个位存储,如
MOV
每一个操作码和操作数最终
Cond
:
指令的条件码
用
4
个位来储,可省略
如:
ADD
r0,r0,#1
;
计算
r0
加
1
后的值,再写入到
r0
内
ADDEQ r0,r0,#1
;
只有在
C
PSR
寄存器条件标志位满足指定条件时,
才计算
r0
加
1
后的值,再写入到
r0
内
其中条件助记符如下:
EQ
相等
NE
不相等
MI
负数
VS
溢出
PL
正数或零
HI
无符号大于
LS
无符号小于或等于
CS
无符号大于或等于
CC
无符号小于
GT
有符号大于
arm
体
系
结
构
第
二
天
GE
有符号大于或等于
LE
有符号小于或等于
LT
有符号小于
AL
无条件执行
S
:
决定指令的操作是否影响
CPSR
的值
,
用一个
位存储,
省略则表示为
0
值,
否
则为
1
值
如
SUBS
R0,R0,#1
;R0
减
1
,结果放入
p>
R0
,同时响影
CPSR
< br>的值
SUB
R0,R0,#1
;R0
减
1
,结果放入
R0
,不影响
CPSR
的值
Rd
:
目标寄存器编码
用
4
位存储
Rn
:
第
p>
1
个操作数的寄存器编码
用
4
位存储
Operand2:
第
2
个操作数
用
12
位存储
寻址方
式:是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式
,
共
8
种
寻址方式:
寄存器寻址、立即寻址、寄存器间
接寻址、基址寻址、多寄存器寻址、堆栈寻址、
相对寻址、寄存器移位寻址
p>
//*******
寻
址
< br>方
式
是
重
点
需
要
理
解
背
讼
p>
*****************************************
********
1.
立即寻址
p>
操作数是常量,用
#
表示常量。例
MOV
R0,#0xFF000
;
指令省略了第
1
个
操作数寄存器。
将立即数
0xFF000(
第
2
操作
数
)
装入
R0
寄存器
< br>
SUB
R0,R0,#64
;R0
减
64
,结果放入
R0
#
表示立即数
0x
或<
/p>
&
表示
16
进制
数
否则表示十进制数
p>
立即数寻址指令中的地址码就是操作数本身,可以立即使用的操作数。
其中,
#0xFF000
和
#64
都是立即数。该立即数位于
32
位机器码中,占低位的
12
位。
< br>也就是说在
ARM
指令中以
12
位存储一个数据
< br>那么,
32
位的数据(
long
或
float
)如何存储?
32
位的数据以一种特殊的方式来处理
p>
其中:高
4
位表示的无符号整数
低
p>
8
位补
0
扩展为<
/p>
32
位,然后循环右移
x
位来代表一个数。
x=
高
4<
/p>
位整数
*2
p>
所以,不是每一个
32
位数都是合法的立即
数,只有能通过上述构造得到的才是
合法的立好数。如:
合法立即数:
0xff,0x104,0xff0
不合法立即数:
< br>ox101
,
0x102,0xff1
2.
寄存器寻址
操作数的值在寄存器中,指令执行时直接取出寄存器值来操作
例:
MOV R1,R2
;
p>
将
R2
的值存入
R
1
在第
1
个操作数寄存器的位置存
放
R2
编码
SUB R0,R1,R2
;
将
R1<
/p>
的值减去
R2
的值,
结果保存到
R0
在第
2
操作数
位置,存放
的是寄存器
R2
的编码
寄存器寻址是根据寄存器编码获取寄存器内存储的操作数
3.
寄存器间接寻址
操作数从寄存器所指向的内存中取出,寄存地存储的是内存地址
例:
LDR
R1,[R2]
;
将
R2<
/p>
指向的存储单元的数据读出,保存在
R1
中
R2
相当于指针变量
STR R1,[R2]
;
将
R1<
/p>
的值写入到
R2
所指向的内存
SWP
R1,R1,[R2]
;
p>
将寄存器
R1
的值和
R2
指定的存储单元的内容交换
[R2]
表示寄存器所指向的内存,相当于
*p
LDR
指令用于读取内存数据
STR
指令用于写入内存数据
//-------------------------
----------------------------
4.
寄存器基址寻址
p>
操作数从内存址偏移后读取数据。常用于查表、数组操作、功能部件寄存器访问等。
基址:相当于首地址,地址偏移后取值作为操作数
基址寄存器:用来存放基址的寄存器
变址寻址:基址寻址也称为变址寻址
1)
前索引寻址
例:
LDR R2,[R3,#4]
;
p>
读取
R3+4
地址上的存储单元的内容,放
入
R2
LDR
R2,[R3,#4]!
;
读取
R3
+4
地址上的存储单元的内容,放入
R2
,然后
R3
内的地址变为
R3+4,
即
R3=R3+4
[R3,#4]
表示地址偏移后取值,相当于
*(p+4)
或
p[4]
,
R3
内保存的地址不变
[R3,#4]!
表示地址偏移后取值,相当于
*(p+4)
或
p[4
],!
表示回写,即
R3=R3-4
,R3
的值发生了改变
2)
后索引寻址
例:
LDR
R2,[R3],#4
p>
;
先读取
R3
地址
上的存储单元的内容,放入
R2
,然后
R3
内的地址变为
R3+4,
即
R3=R3+4
[R3],#4
类似于
*p++
只不过自加的不是
1
,而是指定的
4
[R3,#4]!
类似于
*++p
< br>只不过自加的不是
1
,而是指定的
4
3)
寄存器的值作索引
例:
LDR R2,[R3,R0]
;R0
内存储索引值,
R3
内存地址,
读取
R3+R0
地址上的存
< br>储单元的内容,放入
R2
[R3,R0]
表示地址偏移后取值,相当于
*(p+i)
或
p[i]
5.
多寄存器寻址
一次可传送多个寄存器的值,也称为块拷贝寻址
例:
LDMIA
R1!,{R2-R7,R12}
将
R1
< br>指向的存储单元中的数据读写到
R2
~
< br>R7
、
R12
中,
然后
R1
自加
1
STMIA
R1!,{R2-R7,R12}
将寄存器
R2
~
R7
、
R12
的值保存到
R1
指向的
存储单元
中,然后
R1
自加
1
其中
<
/p>
R1
是基址寄存器,
用来存基址,
R2-R7
、
R12
用来存数据
赋值编号小的寄存
器与低
地址相对应,与寄存器列表顺序无关
!
为可选后缀,
表示改变
R1
的值,
则当数据传送完毕之后,
将最后的地址写
入基址寄存器
基址寄存器不允许为
R15
,寄存器列表可以为
R0
~
R15
的任意组合。
p>
这里
R1
没有写成
[R1]!
,是因为这个位不是操作数位,而是寄存器位
LDMIA
和
STMIA
是块拷贝指令
,
< br>LDMIA
是从
R1
所指向的内
存中读数
据,
STMIA
是向
R1
所指向的内存写入数据
R1
指向的是连续地址空间
6.
寄存器堆栈寻址
p>
是按特定顺序存取存储区,按后进先出原则,使用专门的寄存器
SP
(堆栈指针
)
指向一
< br>块存储区
例:
LDMIA
SP!,{R2-R7,R12}
将栈内的数据,读写到
R
2
~
R7
、
R
12
中,然后下一个地
址成为栈顶
STMIA
SP!,{R2-R7,R12}
将寄存器
R2
~
R7
p>
、
R12
的值保存到
SP
指向的栈中
SP
指向的是栈顶
7.
相对寻址
p>
即读取指令本身在内存中的地址。是相对于
PC
内指令地址偏移后的地址。
由程序
计数器
PC
提供基准地址,指令中的地址码字段作为偏移量,两
者相加后得到的
地址即为操作数的有效地址。
例:
B LOOP
;B
指令用于跳转到标号
LOOP
指令处执行代码
...
LOOP
MOV R6 #1
其中<
/p>
LOOP
仅仅是标号,而不是地址,不是
CPU
指令,所以在指令的机器码中没有
标号的机器码,而是<
/p>
计算出了
从
B
指令到
MOV
指令之间内存地址的差值,这个差值相当于
PC
的偏移量,
即
相当于:
add
pc,pc,#
偏移量
B
指令引起了
PC
寄存器值的变化,
PC
内永远
保存将要运行指令在内存中的地址。
8.
寄存器移位寻址
操作数在被使用前进行移位运算
例:
MOV R0,R2,LSL
#3
;R2
的值左移
3
位,
结果放入
R0
,
;
p>
即是
R0=R2
×
8
LSL
是移位指令,用于将前面寄存器的数据
左移
//^^^^^^^^^^^^^^^^^^^^^^^^^^
下午
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ARM
汇编语言语句由
指令、伪指令、伪操作、宏指令组成
三
.ARM
指令集
共包括
6
种类型
:
数据处理指令、跳转指令、程序状态指令、加载存取储指令、协处理
指令、软中断指令
(
p>
一)
、数据处理指令
数据处理指令,只能对寄存器内容进行操作,而不能对内存进
行操作,所有数据处理
指令均可使用
S
后缀,并影响状态标志
包括:数据
传送指令、算述指令、乘法指令、逻辑运算指令、比较指令、移位指令
1.
数据传输指令
1) MOV
数据传送指令
格式:
MOV Rd,
功能:
Rd
=操作数
,
操作数可以是寄存器、被移位的寄存器或立即数。
例:
MOV
R0,#0xFF000
;
立即寻址,将立即数
0xFF000(
第
p>
2
操作数
)
装入<
/p>
R0
寄存器
MOV
R1,R2
;
寄存器寻址,将
< br>R2
的值存入
R1
MOV R0,R2,LSL
#3
;
移位寻址,
R2
的值左移
3
位,结果放入
R0
2) MVN
数据取反传送指令
格式:
MVN
功能:
将操作数传送到目的寄存器
Rd
中,但该值在传送前被按位取反
,即
Rd=!op1
;
例:
MVN
R0,
#
0 R0=-1
mvn
意为“取反传输”
,它把源寄
存器的每一位取反,将得到的结果写入结果寄存器。
p>
movs
和
mvns
指令对
pc
寄存器赋值时有特殊含义,表示要求在赋值的同时
从
spsr
中
恢复
cpsr
。
p>
mov
和
mvn
指
令,编译器会进行智能的转化。比如指令“
mov
r1, <
/p>
0xffffff00
”中的立
即数是非
法的。
在编译时,
编译器将其转化为
“
mvn
r1, 0xff
”
,
这样就不违背立
即数的要求。
所以对于
mov
和
mvn
指令,
可以认为:合法的立即数反码也是合法的立即数。
2.
算术指令
1) ADD
加法指令
格式:
ADD{
p>
功能:
Rd
=
Rn
+op2
例:
ADD R0,R1,
#
5
;R0=R1+5
ADD R0,R1,R2
;R0=R1+R2
ADD
R0,R1,R2,LSL
#
5 R0=R1+R2
左移
5
位
2)
ADC
带进位加法指令
格式:
ADC{
p>
功能:
Rd
=
Rn
+op2+carry ,carry
为进位标志值。
该指令用
于实现超过
32
位的数的加法。
例如:
第一个
6
4
位操作数存放在寄存器
R2
,
R3
中;
第二个
64
位操作数存放在寄存器
R4
,
R5
p>
中;
p>
64
位结果存放在
R0
,
R1
中。
ADDS R0,R2,R4
低
3
2
位相加,
S
表示结果影响条件标志位
的值
ADC
R1,R3,R5
高
32
位相加<
/p>
3) SUB
减法指令
格式:
SUB{
p>
功能:
Rd
=
Rn
-op2
例:
SUB
R0,R1,
#
5 R0=R1-5
SUB R0,R1,R2 R0=R1-R2
SUB
R0,R1,R2,LSL
#
5 R0=R1-R2
左移
5
位
4)
SBC
带借位减法指令
格式:
SBC{
p>
功能:
Rd
=
Rn
-op2-!carry
SUB
和
SBC
生成进位标志的方式不同于常
规,如果需要借位则清除进位标志,所以
指令要对进位标志进行一个非操作。
例:
第一个
64
位操作数存放在寄存器
R2
,
R3
中;
第二个
64
位操作数存放在寄存器
R4
,
R5
p>
中;
64<
/p>
位结果存放在
R0
,
R1
中。
SUBS R0,R2,R4;
低
32
位相减,
S
表示结果影响条件标志位的值
SBC
R1,R3,R5;
高
32
位相减
5)
其它减法指令
RSB
反向减法指令
,
同
SUB
指令,但倒换了
两操作数的前后位置,即
Rd
=
op2
-Rn
。
RSC
带借位的反向减法指令
,
p>
同
SBC
指令,但倒换了两操作数的前后位
置,即
Rd
=
op2-Rn-!car
ry
。
rsb
r0, r1, r2
/* r0
= r2
–
r1 */
rsc
r0, r1, r2
/* r0 = r2
–
r1 + carry
–
1 */
add
s
和
adcs
在进位时将
cpsr
的
C
标志置
1
;否则置
0
。
p>
sub
s
和
sbcs
在产生借位时将
cpsr
的
C
标志置<
/p>
0
;否则置
1
。
3.
乘法指令
1) MUL 32
位乘法指令
格式:
MUL{
功能:
Rd
=
Rn
×
op2
该指令
根据
S
标志,决定操作是否影响
CPS
R
的值;其中
op2
必须为寄存器。<
/p>
Rn
和
op2
的
值为
32
位的有符号数或无符号数。
例:
MULS R0,R1,R2 R0
=
R1
×
R2
,结果影响寄存器
CPSR
的值
2)
MLA
32
位乘加指令
格式:
MLA{
功能:
Rd
=
Rn
×
op2+op3
op2
和
o
p3
必须为寄存器。
Rn
、
op2
和
op3
的值为<
/p>
32
位
的有符号数或无符号数。
例:
MLA
R0,R1,R2,R3 R0
=
R1
×
R2+R3
3) SMULL
64
位有符号数乘法指令
格式:
SMULL{
功能:
Rdh Rdl
=
Rn
×
op2
Rdh
、
Rdl
和
op2
均为寄存器。
Rn
和
op2
的值为
32
位的
有符号
数。
例:
SMULL R0,R1,R2,R3 R0
=
R2
×
R3
的低
32
位
R1
=
R2
×
R3
的高
32
位
4) SMLAL
64
位有符号数乘加指令
格式:
SMLAL{
功能:
Rdh Rdl
=
Rn
×
op2+Rdh
Rdl
;Rdh
、
Rdl
和
op2
均为寄存器。
Rn
和
op2
的值为
32
位的有符号数,
Rdh R
dl
的值为
64
位的加数。
例:
SMLAL R0,R1,R2,R3
;R0
=
R
2
×
R3
的低
32
位
+R0 R1
=
R2
×
R3
的高
32
位
+R1
5)
UMULL 64
位无符号数乘法指令
格式:
UMULL{
功能:同
SMULL
指令,但指令中
Rn
和
op2
的值为
32
位的无符号数。
例:
UMULL
R0,R1,R2,R3
;R0
=
R2
×
R3
的
低
32
位
R
1
=
R2
×
R
3
的高
32
位
其中
R2
,
R
3
的值为无符号数
6)
UMLAL 64
位无符号数乘加指令
格式:
UMLAL {
功能:同
SMLAL
指令,但指令中
Rn
,
op2
的值为
32
位的无符号数,
Rdh
Rdl
的值
为<
/p>
64
位无符号数。
例:
UMLAL R0,R1,R2,R3
;R0
=
R2
×
< br>R3
的低
32
位
+R0 R1
=
R2
×
R3
的高
32
位
p>
+R1
;
p>
其中
R2
,
R3<
/p>
的值为
32
位无符号数
< br>
R1
,
R0
< br>的值为
64
位
无符号数
4.
逻辑指令:
and
、
orr
、
eor
和
bic
1)
AND
逻辑与指令
格式:
AND{
功能:
Rd
=
Rn AND op2
一般用于
清除
Rn
的特定几位。
例:
AND
R0,R0,
#
5
;
保持
R0
的第
0
位和第
2
位,其余位清<
/p>
0
2) ORR
逻辑或指令
格式:
ORR{
功能:
Rd
=
Rn OR op2
一般用于设置
Rn
的特定几位。
例:
ORR R0,R0,
#
5
;R0
的第
0
位和第
2
位设置为
< br>1
,其余位不变
3)
EOR
逻辑异或指令
格式:
EOR{
p>
功能:
Rd
=
Rn
EOR op2
一般用于将
Rn<
/p>
的特定几位取反。
例:
EOR
R0,R0,
#
5
;R0
的第
0
位和第
2
位取反,其余位不变
4) BIC
位清除指令
格式:
BIC{
功能:
Rd
=
Rn AND (!op2)
用于清除寄存器
Rn
中的某些位,并把结果存放到目的寄
存器
Rd
中
例:
BIC R0,R0,
#
5 R0<
/p>
中第
0
位和第
2
位清
0
,其余位不变
< br>
5.
比较指令
1) CMP
比较指令
格式:
CMP{
功能:
Rn-op1
,根据结果更新<
/p>
CPSR
中条件标志位的值。
例:
CMP
R0,
#
5
;
计算<
/p>
R0-5
,根据结果设置条件标志位
ADDGT
R0,R0,
#
5
;ADD
为加法指令,
GT
为判断条件标志位是
否大于
5,
如
果
R0>5
,则执行
ADD
指令
2) CMN
反值比较指令
格式:
CMN{
功能:
同
CMP
指令,但寄存器
Rn
的值是和
op1
取负的值进行比较。
例:
CMN R0,
#
5
把
R0
与
-5
进行比较
3) TST
位测试指令
格式:
TST{
功能:
Rn AND op1
p>
按位与后,
更新
CPSR
< br>中条件标志位,
用于检查寄存器
Rn
是否
设置了
op1
中相应的位。<
/p>
例:
TST R0
,#
5
测试
R0
中第
0
位和第
2
位是否为
1
4) TEQ
相等测试指令
格式:
TEQ{
功能:
Rn EOR op1
p>
按位异或后,更新
CPSR
中条件标志位,
用于检查寄存器
Rn
的
值是否和
op1
所表示的值相等。
例:
TEQ
R0,
#
5
判断
< br>R0
的值是否和
5
相等
6.
移位指令
(
位运算指令
)
1)
LSL(
或
ASL)
左移
p>
格式:寄存器
,LSL(
或
ASL )
操作数
功能:将寄存器内的数据左移,操作数是移位的位数在
0-31
之间
例
:
MOV
R0, R1, LSL#2
;将
R1
中的内容左移两位后传送到
R0
中。
2)
LSR
操作
右移
格式
:
寄存器
LSR
操作数
功能
:
将寄存嚣内的数据右移
例:
MOV
R0, R1, LSR#2
;
将
R1
中的内容右移两位后传送到
p>
R0
中,
左端用零来填充。
3)
其它移位
ASR
右移,左端用第
31
位值来填充
ROR
右移,循环右移,左端用右端移出的位来填充
RRX
右移,循环右移,左端用进位标志位
C
来填充
//*************************************
***************************************
(
二
)
、跳转
指令
1) B
跳转指令
格式:
B{
功能:
跳转到
addr
地址。
例:
B exit;
程序跳转到标号<
/p>
exit
处
2)
BL
带返回的跳转指令
格式:
BL{
功能:
同
B
指令,但
BL
指令执行跳转操作的同时,还将
PC
(寄存器
R15
)的值保
存到
LR<
/p>
寄存器(寄存器
R14
)中。
该指令用于实现子程序调用,程序的返回可通过把
LR
寄存器的值复制到
PC
寄存器中来实现。
例:
BL func;
调用子程序
func
arm
体
系
结
构
第
三
天
…
func
…
MOV R15,R14;
子程序返回
3)
其它跳转指令
BLX
带返回和状态切换的跳转指
令,用于子程序调用和程序
Thumb
状态的切换。
BX
带状态切换的跳转指令,处理器跳转到目标地址处,目标
地址处的指令可以是
ARM
指令,也可以是
Thumb
指令。
跳转指令用于实现程序的跳转和程序状态的切换。
p>
ARM
程序设计中,实现程序跳转有两种方式:跳转指令、直接向程
序寄存器
PC
中写入
目标地址值。
p>
//---------------------------
--------------------------------------------------
-----------
(三)
、程序状态指令
用于状态寄存器和通用寄存器间传
送数据。总共有两条指令:
MRS
和
M
SR
。两者结
合可用来修改程序状态寄存器的值。
1) MRS
程序状态寄存器到通用寄存器的数据传送指令
格式:
MRS{
功能:用于将程序状态寄存器的内容传送到目标寄存器
Rd
中。
例:
MRS R0,CPSR
;
状态寄存器
CPSR
的值存入寄存器
R0
中
p>
2) MSR
通用寄存器到程序状态寄存器的数据传送指令
格式:
MSR{
功能:用于将寄存器
Rd
的值传送到程序状态寄存器中。
:用来设置状态寄存器中需要操作的位。
p>
32
位的状态寄存器可以分为
4
个域:
位
[31
:
24]
为条件标志位域,用
f
表示。
位
p>
[23
:
16]
为
状态位域,用
s
表示。
p>
位
[15
:
8]<
/p>
为扩展位域,用
x
表示。
位
[7
:<
/p>
0]
为控制位域,用
c
< br>表示。
例:
MSR CPSR_f,R0
用
R0
的值修改
CPSR
的条件标志域
MSR CPSR_fsxc,#5;
CPSR
的值修改为
5
(四)
、加载存储指令
p>
该集合的指令使用频繁,当数据存放在内存中时,必须先把数据从内存装载到寄存器,
执行完后再把寄存器
中的数据存储到内存中
1.
单数据访存指令
1
)单数据加载指令
格式:
LDR(
或
LDRB
< br>、
LDRBT
、
LDRH
、
LDRSB
、
LD
RSH
、
LDRT
、
< br>STR
、
STRB
、
STRBT
、
STRH
、
STRT)
功能:内存地址中的数据装载到目
标寄存器
Rd
中,同时还可以把合成的有效地址写
回到基址寄存器。
寻址方式:
Rn
:基址寄存器。
Rm
:变址寄存器。
Index
:偏移量,
12
位的无符
号数。
LDR Rd,[Rn]
;
p>
把内存中地址为
Rn
的字数据装入寄存器<
/p>
Rd
中
LDR Rd,[Rn,Rm]
;
p>
将内存中地址为
Rn+Rm
的字数据装入寄
存器
Rd
中
LDR
Rd,[Rn,
#
index]
;
p>
将内存中地址为
Rn+index
的字数据
装入
Rd
中
LDR
Rd,[Rn,Rm,LSL
#
5]
;
将内存中地址为
< br>Rn+Rm
×
32
的字数据装入
Rd
LDR
Rd,[Rn,Rm]!
;
将内存
中地址为
Rn+Rm
的字数据装入
Rd
,并将
新地址
Rn+Rm
写入
Rn
LDR
Rd,[Rn,
#
index]!
;
将内存
中地址为
Rn+index
的字数据装入
Rd
,并将
新地址
Rn+index
写入
Rn
LDR
Rd,[Rn,Rm
,
LSL
#
5]!
将内存中地址为
Rn+Rm
×
32
的字数据装入
Rd
,
并将新地址
Rn+Rm
×
32
写入
Rn
LDR Rd,[Rn],Rm
p>
;
将内存中地址为
Rn
的字数据装入寄存器
Rd
,并
将新
地址
Rn+Rm
写入
Rn
LDR
Rd,[Rn],
#
index
;
p>
将内存中地址为
Rn
的字数据装入寄存器<
/p>
Rd
,
并将
新地
址
Rn+index
写入
Rn
LDR
Rd,[Rn],Rm,LSL
#
5
;
将内存中地址为
< br>Rn
的字数据装入寄存器
Rd
,
并
将新地址
Rn+Rm
×
32
写入
Rn
各指令的区别:
(1) LDR
字数据加载指令
将内存
地址中的字数据装载到目标寄存器
Rd
中
例:
LDR
R0,[R1,R2,LSL
#
5]!
;
将内存中地址为
R1+R2
×
32
的字数据装入寄存
器
R0
,并将新地址
R1+R2
p>
×
32
写入
R1
(2) LDRB
字节数据加载指令
同
LDR,
只是从内存读取一个
8
位的字节数据而不是一个
32
位的字数据,并将
Rd
的
高
24
位清
0
。
例:
LDRB
R0,[R1]
p>
;
将内存中起始地址为
R1
的一个字节数据装入
R0
中
(3) LDRBT
用户模式的字节数据加载指令
同
LDRB
指令,但无论处理器处于何种模式,都将该指令当作一般用户模式下
的内存操作。
(4) LDRH
半字数据加载指令
同
LDR
指令,但该指令只是从内存读取一个
16
位的半字数据而不是一个
32
位
的字
数据,并将
Rd
的高
16
位清
0
。
例:
LDRH
R0,[R1]
;
p>
将内存中起始地址为
R1
的一个半字数据装
入
R0
中
(5) LDRSB
有符号的字节数据加载指令
同
LDRB
指令,但该指令将寄存器
Rd
的高
24
位设置成所装载的字节数据符号
位的值。
例:
LDRSB
R0,[R1] <
/p>
;
将内存中起始地址为
R1
的一个字节数据装入
R0
中,
R0
的高
24
位设置成该字节数据的
符号位
(6) LDRSH
有符号的半字数据加载指令
同
LDRH
指令,但该指令将寄存器
Rd
的高
16
位设置成所装载的半字数据符号
位的值。
例:
LDRSH R0,[R1]
将内存中起始地址为
R1
的一个
16<
/p>
位半字数据装入
R0
中,
R0
的高
16
位设置成该半字
数据的符号位
(7) LDRT
用户模式的字数据加载指令
同
LDR
指
令,但无论处理器处于何种模式,都将该指令当作一般用户模式下的
内存操作。有效地址
必须是字对齐的
2
)单数据存储指令
格式:
S
TR(
或
STR
、
STRB
、
STRBT
、
STRH
、
STRT)
功能:将寄存器数据写入到内存中
寻址方式:
Rn
:基址寄存器。
Rm
:变址寄存器。
Index
:偏移量,
12
位的无符
号数。
STR
Rd,[Rn]
p>
;
将寄存器
Rd
中
的字数据写入到内存中地址为
Rn
内存中
STR
Rd,[Rn,Rm]
p>
;
将寄存器
Rd
中
的字数据写入到内存中地址为
Rn+Rm
的内存中
STR
Rd,[Rn,
#
index]
p>
;
将寄存器
Rd
中
的字数据写入到内存中地址为
Rn+index
内存中
STR
Rd,[Rn,Rm,LSL
#
5]
;
将寄存
器
Rd
中的字数据写入到内存中地址为
Rn+Rm
×
32
内存中
STR
Rd,[Rn,Rm]!
p>
;
将寄存器
Rd
中
的字数据写入到内存中地址为
Rn+Rm
的内存中
STR
Rd,[Rn,
#
index]!
;
p>
将寄存器
Rd
中的字数据写入到内存中地址
为
Rn+index
的内存中,并将新地址
Rn+index
写入
Rn
STR
Rd,[Rn,Rm
,
LSL
#
5]!
;
将寄存器
Rd
中的字数据写入到内存中
地址为
Rn+Rm
×
32
的内存中,并将新地址
Rn+Rm
×
32
写入
Rn
STR
Rd,[Rn],Rm
p>
;
将寄存器
Rd
中
的字数据写入到内存中地址为
Rn
的内存中,并将新地址
Rn+Rm
写入
Rn
STR
Rd,[Rn],
#
index
;
p>
将寄存器
Rd
中的字数据写入到内存中地址
为
Rn
的
内存中,并将新地址
Rn+index
写入
Rn
STR
Rd,[Rn],Rm,LSL
#
5
;
将寄存
器
Rd
中的字数据写入到内存中地址为
Rn
的内存中,并将新地址
Rn+Rm
×
32
写入
Rn
(1)
STR
字数据存储指令
把寄存器
Rd
中的字数据(
32
位)保存到
add
r
所表示的内存地址中,同时还可
以把合成的有效地址写回到基
址寄存器。
例:
STR
R0,[R1,
#
5]!
;
把
R0
中的字数据保
存到以
R1+5
为地址的内存中,然
后
R1
=
R1+5
(2)
STRB
字节数据存储指令
把寄存器
Rd
中的低
8
位字节数据保存到
addr
所表示的内存地址中。
例:
STRB R0,[R1]
;
p>
将寄存器
R0
中的低
8
位数据存入
R1
表示的内存地址中
(3) STRBT
用户模式的字节数据存储指令
同
STR
B
指令,
但无论处理器处于何种模式,
该指令都将被当作一般用户模式下
的内存操作。
(4) STRH
半字数据存储指令
把寄存器
Rd
中的低
16
位半字数据保存到
add
r
所表示的内存地址中,而且
addr
所表示的地址必须是半字对齐的。
例:
STRH R0,[R1]
;
将寄存器
R0
中的低
16
位数据存入
R1
表示的内存地址中
(5) STRT
用户模式的字数据存储指令
同
STR
指
令,但无论处理器处于何种模式,该指令都将被当作一般用户模式下
的内存操作。
2.
多数据访存指令
1)
批量数据加载指令
格式:
LDM{
功能:
从一片连续的内存单元读取数
据到各个寄存器中,
内存单元的起始地址为基址
寄存器
Rn
的值,各个寄存器由寄存
p>
器列表
regs
表示。
该指令一般用于多个寄存器数据的出栈。
type
字段种类:
IA<
/p>
:每次传送后地址加
1
。
IB
:每
次传送前地址加
1
。
DA
:每次传送后地址减
1
。
DB
:每次传送前地址减
1
。
FD
:满递减堆栈。
ED
:空递减堆栈。
FA
:满递增堆栈。
EA
:空递增堆栈。
堆
栈
寻
p>
址
的
命
令
LDMFA/STMFA
、
LDMEA/STM
EA
、
LDMFD/STMFD
、
p>
LDMED/STMED
。
LDM
和
STM
表示多寄存器寻址,即一次可以传送多个寄存器值。
p>
LDM
:一次装载多个,这里用来出栈。
STM
:一次存储多个,这里用来入
栈。
F/E
表示指针指向的位置
F
:
p>
full
满堆栈,表示堆栈指针指向最后一个入栈的有效数据项。<
/p>
E
p>
:
empty
空堆栈,表示堆栈指针指向下
一个要放入的空地址。
A/D
表示堆栈的生长方式
A
:堆栈向高地址生长,即递增堆栈。
D
:堆栈向低地址生长,即递减堆栈。
注意:
有一个约定,
编号低的寄存器在存储数据或者加载数据时对应于
存储器的低地
址。
FD<
/p>
、
ED
、
FA<
/p>
和
EA
指定是满栈还是空栈,是升序栈还
是降序栈,用于堆栈寻
址。
一个满栈的栈指针指向上次写的最后一个数据单元
.
空栈的栈指针指向第一个空闲单元。
一个降序栈是在内存中反向增长而升序栈在内存中正向增长。
p>
{!}
:若选用了此后缀,则当指令执行完毕后,将最后的地址写入
基址寄存器。
{^}
:当
regs
中不包含
PC
时,该后缀用于指示指令所用的寄存器为用户模式
下的寄存器,
否则指
示指令执行时,将寄存器
SPSR
的值复制到
< br>CPSR
中。
2)
批量数据存储指令
格式:
STM{
功能:
将各个寄存器的值存入一片连
续的内存单元中,
内存单元的起始地址为基址寄
存器
Rn
的值
各个寄
存器由寄存器列表
regs
表示。
该指令一般用于多个寄存器数据的入栈。
{^}
:指示指令所用的寄存器为用户模式下的寄存器。其他参数用法同
LDM
指令。
例:
STMEA
R13!,{R0-R12,PC}
;
将寄存器
R0~R12
以及程序计
数器
PC
的值保存到
R13
指示的堆栈中
3.
数据交换指令
1)
字数据交换指令
格式:
SWP
功能:
Rd
=
[op2]
,
[op2]
=
op1
从
p>
op2
所表示的内存装载一个字并把这个字放置到目的寄存器
Rd
中,
然后把
寄存
器
op1
的内容存储到同一内存地址中。
例:
SWP
R0,R1,[R2]
;
将
R2
所表
示的内存单元中的字数据装载到
R0
,然后将
< br>R1
中
的字数据保存到
R2
p>
所表示的内存单元中
2)
字节数据交换指令
格式:
SWPB
功能:
从
op2
所表示的内存装载一个字节并把这个字节放置到目的寄
存器
Rd
的低
8
位中,
Rd
的高
24
位设置为
0
;
p>
然后将寄存器
op1
的低
< br>8
位数据存储到同一内存地址中。
例:
SWPB R0,R1,[R2]
将
R2
所表示的内存单元中的一个字节数据装载到
R0
的低
8
位,然后将
R1
中的低
8
位字节
数据保存到
R2
所表示的内存单元中
//^^^^^^^^^^^^^^^^^^^^^^^^^^
下午
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
< br>(
五
)
、协处理指令
1) CDP
协处理器操作指令
格式:
,
CDP{
p>
功能:用于传递指令给协处理器
p
,要求其
在寄存器
CRn
和
CRm
上,进行操作
opcode1
,并把结果存放到
p>
CRd
中,
可以使
用
opcode2
提供与操作有关的补充信息。
指令中的所有寄存器均为协处
理器的寄存器,操作由协处理器完成。
指令中
:
P
为协处理器编号;
CRd
为目的寄存器的协处理器寄存
器;
CRm
和
CRn
为存放操作数的协处理器寄存器;
Opcode1
和
< br>opcode2
为协处理器即将执行的操作。
例:
CDP
p5
,
5
,
c0
,
c1
,
c2
,
9
;该指令用于通知协处理器
p5
,在
c1
和
c
2
上执行
操作
5
和
9
,并将结果存放到
c0
中。
2)
LDC
协处理器数据读取指令
格式:
, <
br>为协处理器的寄存器; <
br>,
, p5 [R1+5] , <
br>的寄存器
,
5
LDC
{
功能:将
addr
表示的内存地址中的连续数据传送到目的寄存器
CRd
中。
L
p>
表示指令为长读取操作,比如用于双精度数据的传输;
目的寄存器
CRd
add
r
的寻址方式同
LDR
指令,其寄存器
为
ARM
处理器的寄存器。
例:
LDC p5
c1
,
[R1+5]:
该指令用于将
R1
+
5
所对应的存储单元中的数据,传送到
协处理器
p5
的寄存器
c1
中。
3)
STC
协处理器数据存储指令
格式:
S
TC{
功能:
将
寄存器
CRd
的值传送到
addr
p>
表示的内存地址中。
指令中各参数用法同
L
DC
。
例如:
STC
,
c1
,
;
该指令用于将
协处理器
p5
中寄存器
c1
的数据传送到
R1
+
5<
/p>
所对应的存储单元中。
4) MCR
ARM
寄存器到协处理器寄存器的数据传送指令
格式:
MCR{
p>
功能:将
ARM
处理器的寄存器
Rd
中的数据传送到协处理器
p
CRn
,
CRm
中;
op1
,
op2
为协处理器将要执行的操作。
例:
MCR p5,5,R1,C1,C2,9
;该指令将
R1
中的数据传送到协处理器
p5
的寄存器
C1
,
C2
中,协处理器执行操作
5
和
9
。
MRC
协处理器寄存器到
ARM
p>
寄存器的数据传送指令
格式:
MRC
{
功能:
将协处理器
p
的寄存器
CRn
,
CRm
的数据传送到
ARM
处理器的寄存器
Rd
中;
op1
,
op2
p>
为协处理器将要执行的操作。
例:
MRC p5,5,R1,C1,C2,9
;该指令将寄存器
C1
,
C2
中的数据传送到
R1
中,协处理
器
p5
协处理器执行操作
和
9
。
(
p>
六
)
、异常中断指令
-
-
-
-
-
-
-
-
-
上一篇:专利技术交底书-案例模板-软件类-样板示例
下一篇:英语歧义