蝴蝶兰花:【2011.03.17】ARM指令集[总结篇]
来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 03:06:14
ARM指令集比较简单,本文介绍ARM指令集中需要注意和不易理解的地方。 一、ARM指令集是32位的,程序的启动都是从ARM指令集开始,包括所有异常中断都是自动转化为ARM状态,并且所有的指令都可以是有条件执行的。
二、ARM指令集是Load/Store型的,只能通过Load/Store指令实现对系统存储器的访问,而其他的指令都是基于处理器内部的寄存器操作完成的,这和INTEL汇编是不同的,初学者很不易理解。
三、指令的后缀:
"S" 可选后缀,若指定S,则根据指令执行的结果更新CPSR中的条件码。很多初学着不知道怎么更新,若这条指令执行完以后,对ARM程序状态寄存器的条件码标志(N,Z,C,V)的影响。
"! " 表示在完成数据操作以后,将更新基址寄存器,并且不消耗额外的时间。
如:LDR R0, [R1, #4] 他相当于 R0 <- mem32[R1+4]
R1 = R1+4;
"^" LDMFD R13!, (R0-R3, PC)^ //"^"表示一条特殊形式的指令。(在从存储器中装入PC的同时,CPSR也得到恢复)。 四、#号后面加0x或&表示十六进制:#0xFF, #&FF
#号后面加0b表示二进制。
#号后面加0d表示十进制。
******************************************************************************* 五、立即数寻址
每个立即数都是采用一个8位的常数循环右移偶数位间接得到。
初学者不易理解:一个32位的指令不可能全部用来保存32位的立即数,所以从指令的编码格式上分析,在指令编码中只分配了12位来存储立即数,其中4位用来保存右循环值,8位用来保存一个常数,所以并不是每一个32位的立即数都是合法的。 六、寄存器寻址
ADD R3,R2,R1,LSR #2 //寄存器R1的内容右移了两位,但是注意本指令执行完毕以后R1的内容并不改变。 七、前变址、自动变址和后变址
1、前变址:LDR R0,[R1,#4] //R1寄存器的内容先加4,然后执行操作,但操作完毕以后,R1的内容不变。
2、自动变址:上面总结指令后缀时提到"!",表示自动变址(参考上面 三 )。
3、后变址:LDR R0,[R1],#4 //先进行操作然后R1+4->R1,操作完毕后,R1 = R1+4。不需要"!"号。
八、堆栈寻址
一定要注意:堆栈操作总是要指定自动变址的,否则会覆盖以前保存的内容。
******************************************************************************** 九、乘法指令
1、乘法指令不支持第二操作数为立即数。
2、结果寄存器不能同时作为第一源寄存器。
32位:MUL Rd,Rm,Rs
MUL Rd,Rm,Rs //Rd和Rm不能为同一寄存器
64位:MUL RdHi,RdLo,Rm,Rs //RdHi、RdLo和Rm不能为同一寄存器,RdHi和RdLo不能为同一寄存器。 十、跳转指令
1、BL和BLX跳转是硬件自动将下一条指令地址保存到LR(R14)中,不需要自己写指令。
2、当指令跳转到32MB地址空间以外时,将产生不可预料的结果。 ARM的指令集比较简单,肯定还有其他需要注意的地方,欢迎网友们积极参与补充。
二、ARM指令集是Load/Store型的,只能通过Load/Store指令实现对系统存储器的访问,而其他的指令都是基于处理器内部的寄存器操作完成的,这和INTEL汇编是不同的,初学者很不易理解。
三、指令的后缀:
"S" 可选后缀,若指定S,则根据指令执行的结果更新CPSR中的条件码。很多初学着不知道怎么更新,若这条指令执行完以后,对ARM程序状态寄存器的条件码标志(N,Z,C,V)的影响。
"! " 表示在完成数据操作以后,将更新基址寄存器,并且不消耗额外的时间。
如:LDR R0, [R1, #4] 他相当于 R0 <- mem32[R1+4]
R1 = R1+4;
"^" LDMFD R13!, (R0-R3, PC)^ //"^"表示一条特殊形式的指令。(在从存储器中装入PC的同时,CPSR也得到恢复)。 四、#号后面加0x或&表示十六进制:#0xFF, #&FF
#号后面加0b表示二进制。
#号后面加0d表示十进制。
******************************************************************************* 五、立即数寻址
每个立即数都是采用一个8位的常数循环右移偶数位间接得到。
初学者不易理解:一个32位的指令不可能全部用来保存32位的立即数,所以从指令的编码格式上分析,在指令编码中只分配了12位来存储立即数,其中4位用来保存右循环值,8位用来保存一个常数,所以并不是每一个32位的立即数都是合法的。 六、寄存器寻址
ADD R3,R2,R1,LSR #2 //寄存器R1的内容右移了两位,但是注意本指令执行完毕以后R1的内容并不改变。 七、前变址、自动变址和后变址
1、前变址:LDR R0,[R1,#4] //R1寄存器的内容先加4,然后执行操作,但操作完毕以后,R1的内容不变。
2、自动变址:上面总结指令后缀时提到"!",表示自动变址(参考上面 三 )。
3、后变址:LDR R0,[R1],#4 //先进行操作然后R1+4->R1,操作完毕后,R1 = R1+4。不需要"!"号。
八、堆栈寻址
一定要注意:堆栈操作总是要指定自动变址的,否则会覆盖以前保存的内容。
******************************************************************************** 九、乘法指令
1、乘法指令不支持第二操作数为立即数。
2、结果寄存器不能同时作为第一源寄存器。
32位:MUL Rd,Rm,Rs
MUL Rd,Rm,Rs //Rd和Rm不能为同一寄存器
64位:MUL RdHi,RdLo,Rm,Rs //RdHi、RdLo和Rm不能为同一寄存器,RdHi和RdLo不能为同一寄存器。 十、跳转指令
1、BL和BLX跳转是硬件自动将下一条指令地址保存到LR(R14)中,不需要自己写指令。
2、当指令跳转到32MB地址空间以外时,将产生不可预料的结果。 ARM的指令集比较简单,肯定还有其他需要注意的地方,欢迎网友们积极参与补充。
【2011.03.17】ARM指令集[总结篇]
ARM指令集详解2
[ZZ]GNU ARM 汇编指令
arm-linux-ld指令详解
【2011.03.19】ARM汇编伪指令 宏的用法详解[MACRO MEND]
ARM汇编伪指令详解 (转)
Linux 指令集/命令
JVM指令集
VI?指令集
手机AT指令集
PowerPC汇编指令集
JVM指令集及各指令的详细使用说明
【2011.03.21】ARM中断处理过程
【2011.03.21】ARM汇编 -- 嵌入式学习博客
基于ARM的汇编优化和基本指令用法 - ARM开源共享 - 61IC代码工厂 - 开阔思路,放飞想象,步入顶尖电子开发工程师的成长通道!
ARM论坛 - ARM技术论坛
ARM开发总结的小知识 Code, RO-data,RW-data,ZI-data
记本无法连接MINI2440 ARM开发板串口总结 - HHBBHH的专栏 - CSDN博...
X86架构以及指令集未来趋向
js 写的linux x86指令集
看懂PowerPC汇编之指令集架构
AT命令集(又称贺氏指令)
ARM寄存器
10.1.4 JTAG接口指令集 - 51CTO.COM