ARM指令汇编语言.doc
- 文档编号:8775476
- 上传时间:2023-05-14
- 格式:DOC
- 页数:31
- 大小:224.72KB
ARM指令汇编语言.doc
《ARM指令汇编语言.doc》由会员分享,可在线阅读,更多相关《ARM指令汇编语言.doc(31页珍藏版)》请在冰点文库上搜索。
ARM指令集和汇编语言程序
姓名:
何瑞平
学号:
201120928
专业:
电路与系统
本章主要介绍以下内容:
一、ARM寻址方式
包含9种:
立即数寻址
寄存器寻址
寄存器移位寻址
寄存器间接寻址
基址变址寻址
相对寻址
多寄存器寻址
块拷贝寻址
堆栈寻址
寻址空间:
51系列是16位地址总线,寻址空间为:
215。
ARM系列为32位地址总线,寻址空间为:
231
1.1立即数寻址
在立即数寻址中,操作数本身直接在指令中给出,取出指令也就获得了操作数,这个操作数也称为立即数。
例:
ADDR0,R1,#5;R0=R1+5
MOVR0,#0x55; R0=0x55
其中:
操作数5,0x55就是立即数,立即数在指令中要以“#”为前缀,后面跟实际数值。
十进制立即数表达举例:
#0005、#01234;
十六进制立即数表达举例:
#0x0005、#0x0FFFF;
1.2寄存器寻址
在寄存器寻址方式下,寄存器的值即为操作数,寄存器本身就是操作数地址。
在51系列单片机中,可寻址的寄存器是当前工作寄存器R0~R7,A、B和DPTR。
在ARM系列的任一个模式,都有R0~R14、PC、CPSR。
例:
ADDR0,R1,R2 ; R0=R1+R2
MOVR0,R1 ; R0=R1
1.3寄存器移位寻址
寄存器移位寻址是ARM特有的寻址方式,其操作数由寄存器的数值做相应移位而得到。
移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。
例:
ADDR0,R1,R2,ROR#5
;R0=R1+R2循环右移5位
MOVR0,R1,LSLR3
;R0=R1逻辑左移R3位
移位操作在ARM指令集中不作为单独的指令使用,ARM指令集共有5种位移操作。
1.4ARM指令集的5种位移操作
1.4.1LSL(LogicalShiftLef)逻辑左移:
向左移位,左侧移出的位丢失;右端空出位补0;
注:
最后一个左移出的位存放于状态寄存器CPSR的C位中。
移出n位相当于乘以2的n次幂。
指令格式:
Rx,LSL
举例:
R4,LSL#06表明把R4的值逻辑左移6位,空位补0,把最后移出的位赋给程序状态寄存器CPSR的C位。
1.4.2LSR(LogicalShiftRight)逻辑右移:
向右移位,右侧移出的位丢失;左端空出位补0;
注:
最后一个右移出的位存放于状态寄存器CPSR的C位中。
移出n位相当于除以2的n次幂。
指令格式:
Rx,LSR
举例:
R5,LSR#02表明把R5中的数据右移2位,空位补0,把最后移出的位赋给程序状态寄存器的c位。
1.4.3ASR(ArithmeticShiftRight)算术右移:
向右移位,移出的位丢失,最左端保持不变。
注:
最后一个右移出的位存放于状态寄存器CPSR的C位中。
这种移位对有符号数据使用时可保持符号位不变。
指令格式:
Rx,ASR
举例:
R4,ASR#04表明R4内数据向右移4位,符号位不变,最后移出的位也送入状态位C中。
1.4.4ROR(RotateRight)循环右移:
向右移位,右端移出的位填充在左端空位处。
注:
最后一个右移出的位同时存放于状态寄存器CPSR的C位中。
指令格式:
Rx,ROR
举例:
R4,ROR#03表明把R4内的数据向右移3位,移出的位填充到左端空位处,把最后一个右移出的位同时存放于状态寄存器的C位中。
1.4.5RRX(RotateRightextendedBy1Place)
带扩展的循环右移:
向右只移一位,左侧空位由状态寄存器C位填充,右侧移出的位移进位状态位C中
这种移位多用于多位数计算中。
指令格式:
Rx,RRX
举例:
R2,RRX表明R2内的数据向右移一位,把右侧移出的位送入状态寄存器C中,C位中的值放入左侧的空位处。
注意:
在各种移位方式中,假设移位位数为n,则n须遵守以下规则:
ASR1≤n≤32
LSL0≤n≤31
LSR1≤n≤32
ROR1≤n≤31
RRX只右循环一位
1.5寄存器间接寻址
寄存器中的值为操作数的物理地址,而实际的操作数存放在存储器中。
在51系列,可间接寻址的寄存器有R0、R1,DPTR。
在ARM中,可间接寻址的寄存器有R0~R15.
例:
STRR0,[R1] ; [R1]=R0
LDRR0,[R1] ; R0=[R1]
1.6基址变址寻址
将寄存器(称为基址寄存器)的值与指令中给出的偏移地址量相加,所得结果作为操作数的物理地址。
例:
LDRR0,[R1,#5] ; R0=[R1+5]
基址R1,偏移量是立即数5。
LDRR0,[R1,R2] ; R0=[R1+R2]
1.7相对寻址
相对寻址同基址变址寻址相似,区别只是将程序计数器PC作为基址寄存器,指令中的标记作为地址偏移量。
例:
BEQprocess1
……
process1
……
1.8多寄存器寻址
在多寄存器寻址方式中,一条指令可实现一组寄存器值的传送。
连续的寄存器间用“-”连接,否则用“,”分隔。
例:
LDMIAR0,{R1-R5}
;R1=[R0],R2=[R0+4],R3=[R0+8]
;R4=[R0+12],R5=[R0+16]
指令中IA表示在执行完一次Load操作后,R0自增4。
该指令将以R0为起始地址的5个字数据分别装入R1,R2,R3,R4,R5中。
1.9块拷贝寻址
块拷贝寻址可实现连续地址数据从存储器的某一位置拷贝到另一位置。
例:
LDMIAR0,{R1-R5};
STMIAR1,{R1-R5};
第一条指令从以R0的值为起始地址的存储单元中取出5个字的数据,第二条指令将取出的数据存入以R1的值为起始地址的存储单元中。
实际上是多寄存器寻址的组合。
1.10块拷贝寻址
块拷贝寻址可实现连续地址数据从存储器的某一位置拷贝到另一位置。
例:
LDMIAR0,{R1-R5};
STMIAR1,{R1-R5};
第一条指令从以R0的值为起始地址的存储单元中取出5个字的数据,第二条指令将取出的数据存入以R1的值为起始地址的存储单元中。
实际上是多寄存器寻址的组合。
1.11堆栈寻址
堆栈是一块用于保存数据的连续内存,是按先进后出(FILO)的原则存取数据的存储区。
使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。
当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(FullStack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(EmptyStack)。
同时,根据堆栈的生成方式,又可以分为递增堆栈和递减堆栈。
当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低地址生成时,称为递减堆栈。
这样就有4种类型的堆栈工作方式。
ARM堆栈的几种形式
1.满栈递增方式FA(FullAscending)
与51系列的堆栈方式相同,堆栈指针指向最后入栈的数据位置。
数据入栈时,堆栈指针是增计数。
2.空栈递增方式EA(EmptyAscending)
和满栈递增的区别在于,堆栈指针指向下一个入栈数据的位置。
3.满栈递减方式FD(FullDescending)
堆栈指针指向最后入栈的数据,数据入栈时堆栈指针是减计数。
4.空递减方式ED(EmptyDescending)
和满栈的区别在于,堆栈指针指向下一个入栈数据的位置。
堆栈寻址用于数据栈与寄存器组之间批量数据传输。
当数据写入和读出内存的顺序不同时,使用堆栈寻址可以很好的解决这问题。
例:
STMFDR13!
,{R0,R1,R2,R3,R4};
LDMFDR13!
,{R0,R1,R2,R3,R4}
第一条指令,将R0-R4中的数据压入堆栈,R13为堆栈指针;
第二条指令,将数据出栈,恢复R0-R4原先的值。
二、ARM指令集的基本特点
ARM指令系统简介
ARM9处理器支持两种指令集,即32位的ARM指令集和16位Thumb指令集。
ARM微处理器的指令集是加载/存储型的,即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中;而对系统存储器的访问则需要专门的加载/存储指令来完成。
ARM指令集是特殊的指令集,32位编码包含的信息量很大,每一条语句完成的功能很强,在多寄存器操作指令中一次最多可以完成16个寄存器的数据传送。
ARM指令集按指令功能通常分为6大类:
◆跳转指令
◆数据处理指令
◆程序状态寄存器(PSR)处理指令
◆加载/存储指令
◆协处理指令
◆异常产生指令
ARM指令集格式如下图所示:
图2.1ARM指令集格式
可以看到,[31:
28]:
条件代码域。
[27:
20]:
指令代码域。
[19:
16]:
地址基址Rn域。
[15:
12]:
目标或源寄存器Rd域。
[11:
0]:
地址偏移或操作寄存器、操作数区域。
ARM指令集的基本特点
AMR指令集有很多的未定义指令。
ARM指令代码最高4位[31:
28]是条件码域。
ARM指令一般把[27:
20]作为指令代码域。
位[19:
0]包含立即数、寄存器和偏移量等信息。
ARM指令集为寄存器寻址安排4位代码,可寻址16个寄存器。
多数情况下,目标寄存器Rd的寄存器编号存放在[15:
12]位域。
位[20]是重要的条件标志(S)存放位。
2.1与Thumb指令集的区别
ARM指令集和Thumb指令集具有以下共同点:
⒈较多的寄存器,可以用于多种用途。
⒉对存储器的访问只能通过Load/Store指令。
2.2ARM指令集和Thumb指令集的不同点:
x86指令集
非规整指令格式
即:
非正交指令格式
二地址指令
指令隐含决定运算完毕后是否改变状态标志
状态标志位有6位
单一指令密度
有整数除法指令
专用条件判断指令进行程序分支
没有适合DSP处理的乘加指令
运算指令能够访问存储器
ARM指令集
规整指令格式
即:
正交指令格式
三地址指令
由指令的附加位决定运算完毕后是否改变状态标志
状态标志位只有4位
有两种指令密度
无整数除法指令
大多数ARM指令都可以条件执行
有适合DSP处理的乘加指令
Load/Store访存体系结构
2.3与x86处理器的区别
2.4ARM指令格式
一条典型的ARM指令语法如下所示:
其中:
例如:
ADD表示算术加操作指令。
{
{S}决定指令的操作是否影响CPSR的值,可选项。
例如:
ADDEQSR0,R1,#8;
其中操作码为ADD,条件域cond为EQ,
S表示该指令的执行影响CPSR寄存器的值,目的寄存器Rd为R0,第一个操作数寄存器Rn为R1,第二个操作数OP2为立即数#8。
第2操作数
一、立即数控位的寄存器移位表达式
立即数控位,就是寄存器Rm移位的位数由立即数控制。
在RRX移位方式不需要立即数控位。
Rm,LSL#03
本例中,移位位数为3.
移位方式有五种:
LSLn(0≤n≤31)
LSRn(1≤n≤32)
ASRn(1≤n≤32)
RORn(1≤n≤31)
RRX含进位标志C在内的循环右移
二、寄存器控位的寄存器移位表达式
所谓寄存器控位,就是寄存器Rm移位的位数由另一个寄存器Rs来控制,其中Rs为通用寄存器,不可使用R15。
规定0≤Rs≤31.
Rm,LSRRs
移位方式有五种,在RRX移位方式不需要寄存器控位。
第2操作数规范
第2操作数是一个无符号的32位数值,其规范是:
一个8位的无符号数值常量,用0填充到32位后,循环右移偶次后得到的32位数值。
指令可选后缀
S后缀
使用S后缀时,指令执行后的程序状态寄存器CPSR的条件标志位将刷新,不使用则不刷新。
举例:
ADDR3,R5,R8
没有使用S后缀,条件标志位不刷新。
ADDSR3,R5,R8
使用S后缀,条件标志位将刷新。
S后缀适用范围:
有些指令不需要加S后缀,在执行同同样可以刷新条件标志位,例如CMP、CMN和测试指令TEST。
S后缀使用目的:
对条件位进行测试,看是否有溢出,是否有进位。
在指令执行过程中判断是否大于,是否等于等。
注意:
书写时,S后缀紧跟在指令助记符后面。
!
后缀
当含有!
后缀时,基址寄存器中的地址将发生变化,变化结果如下:
基址寄存器中的地址值(指令执行后)=指令执行前的值+地址偏移量
例3.3分别执行下面两条指令有何区别?
LDRR3,[R0,#4]
LDRR3,[R0,#4]!
分析:
在上述指令中,第1条指令没有后缀!
,指令的结果是把R0加4作为地址指针,把这个指针所指向的地址单元所存储的数据读入R3,R0的值不变。
第2条指令除了实现以上操作外,还把R0+4的结果送到R0中。
两条指令加载到R3中的值一样,但前者基址寄存器R0的值不变,后者基址寄存器R0的值自动改变为方括弧内表达式的值。
使用!
后缀需要注意如下事项:
(1)!
后缀必须紧跟在地址表达式后面,而地址表达式要有明确的地址偏移量。
(2)!
后缀不能用于R15(PC)的后面
(3)当用在单个地址寄存器后面时,必须确信这个寄存器有隐性的偏移量,例如“STMDBR1!
{R3,R5,R7}”此时地址基址寄存器R1的隐性偏移量是4。
B后缀
说明指令所涉及的数据是一字节,不是一字或半字。
例如:
LDRR4,[R0,#20]R4=[R0+0x20],传送一字
LDRBR4,[R0,#20]R4=[R0+0x20],传送一字节
第一条指令传送的是32位的字,地址指向该字最低地址,需要地址对齐。
第二条传送的是8位的字节,地址指向这个字节,没有地址对准要求。
注意:
B指令紧跟在指令助记符后面
T后缀
指令在特权模式下对存储器的访问,将被存储器看作是用户模式的访问。
注意:
1.一般只用在字传送和无符号字节传送。
2.不能与前索引一起使用。
举例:
LDRTR4,[R5];R4=R5T模式
指令的条件执行
当处理器工作在ARM状态时,几乎所有的指令均根据CPSR中条件码的状态和指令的条件域有条件的执行。
当指令的执行条件满足时,指令被执行,否则指令被忽略。
每一条ARM指令包含4位的条件码,位于指令的最高4位[31:
28]。
每种条件码可用两个字符表示,这两个字符可以添加在指令助记符的后面,和指令同时使用。
如:
跳转指令B可以加上后缀EQ变为BEQ,表示“相等则跳转”,即当CPSR中的Z标志置位时发生跳转。
指令条件码表:
例3.4下面三条指令有何区别?
ADDR4,R3,#1
ADDEQR4,R3,#1
ADDSR4,R3,#1
分析:
第1条指令不带条件标志(无条件AL),指令的执行不受条件标志位的影响,完成加法运算:
将R3的值加1存入寄存器R4。
第2条ADD指令加上后缀EQ变为ADDEQ表示“相等则相加”,即当CPSR中的Z标志置位时该指令执行,否则不执行。
第3条指令的执行也不受条件标志的影响,但是由于附带了后缀S,这条指令执行的结果将影响CPSR中条件标志位的值。
条件后缀只是影响指令是否执行,不影响指令的内容,如上述ADDEQ指令,可选后缀EQ并不影响本指令的内容,它执行时仍然是一条加法指令。
条件后缀和S后缀的关系如下:
(1)如果既有条件后缀又有S后缀,则书写时S排在后面
如:
ADDEQSR1,R0,R2
该指令在Z=1时执行,将R0+R2的值放入R1,同时刷新条件标志位。
(2)条件后缀是要测试条件标志位,而S后缀是要刷新条件标志位。
(3)条件后缀要测试的是执行前的标志位,而S后缀是依据指令的结果改变条件标志。
三、ARM指令集分类详解
一共有6种类型(53种主要助记符):
数据处理指令(22种主要助记符)
跳转指令(4种主要助记符)
Load/Store指令(16种主要助记符)
程序状态寄存器指令(2种主要助记符)
协处理器指令(5种主要助记符)
软件中断指令(2种主要助记符)
3.1数据处理指令
3.2.1MOV数据传送指令
格式:
MOV{
功能:
Rd=op1
op1可以是寄存器、被移位的寄存器或立即数。
例如:
MOVR0,#5 ;R0=5
MOVR0,R1 ;R0=R1
MOVR0,R1,LSL#5 ;R0=R1左移5位
3.1.2MVN数据取反传送指令
格式:
MVN{
功能:
将op1表示的值传送到目的寄存器Rd中,但该值在传送前被按位取反,即Rd=!
op1;
op1可以是寄存器、被移位的寄存器或立即数。
例如:
MVNR0,#0 ;R0=-1
3.1.3ADD加法指令
格式:
ADD{
功能:
Rd=Rn+op2
op2可以是寄存器,被移位的寄存器或立即数。
例如:
ADDR0,R1,#5 ;R0=R1+5
ADDR0,R1,R2 ;R0=R1+R2
ADDR0,R1,R2,LSL#5 ;R0=R1+R2左移5位
3.1.4ADC带进位加法指令
格式:
ADC{
功能:
Rd=Rn+op2+carry
op2可以是寄存器、被移位的寄存器或立即数;carry为进位标志值。
该指令用于实现超过32位的数的加法。
例如:
第一个64位操作数存放在寄存器R2,R3中;
第二个64位操作数存放在寄存器R4,R5中;
64位结果存放在R0,R1中。
64位的加法可由以下语句实现:
ADDSR0,R2,R4 ;低32位相加,S表示结果影响条件标志位的值
ADCR1,R3,R5 ;高32位相加
3.1.5SUB减法指令
格式:
SUB{
功能:
Rd=Rn-op2
op2可以是寄存器、被移位的寄存器或立即数。
例如:
SUBR0,R1,#5 ;R0=R1-5
SUBR0,R1,R2 ;R0=R1-R2
SUBR0,R1,R2,LSL#5 ;R0=R1-R2左
3.1.6RSB反向减法指令
格式:
RSB{
功能:
同SUB指令,但倒换了两操作数的前后位置,即Rd=op2-Rn。
例如:
RSBR0,R1,#5 ;R0=5-R1
RSBR0,R1,R2 ;R0=R2-R1
RSBR0,R1,R2,LSL#5 ;R0=R2左移5位-R1
3.1.77.SBC带借位减法指令
格式:
SBC{
功能:
Rd=Rn-op2-!
carry
op2可以是寄存器、被移位的寄存器或立即数。
SUB和SBC生成进位标志的方式不同于常规,如果需要借位则清除进位标志,所以指令要对进位标志进行一个非操作。
例如:
第一个64位操作数存放在寄存器R2,R3中;
第二个64位操作数存放在寄存器R4,R5中;
64位结果存放在R0,R1中。
64位的减法(第一个操作数减去第二个操作数)可由以下语句实现:
SUBSR0,R2,R4; 低32位相减,S表示结果影响条件标志位的值
SBCR1,R3,R5; 高32位相减
3.1.8RSC带借位的反向减法指令
格式:
RSC{
功能:
同SBC指令,但倒换了两操作数的前后位置,即Rd=op2-Rn-!
carry。
例如:
前提条件与SBC例子相同,操作数1-操作数2的实现语句需改为:
SUBSR0,R2,R4; 低32位相减,S表示结果影响寄存器CPSR的值
RSCR1,R5,R3; 高32位相减
3.1.9MUL32位乘法指令
格式:
MUL{
功能:
Rd=Rn×op2
该指令根据S标志,决定操作是否影响CPSR的值;其中op2必须为寄存器。
Rn和op2的值为32位的有符号数或无符号数。
例如:
MULSR0,R1,R2 ;R0=R1×R2,结果影响寄存器CPSR的值
3.1.0MLA32位乘加指令
格式:
MLA{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 指令 汇编语言
![提示](https://static.bingdoc.com/images/bang_tan.gif)