原创 ARM汇编语言指令总结

2011-1-17 15:57 3405 12 18 分类: 消费电子

ARM处理器有9种寻址方式:1、寄存器寻址,2、立即寻址,3、寄存器器移位寻址,4、寄存器间接寻址,5、基址寻址,6、多寄存器寻址,7、堆栈寻址,8、块拷贝寻址,9、相对寻址。

ARM指令集:ARM指令基本格式如下:

{}{S} ,{,}

其中<>的内容是必须的,{}的内容是可选的。OPCODE指令助记符,COND执行条件,S是否影响CPSR中的值,Rd目标寄存器,Rn第一个操作数的寄存器,OPERAND2第二个操作数。灵活的使用第2个操作数“operand2”能够提高代码效率。它有如下的形式:1)#immed_8r——常数表达式;2)Rm——寄存器方式;3)Rm,shift——寄存器移位方式(ASR算术右移,LSL逻辑左移,LSR逻辑右移,ROR循环右移,RRX带扩展的右移1位)。COND执行条件:

下面介绍ARM指令:

1、存储器访问指令。存储器访问指令分为单寄存器操作指令和多寄存器操作指令。单寄存器操作指令LDR/STR指令用于对内存变量的访问、内存缓冲区数据的访问、查表、外围部件的控制操作等。LDR:从内存到寄存器,加载数据。STR:将寄存器的数据存储到内存。LDRB操作字节,LDRH操作半字,LDRSH操作有符号半字。多寄存器操作指令LDM为加载多个寄存器;STM为存储多个寄存器。允许一条指令传送16个寄存器的任何子集或所有寄存器。它们主要用于现场保护、数据复制、常数传递等。进行数据复制时,先设置好源数据指针和目标指针,然后使用块拷贝寻址指令LDMIA/STMIA(传送后地址加4)、LDMIB/STMIB(传送前地址加4)、LDMDA/STMDA(传送后地址减4)、LDMDB/STMDB(传送前地址减4)进行读取和存储 。进行堆栈操作操作时,要先设置堆栈指针(SP),然后使用堆栈寻址指令STMFD/LDMFD(满递减堆栈) 、STMED/LDMED(空递减堆栈)、STMFA/LDMFA(满递增堆栈)和STMEA/LDMEA(空递增堆栈)实现堆栈操作。

2、寄存器和存储器交换指令。SWP指令用于将一个内存单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。

SWP{cond}{B} Rd,Rm,[Rn]

3、ARM数据处理指令。分三类数据传送指令;算术逻辑运算指令;比较指令。数据处理指令只能对寄存器的内容进行操作,而不能对内存中的数据进行操作。所有ARM数据处理指令均可选择使用S后缀,并影响状态标志。数据传送指令:MOV,MVN(数据取反传送指令);算术运算:ADD,SUB,RSB(逆向减法指令),ADC,SBC,RSC(带进位逆向减法指令);逻辑运算指令:ADD,ORR,EOR,BIC(位清除指令);比较指令:CMP,CMN(负数比较指令),TST(位测试指令),TEQ(相等测试指令)。

4、乘法指令。MUL(32乘法指令),MLA(32乘加指令),UMULL(64无符号乘法指令),UMLAL(64无符号乘加指令),SMULL(64有符号乘法指令),SMLAL(64有符号乘加指令)。

5、分支指令。B(分支指令),BL(带连接的分支指令),BX(带状态切换的分支指令)。

6、协处理器指令。CDP(协处理器数据操作指令),LDC(协处理器数据读取指令),STC(协处理器数据写入指令),MCR(ARM寄存器到协处理器寄存器的数据传送指令),MRC(协处理器寄存器到ARM寄存器到的数据传送指令)。

7、杂项。SWI(软件中断指令),MRS(读状态寄存器指令),MSR(写状态寄存器指令)。

8、伪指令。ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令可以读取更大范围的地址。LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。NOP伪指令在汇编时将会被代替成ARM中的空操作,比如可能是“MOV R0,R0”指令等。NOP可用于延时操作。

各个指令的具体作用,使用方式需查看更详细的说明。

文章评论6条评论)

登录后参与讨论

用户1625603 2011-10-17 15:08

讲的是指令大概的用法 初学者有个印象 还是很好的

用户1629247 2011-10-14 08:31

好东西,谢谢

用户1575892 2011-1-25 17:59

汇总的好,可以借鉴

用户1584511 2011-1-20 15:54

只是对指令做了简单的总结,有一个初步的印象,使用arm汇编还是非常难的!!!

用户1493325 2011-1-19 12:15

这么简单?其实说的很简单!

用户1249549 2011-1-19 09:44

hao
相关推荐阅读
用户1584511 2011-04-28 13:56
关于离职
犹豫不安,思前顾后,让自己徘徊了一些日子。最终还是选择离开,第一份工作画上了句号。虽然他并不是很成功,但或多或少还是为自己之后的生活积累了经验。到此为止整整一年的时间,这一年中我做了些什么,有时候会恨...
用户1584511 2011-02-25 11:21
can总线应用问题
本人想通过开发一个代理程序,实现对CAN网络的管理监视,需要找到一种方法来确定CAN总线网络当前运行节点个数。 但是现在有个难题,基于目前CAN总线中传输的报文,我无法确定目前网络中节点的个数?如果运...
用户1584511 2011-01-28 16:42
位段
C语言中对内存存取信息一般以字节为单位。实际上,有时一个信息用不了那么多位,因此C语言中允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或“位域”。利用位段能够用...
用户1584511 2011-01-27 15:44
中断向量控制器
ARM7TDMI内核具有两个中断输入,分别为IRQ中断和FIQ中断。中断向量控制器不是ARM设计的,ARM只提供以上两个中断输入接口,中断向量控制器是由各个厂商根据自己的实际情况设计的。下面介绍的是...
用户1584511 2011-01-26 08:55
存储器加速模块
存储器加速模块产生的原因:LPC2114/2124/2210/2212/2214微控制器的ARM内核工作在最高频率60MHz时,执行一条指令约为17ns。而Flash存储器的访问周期需要50ns,...
用户1584511 2011-01-26 08:54
用Typedef定义类型
C语言中可以用typedef声明新的类型名来代替已有的类型名。例如:typedef int INTEGER,指定用INTEGER代替int。 声明一个新的类型名的方法: 1、先按定义变量的...
我要评论
6
12
关闭 站长推荐上一条 /2 下一条