arm指令集 从汇编开始
时间:11-20
来源:互联网
点击:
特点:
Load / Store结构(存储器操作仅包括load和store,所有其他操作在寄存器中完成)
32位固定指令宽度
3地址指令格式(即两个源操作数和结果寄存器都独立指定)
每条指令都条件执行
可在单周期执行的单条指令内同时完成一项普通以为操作和一项普通ALU操作
自动变址功能
寄存器模型
用户模式下
R1-R15的15个32位通用寄存器堆,R15为PC寄存器
CPSR的状态寄存器高四位表示N(负数)、Z(零)、 C(进位)、V(溢出)标志
分类介绍:
+-------------+-------------+-----------+
| 数据处理指令| 数据传送指令| 控制流指令|
+-------------+-------------+-----------+
------------------------------------------------------------------------------
数据处理指令:对寄存器内数据进行算术或逻辑操作
简单寄存器操作
算术操作: ADD, ADC, SUB, SBC, RSB, RSC
说明: RSB和RSC分别为反向减法和带进位反向减法
举例: ADD r0, r1, r2 ; r0 = r1 + r2
RSB r0, r1, r2 ; r0 = r2 - r1
按位逻辑操作: AND,ORR,EOR,BIC
说明:按位与,按位或,按位异或,and not
举例: BIC r0, r1, r2 ; r0 = r1 and not r2
寄存器传送操作:MOV,MVN
说明: MVN为按位取反传送
举例: MVN r0, r2 ; r0 = not r2
比较操作:CMP,CMN,TST,TEQ
说明: 比较,取反比较,位测试,测试相等
举例: TEQ r1, r2 ;
注意:操作数顺序格式为结果寄存器,第一操作数,第二操作数
立即数操作:
说明: 在数字前面加#表示立即数,加#&表示16进制立即数
举例: ADD r3, r3, #1 ; r3 = r3 + 1
AND r8, r7, #&ff ; r8 = r7 & 0xFF
寄存器移位操作:四地址指令
移位指令:LSL, LSR,ASL,ASR,ROR,RRX
说明: 逻辑左移,逻辑右移,算术左移,算术右移,循环右移,扩展
一位的循环右移
举例: ADD r3, r2, r1, LSL #3 ; r3 = r2 + (r1 < 3)
设置条件码:
说明:任何数据处理指令都可以设置条件码(NZCV),比较操作只能设
置条件码,如果其他数据处理操作要设置条件码,需要增加S
操作码来指明。
算术操作(包括CMP,CMN)根据算术运算结果来设置所有标志
位,逻辑和传送操作不产生有意义的C或V值,这些操作根据结
果来设置N和Z,保留V,没有移位操作时,保留C;或者当移位
时,将移位移出的最后位设置为C。
举例: ADDS r2, r2, r0
ADC r3, r3, r1
乘法操作:
说明: 第二操作数不可以为立即数
结果寄存器不允许为源寄存器
如果设置位S,则标志位V保留,标志为C不再有意义。
长乘的话,高32位有效位放入第二个结果寄存器。
举例: MUL r4, r3, r3 ; r4 = r3 * r2
MLA r4, r3, r2, r1 ; r4 = r3 * r2 + r1
------------------------------------------------------------------------------
数据传送指令:在ARM寄存器和存储器之间传送数据
基本数据传送指令
单寄存器的Load / Store指令
多寄存器的Load / Store指令
单寄存器的交换指令:主要用于系统级程序,实现原子操作。
寻址模式:ARM的数据传送指令包括寄存器间接寻址,基址偏移和基址变址,
说明:在任何情况下都需要有一个ARM寄存器来寄存地址,该地址靠近
需要传送数据的地址。
举例: LDR r0, [r1] ; r1内数值代表的存储器位置的内容读入r0
STR r0, [r1] ; 将r0写入r1内数值代表的存储器位置
前变址(pre-indexed)
说明:基址寄存器不包含确定地址,在基址上加上不超过4KB
的偏移量来寻址
举例: LDR r0, [r1, #4] ; 寻址r1+4
自动变址的前变址:
说明:自动变址时,会同时实现对基址寄存器的修改。
举例:LDR r0, [r1, #4]! ; 寻址r1+4并将r1+=4
后变址(post-indexed)
说明:基址不加偏移寻址,立即数偏移量仅用作基址修正
举例: LDR r0, [r1], #4 ; 寻址r1,并将r1+=4
任意字节对齐的指令:LDRB
多寄存器数据传送和块传送(块传送略)
说明:同时存取几个寄存器,允许16个寄存器的任意子集合用单条
指令传送。支持自动变址
举例: LDMIA r1, {r0, r2, r5} ;将[r1],[r1+4],[r1+8]分别
读入r0, r2, r5
------------------------------------------------------------------------------
控制流指令
转移指令(branch)
说明:无条件转移B,BAL
举例: B LABEL ; LABEL为某个位置
条件转移
说明: BEQ 相等
BNE 不等
BPL 非负
BMI 负
BCC 无进位
BCS 有进位
BLO 小于(无符号数)
BHS 大于等于(无符号数)
BHI 大于(无符号数)
BLS 小于等于(无符号数)
BVC 无溢出(有符号数)
BVS 有溢出(有符号数)
BGT 大于(有符号数)
BGE 大于等于(有符号数)
BLT 小于(有符号数)
BLE 小于等于(有符号数)
和其中BCC和BLO,BCS和BHS的二进制代码相同
条件执行
说明:有时可以用条件执行来代替转移,要使用条件执行,要在3字符
的操作码之后增加2字符的条件码,条件码应该在其他任何
修正码之前。
举例: CMP r0, #5
ADDNE r1, r1, r0
SUBNE r1, r1, r2
; 在r0!=5的情况下才会执行后续加减语句
转移和链接指令和子程序返回指令
说明:用于跳转并返回,比如子程序,BL指令,注意不能嵌套子程序,
否则上一级的返回地址将被下一级的返回地址覆盖,这时应该
把返回地址和变量保存到堆栈上,使用STMFD和LDMFD
监控程序调用(略)
说明:软中断相关,可用于提供IO访问
跳转表(略)
说明:用于子程序列表较长时,注意要检测跳转表越界
------------------------------------------------------------------------------
参考文献
《ARM SoC 体系结构》第二版 Steve Furber著
Load / Store结构(存储器操作仅包括load和store,所有其他操作在寄存器中完成)
32位固定指令宽度
3地址指令格式(即两个源操作数和结果寄存器都独立指定)
每条指令都条件执行
可在单周期执行的单条指令内同时完成一项普通以为操作和一项普通ALU操作
自动变址功能
寄存器模型
用户模式下
R1-R15的15个32位通用寄存器堆,R15为PC寄存器
CPSR的状态寄存器高四位表示N(负数)、Z(零)、 C(进位)、V(溢出)标志
分类介绍:
+-------------+-------------+-----------+
| 数据处理指令| 数据传送指令| 控制流指令|
+-------------+-------------+-----------+
------------------------------------------------------------------------------
数据处理指令:对寄存器内数据进行算术或逻辑操作
简单寄存器操作
算术操作: ADD, ADC, SUB, SBC, RSB, RSC
说明: RSB和RSC分别为反向减法和带进位反向减法
举例: ADD r0, r1, r2 ; r0 = r1 + r2
RSB r0, r1, r2 ; r0 = r2 - r1
按位逻辑操作: AND,ORR,EOR,BIC
说明:按位与,按位或,按位异或,and not
举例: BIC r0, r1, r2 ; r0 = r1 and not r2
寄存器传送操作:MOV,MVN
说明: MVN为按位取反传送
举例: MVN r0, r2 ; r0 = not r2
比较操作:CMP,CMN,TST,TEQ
说明: 比较,取反比较,位测试,测试相等
举例: TEQ r1, r2 ;
注意:操作数顺序格式为结果寄存器,第一操作数,第二操作数
立即数操作:
说明: 在数字前面加#表示立即数,加#&表示16进制立即数
举例: ADD r3, r3, #1 ; r3 = r3 + 1
AND r8, r7, #&ff ; r8 = r7 & 0xFF
寄存器移位操作:四地址指令
移位指令:LSL, LSR,ASL,ASR,ROR,RRX
说明: 逻辑左移,逻辑右移,算术左移,算术右移,循环右移,扩展
一位的循环右移
举例: ADD r3, r2, r1, LSL #3 ; r3 = r2 + (r1 < 3)
设置条件码:
说明:任何数据处理指令都可以设置条件码(NZCV),比较操作只能设
置条件码,如果其他数据处理操作要设置条件码,需要增加S
操作码来指明。
算术操作(包括CMP,CMN)根据算术运算结果来设置所有标志
位,逻辑和传送操作不产生有意义的C或V值,这些操作根据结
果来设置N和Z,保留V,没有移位操作时,保留C;或者当移位
时,将移位移出的最后位设置为C。
举例: ADDS r2, r2, r0
ADC r3, r3, r1
乘法操作:
说明: 第二操作数不可以为立即数
结果寄存器不允许为源寄存器
如果设置位S,则标志位V保留,标志为C不再有意义。
长乘的话,高32位有效位放入第二个结果寄存器。
举例: MUL r4, r3, r3 ; r4 = r3 * r2
MLA r4, r3, r2, r1 ; r4 = r3 * r2 + r1
------------------------------------------------------------------------------
数据传送指令:在ARM寄存器和存储器之间传送数据
基本数据传送指令
单寄存器的Load / Store指令
多寄存器的Load / Store指令
单寄存器的交换指令:主要用于系统级程序,实现原子操作。
寻址模式:ARM的数据传送指令包括寄存器间接寻址,基址偏移和基址变址,
说明:在任何情况下都需要有一个ARM寄存器来寄存地址,该地址靠近
需要传送数据的地址。
举例: LDR r0, [r1] ; r1内数值代表的存储器位置的内容读入r0
STR r0, [r1] ; 将r0写入r1内数值代表的存储器位置
前变址(pre-indexed)
说明:基址寄存器不包含确定地址,在基址上加上不超过4KB
的偏移量来寻址
举例: LDR r0, [r1, #4] ; 寻址r1+4
自动变址的前变址:
说明:自动变址时,会同时实现对基址寄存器的修改。
举例:LDR r0, [r1, #4]! ; 寻址r1+4并将r1+=4
后变址(post-indexed)
说明:基址不加偏移寻址,立即数偏移量仅用作基址修正
举例: LDR r0, [r1], #4 ; 寻址r1,并将r1+=4
任意字节对齐的指令:LDRB
多寄存器数据传送和块传送(块传送略)
说明:同时存取几个寄存器,允许16个寄存器的任意子集合用单条
指令传送。支持自动变址
举例: LDMIA r1, {r0, r2, r5} ;将[r1],[r1+4],[r1+8]分别
读入r0, r2, r5
------------------------------------------------------------------------------
控制流指令
转移指令(branch)
说明:无条件转移B,BAL
举例: B LABEL ; LABEL为某个位置
条件转移
说明: BEQ 相等
BNE 不等
BPL 非负
BMI 负
BCC 无进位
BCS 有进位
BLO 小于(无符号数)
BHS 大于等于(无符号数)
BHI 大于(无符号数)
BLS 小于等于(无符号数)
BVC 无溢出(有符号数)
BVS 有溢出(有符号数)
BGT 大于(有符号数)
BGE 大于等于(有符号数)
BLT 小于(有符号数)
BLE 小于等于(有符号数)
和其中BCC和BLO,BCS和BHS的二进制代码相同
条件执行
说明:有时可以用条件执行来代替转移,要使用条件执行,要在3字符
的操作码之后增加2字符的条件码,条件码应该在其他任何
修正码之前。
举例: CMP r0, #5
ADDNE r1, r1, r0
SUBNE r1, r1, r2
; 在r0!=5的情况下才会执行后续加减语句
转移和链接指令和子程序返回指令
说明:用于跳转并返回,比如子程序,BL指令,注意不能嵌套子程序,
否则上一级的返回地址将被下一级的返回地址覆盖,这时应该
把返回地址和变量保存到堆栈上,使用STMFD和LDMFD
监控程序调用(略)
说明:软中断相关,可用于提供IO访问
跳转表(略)
说明:用于子程序列表较长时,注意要检测跳转表越界
------------------------------------------------------------------------------
参考文献
《ARM SoC 体系结构》第二版 Steve Furber著
arm指令集汇 相关文章:
- 常用ARM指令集及汇编(11-20)
- ARM指令集详解2(11-20)
- 常用 ARM指令集及汇编(11-10)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)