您的位置:首页 > 其它

ARM汇编指令 具体操作例子

2010-01-11 18:20 656 查看
1.ADD 加法指令

ADD Rx,Rx,#1 ; Rx=Rx+1

ADD Rd,Rx,Rx,LSL #n; Rx=Rx+Rx*(2**n)

ADD Rs,PC,#offset; 生成基于PC的跳转指针

2.ADC带进位加法指令

ADC和ADD指令联合使用可以实现两个64位的操作数相加。源64位操作数:R1R0,新64位操作数:R3R2

以下指令可以实现两个64位的操作数相加:

ADDS R4,R0,R2

ADDC R5,R1,R3

3.MOV 数据传送指令

MOV R0, R0 ; R0 = R0... NOP 指令

MOV R0, R0, LSL#3 ; R0 = R0 * 8

4.MVN 数据取反传送指令

MVN R0, #4 ; R0 = -5

【4(00000100b) 取反为 11111011,这个是数是-5的补码,所以r0=-5 】

MVN R0, #0 ; R0 = -1

6.SUB 减法指令

SUB R0, R1, R2 ; R0 = R1 - R2
SUB R0, R1, #256 ; R0 = R1 - 256
SUB R0, R2, R3,LSL#1 ; R0 = R2 - (R3 << 1)=R2-2*R3

注意:在SUBS指令中,如果发生了借位操作,CPSR寄存器中的C标志位设置成0,无借位则为1,这和 ADDS指令中的进位指令正好相反。

7.SBC 带借位减法指令

被减数:R1R0; 减数:R3R2

SUBS R4,R0,R2

SBC R5,R1,R3

8.RSB 逆向减法指令

RSB Rd,Rx,#0 ; Rd=-Rd

RSB Rd,Rx,Rx,LSL#n; Rd=Rx*(2**n-1)

9.RSC 带借位减法指令

例如:求一个64位数的相反数。64位数:R1R0, 相反数:R3R2

RSBS R2,R0,#0

RSC R3,R1,#0

其中R2=-R0,R3=-R1-(-C) ,-C是逻辑操作

10.AND 逻辑与操作指令

AND R2,R1,R3 ; R2=R1&R3

ANDS R0,R0,#0X01; R0=R0&0X01,取出最低位数据

AND R0, R0, #3 ;R0=R0&3,保留R0中的0位和1位,丢弃别的位

11.ORR 逻辑或操作

ORR R0, R0, #3 ; 设置 R0 中位 0 和 1

12.EOR 逻辑异或操作

EOR R0,R0,#3 ; 反转R0中的0位和1位

13.BIC 位清除指令

BIC R0,R0,#0X0F ;将R0的最低四位清零,其余位不变

14.CMP 比较指令

CMP R0,#10

15.CMN 基于相反数的比较指令

CMN R0,#1 ;把R0和-1进行比较

16.TST 位测试指令

TST R0,#1; 测试在R0中是否设置了位0

17.TEQ 相等测试指令

TEQ R0,R1 ;测试R0和R1是否相等

18.MUL 乘法指令

MUL R0,R1,R2 ; R0=R1*R2

MULS R0,R1,R2 ; R0=R1*R2,同时设置CPSR中的N位和Z位

19.MLA 乘加操作

MLA R0,R1,R2,R3 ; R0=R1*R2+R3

20.SMULL 64位有符号数乘法指令

SMULL E1,R2,R3,R4 ;R1=(R3*R4)的低32位,R2=(R3*R4)的高32位

21.SMLAL 64位带加数的有符号数乘法指令

SMLAL R2,R3,R7,R6 ; (R3,R2)=R7*R6+(R3,R2)

22.UMULL 无符号数长乘指令

UMULL R0,R1,R5,R8 ; (R1,R0)=R5*R8

23.UMLAL 无符号长乘-累加操作指令

UMLAL R0,R1,R5,R8 ; (R1,R0)=R5*R8+(R1,R0)

24.CLZ 零计数指令

该指令用于计算最高符号位和第一个1之间的0的个数。

25.MRS 用于将状态寄存器的内容传送到通用寄存器中

MRS{<cond>}<Rd>,CPSR

MRS{<cond>}<Rd>,SPSR

26.MSR 用于将通用寄存器的内容或者一个立即数传送到状态寄存器中

27.LDR 字数据读取指令

LDR指令用于从内存中将一个32位的字读取到指令中的目标寄存器。

