ARM常用汇编指令

来源:互联网 发布:papership mac 破解 编辑:程序博客网 时间:2024/05/22 06:51

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的最低四位清零,其余位不变(对#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 R1,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 ;对协处理器P5进行操作,第一个操作数是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.

原创粉丝点击