微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > arm汇编编程(示例)

arm汇编编程(示例)

时间:11-09 来源:互联网 点击:

存器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{}{S},,;

功能:Rd=Rn×op2

该指令根据S标志,决定操作是否影响CPSR的值;其中op2必须为寄存器。Rn和op2的值为32位的有符号数或无符号数。

例:

MULSR0,R1,R2;R0=R1×R2,结果影响寄存器CPSR的值

2)MLA32位乘加指令

格式:MLA{}{S},,,;

功能:Rd=Rn×op2+op3op2和op3必须为寄存器。Rn、op2和op3的值为32位的有符号数或无符号数。

例:

MLAR0,R1,R2,R3;R0=R1×R2+R3

3)SMULL64位有符号数乘法指令

格式:SMULL{}{S},,,;

功能:RdhRdl=Rn×op2Rdh、Rdl和op2均为寄存器。Rn和op2的值为32位的有符号数。

例:

SMULLR0,R1,R2,R3;R0=R2×R3的低32位R1=R2×R3的高32位

4)SMLAL64位有符号数乘加指令

格式:SMLAL{}{S},,,;

功能: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{}{S},,,;

功能:同SMULL指令,但指令中Rn和op2的值为32位的无符号数。

例:

UMULLR0,R1,R2,R3;R0=R2×R3的低32位R1=R2×R3的高32位其中R2,R3的值为无符号数

6)UMLAL64位无符号数乘加指令

格式:UMLAL{}{S},,,;

功能:同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{}{S},,;

功能:Rd=RnANDop2一般用于清除Rn的特定几位。

例:

ANDR0,R0,#5;保持R0的第0位和第2位,其余位清0

2)ORR逻辑或指令

格式:ORR{}{S},,;

功能:Rd=RnORop2一般用于设置Rn的特定几位。

例:

ORRR0,R0,#5;R0的第0位和第2位设置为1,其余位不变

3)EOR逻辑异或指令

格式:EOR{}{S},,;

功能:Rd=RnEORop2一般用于将Rn的特定几位取反。

例:

EORR0,R0,#5;R0的第0位和第2位取反,其余位不变

4)BIC位清除指令

格式:BIC{}{S},,;

功能: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)中。

该指令用于实现

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top