LDR R0,[R1,#4] ; R0=R1+4

LDR R0,[R1,#4] ; R0=R1-4

LDR R0,[R1,R2] ; R0=R1+R2

LDR R0,[R1,R2,LSL #2] ;R0=R1=4*R2

LDR R0,[R1,#4]! ; R0=R1+4,R1=R1+4

LDR R0,[R1,R2]! ; R0=R1+R2 ,R1=R1+R2

LDR R0,[R1,R2,LSL #2] ;R0=R1=4*R2,R1=R1=4*R2

LDR R0,[R1],#4 ; R0=R1,R1=R1+4

LDR R0,[R1],#R2 ; R0=R1,R1=R1+R2

LDR R0,[R1],R2,LSL #2 ; R0=R1,R1=R1+4*R2

28.LDRB 字节数据读取指令

LDRB将一个8位的诗句从内存读取到指令中的目标寄存器,并将寄存器的高24位清零。

LDRB R0,[R2,#3] ; 将内存(R2+3)中的字节数据读取到R0,RO中的高24位设置为0

29.LDRBT 用户模式的字节数据读取指令

LDRBT指令用于从内存中将一个8位的字节数据读取到指令中的目标寄存器,并将寄存器的高24位清零。

30.LDRH 半字节数据读取指令

LDRH指令用于从内存中将一个16位的半字节数据读取到指令的目标寄存器中,并将寄存器的高16位清零。

LDRH R0,[R1]; R0=R1,R0中高16位设置为0

31.LDRSB 有符号的字节数据读取指令

LDRSB 用于从内存中将一个8位的字节数据读取到指令中的目标寄存器中,并将寄存器的高24位设置成该字节数据的符号位的值(即将该8位字节数据进行符号位扩展,生成32位字节)

LDRR7,[R6,#-1]; 将内存单元(R6-1)中的有符号字节数据读取到R7中,R7中高24位设置成该字节书库的符号位,R6=R6-1

32.LDRSH 有符号的半字节数据读取指令

LDRSH R7,[R6,#2]! ;将内存单元(R6+2)中的字节数据读取到R7中,R0中高16位设置为该半字的符号位,R6=R6+2

33.LDRT 用户模式的字数据读取指令

LDRT指令用于从内存中将一个32位的字数据读取到指令中的目标寄存器中。

34.STR 字数据写入指令

STR指令将一个32位的字数据写入到指令中指定的内存单元。

STR R0,[R1],#8 ;将R0中的字数据保存到内存单元(R1)中,R1=R1+8

35.STRB 字节数据写入指令

STRB用于从寄存器中取出指定的8位字节数据放入到寄存器的低8位,并将寄存器的高位补零。

STRB R3,[R5,#0X200]! ;将R3中的低8位数据保存到内存单元(R5+0X200)中,R5=R5+0X200

36.STRH 半字节数据写入指令

STRH用于将一个16位的半字节数据写入到指令中指定的内存单元。

37.STRT 用户模式的字数据写入指令

STRT指令用于将一个32位的字数据写入到指定的内存单元。

38.STRBT 用户模式的字节数据写入指令

STRBT指令用于将一个8位的字节数据写入到指令中指定的内存单元。

39.LDM(1) 批量内存子数据读取指令

40.LDM(2) 用户模式的批量内存子数据读取指令

41.LDM(3) 带状态寄存器的批量内存字数据读取指令

42.STM(1) 批量内存字数据写入指令

43.STM(2) 用户模式的批量内存字数据写入指令

44.SWP 交换指令

SWP R1,R2,[R3] ;将内存单元(R3)中的字数据读取到R1,同时将R2寄存器的数据写入到内存单元(R3)中

SWP R1,R1,[R2] ; 将R1寄存器内容和内存单元(R2)的内容互换

45.SWPB 字节交换指令

SWPB R1,R2,[R3] ;将内存单元R3中字节数据读取到R1寄存器,R1的高24位为0,同时将R2寄存器的低8位写入R3中。

46.SWI 软中断指令

SWI 0X123456 ;产生软中断,中断立即数是0x123456

47.BKPT 断点中断指令

本指令主要是供软件调试程序使用。

48.CDP 协处理器数据操作指令

CDP P5,2,C12,C10,C3,4 ;对协处理器P15进行操作,第一个操作数是2,第二个操作数是4,目标寄存器是协处理器寄存器C12,源寄存器分别为协处理器的C10和C3

49.LDC 协处理器数据读取指令

LDC P6,CR4,[R2,#4] ; R2为ARM寄存器,指令读取内存单元(R2+4)的字数据,传送到协处理器P6的CR4寄存器。

50.STC 协处理器数据写入指令

STC P8,CR8,[R2,#4]! ; R2为ARM寄存器。指令将协处理器p8的CR48寄存器中的字数据写入到内存单元(R2+4)中,指令执行后R2=R2+4

51.MCR ARM寄存器到协处理器寄存器的数据传送指令

MCR P14,3,R7,C7,C11,6 ; 指令从ARM寄存器中将数据传送到协处理器P14,其中R7为ARM寄存器,存放源操作数;C7、C11是协处理器寄存器,为目标寄存器;操作码1为3,操作码2为6。

52.MRC 协处理器寄存器到ARM寄存器的数据传送指令

MRC P15,2,R5,C0,C2,4 ;指令将协处理器P15寄存器中的数据传送到ARM寄存器中,其中,R5为ARM寄存器,是目标寄存器;C0、C2是协处理器寄存器,存放源操作数,操作码1为2,操作码2为4.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: