嵌入式系统--ARM指令格式及其寻址方式

来源:互联网 发布:淘宝土特产交易数据 编辑:程序博客网 时间:2024/05/29 13:29
呃。。。动手写这个纯属无聊之举。。
我也不知能不能写完,尽力而为吧。
【考完试了,不打算再更新了...】
ARM助记符格式:
<opcode>{<cond>}{s} <Rd>,<Rn>,<op2>;
<opcode>:操作码,如ADD表示算术加操作指令。
{<code>}:决定指令执行的条件域。
{S}:决定和指令执行是否影响CPSR寄存器的值。
<Rd>:目的寄存器。
<Rn>:第一个操作数,为寄存器。
<op2>:第二个操作数。


条件域<cond>
EQ Z置位 相等
NE Z清零 不相等
CS C置位 无符号数大于或等于
CC C清零 无符号数小于
MI N置位 负数
PL N清零 正数或零
VS V置位 溢出
VC V清零 未溢出
HI C置位Z清零 无符号数大于
LS C清零Z置位 无符号数小于或等于
GE N等于V 带符号数大于或等于
LT N不等于 带符号数小于
GT Z清零且(N等于V) 带符号数大于
LE Z置位或(N不等于V) 带符号数小于或等于
AL 忽略 无条件执行


(1)LSL逻辑左移
格式:Rx,LSL <op1>

(2)LSR逻辑右移
格式:RX,LSR <op1>

(3)ASR算术右移
格式:Rx,ASR <op1>
功能,最高有效位(第31位)用其原来值(移位后第30位)来填充

(4)ROR循环右移
格式:Rx ,ROR <op1>
共更能:最高有效位(第31位)用溢出的最低有效位(第0位)来填充。

(5)RRX带扩展的循环右移
格式:Rx,RRX
功能:右移固定位数固定为1,最高有效位(第31位)用进位标志位来填充。(如下图)


STR R0 ,[R1] ;[R1] = R0, 将寄存器R0的值存入以R1的值为地址的存储单元中

LDR R0 ,[R1[,R2]]        ;R0 = [R1[,+R2]],将以寄存器R1的值为地址的存储单元中的数据装入R0中

BEQ processs1 ;将程序条状大process1处执行。


多寄存器寻址:
LDMIA R0,{R1-R5} ;将以R0为起始地址的5个字数据分别装入R1,R2,R3,R4,R5中。
LDMIA R0,{R1,R2} ;将以R0为起始地址的2个字分别装入R1,R2中。

STMIA R0,{R1-R5} ;将R1-R5取出的依次数存入以R0为起始地址的存储单元中。
STMIA R0,{R1,R2} ;将R1,R2取出的数依次存入以RO为起始地址的存储单元中。

堆栈寻址:
STMFD R13!,{R0,R1,R2,R3,R4} ;将R0~R4中的数据压入堆栈,R13为堆栈指针
LDMFD R13!,{R0,R1,R2,R3,R4} ;将数据出战,恢复R0~R4原先的值

数据处理指令:
1、MOV 数据传送指令
格式:MOV{<cond>}{S} <Rd>,<op1>
功能:将操作数op1表示的值传送到目的寄存器Rd中,即Rd = op1。

2、MVN数据取反传送指令:
格式:MVN{<cond>}{S} <Rd>,<op1>
功能:将op1表示的中传送到目的寄存器Rd中,但改值在传送前被按位取反(逻辑非取反)。

3、ADD 加法指令:
格式:ADD{<cond>}{S} <Rd>,<Rn>,<op2>
功能:将寄存器Rn的值和操作数op2的值相加,然后将结果存入目的寄存器Rd中。

4、ADC 带进位加法指令:
格式:ADC{<cond>}{S} <Rd>,<Rn>,<op2>
功能:将寄存器Rn、操作数op2表示的值以及进位标志三者相加,然后把结果存入目的寄存器中,即Rd = Rn + op2 + carry。用于实现操作32位的数的加法。

5、SUB 减法指令:
格式:SUB {<cond>}{S} <Rd>,<Rn>,<op2>
功能:将寄存器Rn的值减去操作数op2的值,然后把结果存入目的寄存器Rd中。

6、RSB 反向减法指令:
格式:RSB{<cond>}{S} <Rd>,<Rn>,<op2>
功能:倒换俩操作数的前后位置,即Rd = op2 - Rn

7、SBC 带借位减法指令:
格式:SBC{<cond>}{S} <Rd>,<Rn>,<op2>
功能:用寄存器Rn的值减去操作数op2表示的值,再减去进位标志取反的值,然后存入Rd中。即Rd = Rn - op2 -!carry。

8、RSC 带借位的反向减法指令:
格式:RSC{<cond>}{S} <Rd>,<Rn>,<op2>
功能:即:Rd = op2 - Rn -!carry

9、MUL 32位乘法指令:
格式:MUL{<cond>}{S} <Rd>,<Rn>,<op2>
功能:将寄存器Rn的值与op2的值相乘,结果存入Rd 中。Rd = Rn * op2。

10、MLA 32位乘加指令:
格式:MLA{<cond>}{S} <Rd>,<Rn>,<op2>,<op3>
功能:Rd = Rn * op2 + op3

11、SMULL 64位有符号数乘法指令:
格式:SMULL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>
功能:Rdh Rdl = Rn * op2。其中,Rdh、Rdl、op2均为寄存器,Rn 和 op2的值为32位的有符号数。

12、SMLAL 64位有符号数乘加指令:
格式:SMLAL{<cond>}{S} <Rdl>,<Rdh>,<Rn>,<op2>
功能:Rdh Rdl = Rn * op2 + Rdh Rdl。

13、UMULL 64位无符号数乘法指令:




尼玛,我就往后看了那么一下下,然后我惊奇的发现,居然还有N十个指令啊!!!!!
我擦,我不想写了。。。。有没有这么肯跌的啊,我写了一个多小时了,才写了这么点。。。。。
以后真的蛋疼的时候在说吧!!!!!!
我要吃饭去了。。。。。。