ARM指令汇编语言文档格式.doc
- 文档编号:15494327
- 上传时间:2022-11-02
- 格式:DOC
- 页数:31
- 大小:224.72KB
ARM指令汇编语言文档格式.doc
《ARM指令汇编语言文档格式.doc》由会员分享,可在线阅读,更多相关《ARM指令汇编语言文档格式.doc(31页珍藏版)》请在冰豆网上搜索。
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<
op1>
举例:
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)算术右移:
向右移位,移出的位丢失,最左端保持不变。
这种移位对有符号数据使用时可保持符号位不变。
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块拷贝寻址
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位
单一指令密度
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARM 指令 汇编语言