arm汇编编程(示例)
存器R4,R5中;
64位结果存放在R0,R1中。
SUBSR0,R2,R4;低32位相减,S表示结果影响条件标志位的值
SBCR1,R3,R5;高32位相减
5)其它减法指令
RSB反向减法指令,同SUB指令,但倒换了两操作数的前后位置,即Rd=op2-Rn。
RSC带借位的反向减法指令,同SBC指令,但倒换了两操作数的前后位置,即Rd=op2-Rn-!carry。
rsb r0,r1,r2 /*r0=r2–r1*/
rsc r0,r1,r2 /*r0=r2–r1+carry–1*/
adds和adcs在进位时将cpsr的C标志置1;否则置0。
subs和sbcs在产生借位时将cpsr的C标志置0;否则置1。
3.乘法指令
1)MUL32位乘法指令
格式:MUL{
功能:Rd=Rn×op2
该指令根据S标志,决定操作是否影响CPSR的值;其中op2必须为寄存器。Rn和op2的值为32位的有符号数或无符号数。
例:
MULSR0,R1,R2;R0=R1×R2,结果影响寄存器CPSR的值
2)MLA32位乘加指令
格式:MLA{
功能:Rd=Rn×op2+op3op2和op3必须为寄存器。Rn、op2和op3的值为32位的有符号数或无符号数。
例:
MLAR0,R1,R2,R3;R0=R1×R2+R3
3)SMULL64位有符号数乘法指令
格式:SMULL{
功能:RdhRdl=Rn×op2Rdh、Rdl和op2均为寄存器。Rn和op2的值为32位的有符号数。
例:
SMULLR0,R1,R2,R3;R0=R2×R3的低32位R1=R2×R3的高32位
4)SMLAL64位有符号数乘加指令
格式:SMLAL{
功能:RdhRdl=Rn×op2+RdhRdl;Rdh、Rdl和op2均为寄存器。Rn和op2的值为32位的有符号数,RdhRdl的值为64位的加数。
例:
SMLALR0,R1,R2,R3;R0=R2×R3的低32位+R0R1=R2×R3的高32位+R1
5)UMULL64位无符号数乘法指令
格式:UMULL{
功能:同SMULL指令,但指令中Rn和op2的值为32位的无符号数。
例:
UMULLR0,R1,R2,R3;R0=R2×R3的低32位R1=R2×R3的高32位其中R2,R3的值为无符号数
6)UMLAL64位无符号数乘加指令
格式:UMLAL{
功能:同SMLAL指令,但指令中Rn,op2的值为32位的无符号数,RdhRdl的值为64位无符号数。
例:
UMLALR0,R1,R2,R3;R0=R2×R3的低32位+R0R1=R2×R3的高32位+R1
;其中R2,R3的值为32位无符号数R1,R0的值为64位无符号数
4.逻辑指令:and、orr、eor和bic
1)AND逻辑与指令
格式:AND{
功能:Rd=RnANDop2一般用于清除Rn的特定几位。
例:
ANDR0,R0,#5;保持R0的第0位和第2位,其余位清0
2)ORR逻辑或指令
格式:ORR{
功能:Rd=RnORop2一般用于设置Rn的特定几位。
例:
ORRR0,R0,#5;R0的第0位和第2位设置为1,其余位不变
3)EOR逻辑异或指令
格式:EOR{
功能:Rd=RnEORop2一般用于将Rn的特定几位取反。
例:
EORR0,R0,#5;R0的第0位和第2位取反,其余位不变
4)BIC位清除指令
格式:BIC{
功能:Rd=RnAND(!op2)用于清除寄存器Rn中的某些位,并把结果存放到目的寄存器Rd中
例:
BICR0,R0,#5;R0中第0位和第2位清0,其余位不变
5.比较指令
1)CMP比较指令
格式:CMP{
功能:Rn-op1,根据结果更新CPSR中条件标志位的值。
例:
CMPR0,#5;计算R0-5,根据结果设置条件标志位
ADDGTR0,R0,#5;ADD为加法指令,GT为判断条件标志位是否大于5,如果R0>5,则执行ADD指令
2)CMN反值比较指令
格式:CMN{
功能:同CMP指令,但寄存器Rn的值是和op1取负的值进行比较。
例:
CMNR0,#5;把R0与-5进行比较
3)TST位测试指令
格式:TST{
功能:RnANDop1按位与后,更新CPSR中条件标志位,用于检查寄存器Rn是否设置了op1中相应的位。
例:
TSTR0,#5;测试R0中第0位和第2位是否为1
4)TEQ相等测试指令
格式:TEQ{
功能:RnEORop1按位异或后,更新CPSR中条件标志位,用于检查寄存器Rn的值是否和op1所表示的值相等。
例:
TEQR0,#5;判断R0的值是否和5相等
6.移位指令(位运算指令)
1)LSL(或ASL)左移
格式:寄存器,LSL(或ASL)操作数
功能:将寄存器内的数据左移,操作数是移位的位数在0-31之间
例:
MOVR0,R1,LSL#2;将R1中的内容左移两位后传送到R0中。
2)LSR操作右移
格式:寄存器LSR操作数
功能:将寄存嚣内的数据右移
例:
MOVR0,R1,LSR#2;将R1中的内容右移两位后传送到R0中,左端用零来填充。
3)其它移位
ASR右移,左端用第31位值来填充
ROR右移,循环右移,左端用右端移出的位来填充
RRX右移,循环右移,左端用进位标志位C来填充
//*arm体系结构第三天*
(二)、跳转指令
1)B跳转指令
格式:B{
功能:跳转到addr地址。
例:
Bexit;程序跳转到标号exit处
2)BL带返回的跳转指令
格式:BL{
功能:同B指令,但BL指令执行跳转操作的同时,还将PC(寄存器R15)的值保存到LR寄存器(寄存器R14)中。
该指令用于实现
arm汇编编 相关文章:
- ARM汇编编程基础之四-ARM汇编伪操作(11-27)
- ARM汇编编程基础之三-基本寻址方式与基本指令(11-27)
- ARM汇编编程基础之一-寄存器(11-27)
- ARM汇编编程基础之五-ADS开发环境的使用(11-27)
- ARM汇编编程基础之二-流水线对PC值的影响(11-27)
- ARM汇编编程基础之六-其它寻址模式与其它指令(11-27)
