ARM 汇编指

ARM编程模型-常用指令集 由上述例子所示,每调用一级子函数,我们都把返回地址存入到未分组寄存器中,但是未分组寄存器毕竟是有限的,像Linux内核函数的调用层次往往很深,通用寄存器根本不够用,要想保存返回地址,就需要对数据进行压栈,那我们就要为每个模式的栈设置空间。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。未设置的掩码位保持不变。对大多数的Thumb指令而言,没有使用条件执行(标志一直都是置位的),源寄存器和目标寄存器是相同的,只使用了低端寄存器,常量有大小的限制,没有使用内嵌桶形移位器。 阅读详情
0. ARM寄存器


    R13: SP

    R14: LR

1. 跳转指令

    跳转指令用于实现程序流程的跳转,在ARM 程序中有两种方法可以实现程序流程的跳转:
    1) 使用专门的跳转指令。
    2) 直接向程序计数器PC 写入跳转地址值。

   通过向程序计数器PC 写入跳转地址值,可以实现在4GB 的地址空间中的任意跳转,在跳转之前结合使用

    MOV  LR,PC 

    等类似指令,可以保存将来的返回地址值,从而实现在4GB 连续的线性地址空间的子程序调用。ARM 指令集中的跳转指令可以完成从当前指令向前或向后的32MB 的地址空间的跳转,包括以下4 条指令:


1.1 跳转指令B

     B{条件} 目标地址

     B 指令是最简单的跳转指令。一旦遇到一个B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前PC 值的一个偏移量,而不是一个绝对地址,它的

值由汇编器来计算(参考寻址方式中的相对寻址)。它是24 位有符号数,左移两位后有符号扩展为32 位,表示的有效偏移为26 位(前后32MB 的地址空间)。以下指令:
    # 程序无条件跳转到标号Label 处执行

    B  Label ;

   

    #当CPSR 寄存器中的Z 条件码置位时,程序跳转到标号Label 处执行
    CMP R1,#0 

    BEQ Label

1.2  带连接的跳转指令BL

       BL{条件} 目标地址

[cpp]  view plain copy
  1. <span style="font-family:Arial;">START   …  
  2.               BL   NEXT           @跳转到标号NEXT处,同时保存当前PC到R14中  
  3.               …                     
  4.               …  
  5. NEXT…                            @子程序入口  
  6.               MOV   PC,R14        @返回 </span>  

           BL 是另一个跳转指令,但跳转之前,会在寄存器R14 中保存PC 的当前内容,因此,可以通过将R14 的内容重新加载到PC 中,来返回到跳转指令之后的那个指令处执行。该指令是实现子程序调用的一个基本但常用的手段。

1.3 BLX 指令

      BLX 目标地址

      BLX 指令从ARM 指令集跳转到指令中所指定的目标地址,并将处理器的工作状态从ARM 状态切换到Thumb 状态,该指令同时将PC 的当前内容保存到寄存器R14 中。因此,当子程序使用Thumb 指令集,而调用者使用ARM 指令集时,可以通过BLX 指令实现子程序的调用和处理器工作状态的切换。同时,子程序的返回可以通过将寄存器R14
值复制到PC 中来完成。

1.4 BX 指令

      BX{条件} 目标地址

      BX 指令跳转到指令中所指定的目标地址,目标地址处的指令既可以是ARM 指令,也可以是Thumb 指令。

[cpp]  view plain copy
  1. MOV   R0,  #0X0200  
  2. BX    R0   


2. 算术运算指令


2.1 不带进位加法指令ADD

     ADD{条件}{S} 目的寄存器,操作数1<寄存器>,操作数2
     ADD 指令用于把两个操作数相加,并将结果存放到目的寄存器中。操作数1 应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。
     示例如下:

[cpp]  view plain copy
  1. ADD R0,R1,R2        @ R0 = R1 + R2  
  2. ADD R0,R1,#256      @ R0 = R1 + 256  
  3. ADD R0,R2,R3,LSL#1 @ R0 = R2 + (R3 << 1)  

2.2 带进位加法指令ADC

      ADC{条件}{S} 目的寄存器,操作数1<寄存器>,操作数2
     ADC 指令用于把两个操作数相加,再加上CPSR 中的C 条件标志位的值,并将结果存放到目的寄存器中。它使用一个进位标志位,这样就可以做比32 位大的数的加法,注意不要忘记设置S 后缀来更改进位标志。操作数1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。

    以下指令序列完成两个128 位数的加法,第一个数由高到低存放在寄存器R7~R4,第二个数由高到低存放在寄存器R11~R8,运算结果由高到低存放在寄存器R3~R0:

[cpp]  view plain copy
  1. ADDS R0,R4,R8    @加低端的字  
  2. ADCS R1,R5,R9    @加第二个字,带进位  
  3. ADCS R2,R6,R10   @加第三个字,带进位  
  4. ADC  R3,R7,R11   @加第四个字,带进位  

2.3 不带进位减法SUB 

      SUB{条件}{S} 目的寄存器,操作数1,操作数2
      SUB 指令用于把操作数1 减去操作数2,并将结果存放到目的寄存器中。操作数1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。
      示例如下:

[cpp]  view plain copy
  1. SUB R0,R1,R2         @R0 = R1 - R2  
  2. SUB R0,R1,#256       @R0 = R1 - 256  
  3. SUB R0,R2,R3,LSL#1  @R0 = R2 - (R3 << 1)  

2.4 带进位减法指令SBC 

        SBC{条件}{S} 目的寄存器,操作数1,操作数2
        SBC 指令用于把操作数1 减去操作数2,再减去CPSR 中的C 条件标志位的反码,并将结果存放到目的寄存器中。操作数1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32 位的减法,注意不要忘记设置S 后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。
示例如下:

[cpp]  view plain copy
  1. SUBS  R0, R3, R6            @减最低位字节,不带进位  
  2. SBCS  R1, R4, R7            @减第二个字,带进位  
  3. SBCS  R2, R5, R8            @减第三个字,带进位  
  4.   
  5. #三句话实现了96bit减法运算,由于ARM寄存器宽度只有32bit所以分三次相减  

2.5 不带进位逆向减法指令RSB

        RSB{条件}{S} 目的寄存器,操作数1,操作数2
        RSB指令称为逆向减法指令,用于把操作数2 减去操作数1,并将结果存放到目的寄存器中。操作数1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算。
示例如下:

[cpp]  view plain copy
  1. RSB   R0, R1, R2                     @R0 = R2- R1  
  2. RSB   R0, R1,  #112                  @R0 = 112- R1  
  3. RSB   R0, R1, R2,  LSL#1             @R0 = (R2<<1)-R1  

2.6 带进位逆向减法指令RSC 

        RSC{条件}{S} 目的寄存器,操作数1,操作数2
        RSC 指令用于把操作数2 减去操作数1,再减去CPSR 中的C 条件标志位的反码,并将结果存放到目的寄存器中。操作数1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令使用进位标志来表示借位,这样就可以做大于32 位的减法,注意不要忘记设置S 后缀来更改进位标志。该指令可用于有符号数或无符号数的减法运算。

        示例如下:

[cpp]  view plain copy
  1. RSBS   R0, R6, R3                    @减最低字节的字,不带进位  
  2. RSCS   R1, R7, R4                    @减第二个字,带进位  
  3. RSCS   R2, R8, R5                    @减第三个字,带进位  
  4. #三句话实现了96bit减法运算,由于ARM寄存器宽度只有32bit所以分三次相减  

2.7乘法指令

     乘法指令中的所有操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数1 必须是不同的寄存器。

2.7.1  32位乘法指令MUL
          MUL{条件}{S} 目的寄存器,操作数1<寄存器>,操作数2<寄存器>
          MUL 指令完成将操作数1 与操作数2 的乘法运算,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR 中相应的条件标志位。其中,操作数1 和操作数2 均为32 位的有符号数或无符号数。
         示例如下:

[cpp]  view plain copy
  1. MUL R0,R1,R2     @R0 = R1 × R2  
  2. MULS R0,R1,R2    @R0 = R1 × R2,同时设置CPSR中的相关条件标志位  

2.7.2 乘-累加指令 MLA
        MLA{条件}{S} 目的寄存器,操作数1,操作数2,操作数3
        MLA 指令完成将操作数1 与操作数2 的乘法运算,再将乘积加上操作数3,并把结果放置到目的寄存器中,同时可以根据运算结果设置CPSR中相应的条件标志位。其中,操作数1 和操作数2 均为32 位的有符号数或无符号数。
        示例如下:

[cpp]  view plain copy
  1. MLA R0,R1,R2,R3      @R0 = R1 × R2 + R3  
  2. MLAS R0,R1,R2,R3     @R0 = R1 × R2 + R3,同时设置CPSR 中的相关条件标志位  

2.7.3 有符号长乘指令SMULL
        SMULL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
        SMULL 指令完成将操作数1 与操作数2 的乘法运算,并把结果的低32 位放置到目的寄存器Low 中,结果的高32 位放置到目的寄存器High 中,同时可以根据运算结果设置CPSR 中相应的条件标志位。其中,操作数1 和操作数2 均为32 位的有符号数。
        示例如下:

[cpp]  view plain copy
  1. SMULL R0,R1,R2,R3  @R0 = (R2 × R3)的低32 位;R1 = (R2 × R3)的高32 位  
  2.                       @SMULL指令实现64bit有符号数乘法  

2.7.4 无符号数长乘指令 UMULL
         UMULL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
         UMULL 指令完成将操作数1 与操作数2 的乘法运算,并把结果的低32 位放置到目的寄存器Low 中,结果的高32 位放置到目的寄存器High 中,同时可以根据运算结果设置CPSR 中相应的条件标志位。其中,操作数1 和操作数2 均为32 位的无符号数。
示例如下:

[cpp]  view plain copy
  1. UMULL R0,R1,R2,R3  @R0 = (R2 × R3)的低32 位;R1 = (R2 × R3)的高32 位  
  2.                       @UMULL指令实现64bit无符号数乘法  

2.7.5 有符号长乘-累加指令 SMLAL
        SMLAL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
        SMLAL 指令完成将操作数1 与操作数2 的乘法运算,并把结果的低32位同目的寄存器Low 中的值相加后又放置到目的寄存器Low 中,结果的高32 位同目的寄存器High 中的值相加后又放置到目的寄存器High中,同时可以根据运算结果设置CPSR 中相应的条件标志位。其中,操
作数1 和操作数2 均为32 位的有符号数。
         对于目的寄存器Low,在指令执行前存放64 位加数的低32 位,指令执行后存放结果的低32位。对于目的寄存器High,在指令执行前存放64 位加数的高32 位,指令执行后存放结果的高32 位。
示例如下:

[cpp]  view plain copy
  1. SMLAL R0,R1,R2,R3    @R0 = (R2 × R3)的低32 位+ R0;R1 = (R2 × R3)的高32 位+ R1  
  2.                         @SMLAL 指令为64位有符号乘-累加指令  

2.7.6 无符号长乘-累加指令 UMLAL
         UMLAL{条件}{S} 目的寄存器Low,目的寄存器低High,操作数1,操作数2
         UMLAL 指令完成将操作数1 与操作数2 的乘法运算,并把结果的低32 位同目的寄存器Low 中的值相加后又放置到目的寄存器Low 中,结果的高32 位同目的寄存器High 中的值相加后又放置到目的寄存器High 中,同时可以根据运算结果设置CPSR 中相应的条件标志位。其中,操作数1 和操作数2 均为32 位的无符号数。
        对于目的寄存器Low,在指令执行前存放64 位加数的低32 位,指令执行后存放结果的低32 位。对于目的寄存器High,在指令执行前存放64 位加数的高32 位,指令执行后存放结果的高32 位。
       示例如下:

[cpp]  view plain copy
  1. UMLAL R0,R1,R2,R3   @R0 = (R2 × R3)的低32 位+ R0;R1 = (R2 × R3)的高32 位+ R1  
  2.                        @UMLAL 指令为64位无符号乘-累加指令  

2.8 比较指令CMP

      CMP{条件} 操作数1,操作数2
      CMP 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行比较,同时更新CPSR 中条件标志位的值。该指令进行一次减法运算,但不存储结果,只更改条件标志位。标志位表示的是操作数1 与操作数2 的关系(大、小、相等),例如,当操作数1 大于操作操作数2,则此后的有GT 后缀的指令将可以执行。
      示例如下:

[cpp]  view plain copy
  1. CMP R1,R0    @将寄存器R1 的值与寄存器R0 的值相减,并根据结果设置CPSR 的标志位  
  2. CMP R1,#100  @将寄存器R1 的值与立即数100相减,并根据结果设置CPSR 的标志位  

2.9 负数比较指令CMN

     CMN{条件} 操作数1,操作数2
     CMN 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数取反后进行比较,同时更新CPSR 中条件标志位的值。该指令实际完成操作数1 和操作数2 相加,并根据结果更改条件标志位。
示例如下:

[cpp]  view plain copy
  1. CMN R1,R0    @将寄存器R1 的值与寄存器R0 的值相加,并根据结果设置CPSR 的标志位  
  2. CMN R1,#100  @将寄存器R1 的值与立即数100相加,并根据结果设置CPSR 的标志位  


3. 逻辑运算指令

3.1 “与”指令AND

         AND{条件}{S} 目的寄存器,操作数1,操作数2
         AND 指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。操作数1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于屏蔽操作数1 的某些位。
示例如下:

[cpp]  view plain copy
  1. AND R0,R0,#3        @该指令保持R0的0、1 位,其余位清零。  

3.2 “或”指令ORR

        ORR{条件}{S} 目的寄存器,操作数1,操作数2
        ORR 指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。操作数1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于设置操作数1 的某些位。
        示例如下:

[cpp]  view plain copy
  1. ORR R0,R0,#3       @该指令设置R0 的0、1 位,其余位保持不变。  


3.3 “异或”指令EOR

        EOR{条件}{S} 目的寄存器,操作数1,操作数2
        EOR 指令用于在两个操作数上进行逻辑异或运算,并把结果放置到目的寄存器中。操作数1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于反转操作数1 的某些位。
        示例如下:

[cpp]  view plain copy
  1. EOR R0,R0,#3     @该指令反转R0 的0、1 位,其余位保持不变。  

3.4 位清除指令BIC

       BIC{条件}{S} 目的寄存器,操作数1,操作数2
       BIC 指令用于清除操作数1 的某些位,并把结果放置到目的寄存器中。操作数1 应是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即数。操作数2 为32 位的掩码,如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不变。
示例如下:

[cpp]  view plain copy
  1. BIC R0,R0,#%1011  @该指令清除R0 中的位0、1、和3,其余的位保持不变。  

3.5 测试比较指令TST

      TST{条件} 操作数1,操作数2
      TST 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位与运算,并根据运算结果更新CPSR 中条件标志位的值。操作数1 是要测试的数据,而操作数2 是一个位掩码,该指令一般用来检测是否设置了特定的位。
示例如下:

[cpp]  view plain copy
  1. TST R1,#%1     @用于测试在寄存器R1 中是否设置了最低位(%表示二进制数)  
  2. TST R1,#0xffe  @将寄存器R1 的值与立即数0xffe 按位与,并根据结果设置CPSR的标志位,应用中会在TST之后加一条跳转指令  

3.6 异或测试指令TEQ 

      TEQ{条件} 操作数1,操作数2
      TEQ 指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位异或运算,并根据运算结果更新CPSR 中条件标志位的值。该指令通常用于比较操作数1 和操作数2 是否相等。
示例如下:

[cpp]  view plain copy
  1. TEQ R1,R2 @将寄存器R1 的值与寄存器R2的值按位异或,并根据结果设置CPSR 的标志位  


4. 数据传送指令

 4.1 数据传送指令MOV

      MOV{条件}{S} 目的寄存器,源操作数
     MOV 指令可完成从另一个寄存器、被移位的寄存器或将一个立即数加载到目的寄存器。其中S选项决定指令的操作是否影响CPSR 中条件标志位的值,当没有S时指令不更新CPSR 中条件标志位的值。
     示例如下:
    

[cpp]  view plain copy
  1. MOV R1,R0         @将寄存器R0 的值传送到寄存器R1  
  2. MOV PC,R14        @将寄存器R14 的值传送到PC,常用于子程序返回  
  3. MOV R1,R0,LSL#3  @将寄存器R0 的值左移3位后传送到R1  

4.2 反向传送指令MVN

      MVN{条件}{S} 目的寄存器,源操作数
      MVN 指令可完成从另一个寄存器、被移位的寄存器、或将一个立即数加载到目的寄存器。与MOV 指令不同之处是在传送之前按位被取反了,即把一个被取反的值传送到目的寄存器中。其中S 决定指令的操作是否影响CPSR 中条件标志位的值,当没有S 时指令不更新CPSR 中条件标志位的值。
      示例如下:
[cpp]  view plain copy
  1. MVN R0,#0  @将立即数0 取反传送到寄存器R0 中,完成后R0=-1  


4.3 程序状态字内容送通用寄存器指令 MRS  

      MRS{条件} 通用寄存器,程序状态寄存器(CPSR 或SPSR)
     MRS 指令用于将程序状态寄存器的内容传送到通用寄存器中。该指令一般用在以下两种情况:
       1) 当需要改变程序状态寄存器的内容时,可用MRS 将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器。
       2) 当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存。
示例如下:

[cpp]  view plain copy
  1. MRS R0,CPSR   @传送CPSR 的内容到R0  
  2. MRS R0,SPSR   @传送SPSR 的内容到R0  
  3.                @MRS指令是唯一可以直接读取CPSR和SPSR寄存器的指令  

4.4 写状态寄存器指令 MSR 

       MSR{条件} 程序状态寄存器(CPSR 或SPSR)_<域>,操作数
       MSR 指令用于将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数。<域>用于设置程序状态寄存器中需要操作的位,32 位的程序状态寄存器可分为4 个域:
        1) 位[31:24]为条件标志位域,用f 表示;
        2) 位[23:16]为状态位域,用s 表示;
        3) 位[15:8]为扩展位域,用x 表示; 
        4) 位[7:0]为控制位域,用c 表示;
     该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR 指令中指明将要操作的域。
示例如下:

[cpp]  view plain copy
  1. MSR CPSR,R0   @传送R0 的内容到CPSR  
  2. MSR SPSR,R0   @传送R0 的内容到SPSR  
  3. MSR CPSR_c,R0 @传送R0 的内容到CPSR,但仅仅修改CPSR中的控制位域  


5. 存储器访问指令(加载/存储指令)

    ARM 微处理器支持加载/存储指令用于在寄存器和存储器之间传送数据,加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。

5.1 字加载指令LDR

      LDR{条件} 目的寄存器,<存储器地址>
      LDR 指令用于从存储器中将一个32 位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取32 位的字数据到通用寄存器,然后对数据进行处理。当程序计数器PC 作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设计中比较常用,且寻址方式灵活多样,请读者认真掌握。
      示例如下:

[cpp]  view plain copy
  1. LDR R0,[R1]              @将存储器地址为R1 的字数据读入寄存器R0。  
  2. LDR R0,[R1,R2]          @将存储器地址为R1+R2 的字数据读入寄存器R0。  
  3. LDR R0,[R1,#8]          @将存储器地址为R1+8 的字数据读入寄存器R0。  
  4. LDR R0,[R1,R2]!         @将存储器地址为R1+R2 的字数据读入寄存器R0,并将新地址R1+R2 写入R1。  
  5. LDR R0,[R1,#8]!         @将存储器地址为R1+8 的字数据读入寄存器R0,并将新地址R1+8 写入R1。  
  6. LDR R0,[R1],R2          @将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2 写入R1。  
  7. LDR R0,[R1,R2,LSL#2]!  @将存储器地址为R1+R2×4 的字数据读入寄存器R0,并将新地址R1+R2×4 写入R1。  
  8. LDR R0,[R1],R2,LSL#2   @将存储器地址为R1 的字数据读入寄存器R0,并将新地址R1+R2×4 写入R1。  
  9.   
  10. #注意:使用LDR指令时字节地址是4的倍数  

5.2 字存储指令 STR

      STR{条件} 源寄存器,<存储器地址>
      STR 指令用于从源寄存器中将一个32 位的字数据传送到存储器中。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR。
      示例如下:

[cpp]  view plain copy
  1. STR R0,[R1],#8   @将R0中的字数据写入以R1 为地址的存储器中,并将新地址R1+8 写入R1。  
  2. STR R0,[R1,#8]   @将R0中的字数据写入以R1+8为地址的存储器中。  

5.3 字节加载指令 LDRB (低8位)

      LDR{条件}B 目的寄存器,<存储器地址>
      LDRB 指令用于从存储器中将一个8 位的字节数据传送到目的寄存器中,同时将寄存器的高24 位清零。该指令通常用于从存储器中读取8位的字节数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。
      示例如下:

[cpp]  view plain copy
  1. LDRB R0,[R1]      @将存储器地址为R1的字节数据读入寄存器R0,并将R0的高24位清零。  
  2. LDRB R0,[R1,#8]  @将存储器地址为R1+8 的字节数据读入寄存器R0,并将R0 的高24位清零。  

5.4 字节存储指令 STRB

      STR{条件}B 源寄存器,<存储器地址>
      STRB 指令用于从源寄存器中将一个8位的字节数据传送到存储器中。该字节数据为源寄存器中的低8位。
      示例如下:

[cpp]  view plain copy
  1. STRB R0,[R1]      @将寄存器R0 中的字节数据写入以R1 为地址的存储器中。  
  2. STRB R0,[R1,#8]  @将寄存器R0 中的字节数据写入以R1+8 为地址的存储器中。  

5.5 半字加载指令 LDRH (低16位)

      LDR{条件}H 目的寄存器,<存储器地址>
      LDRH 指令用于从存储器中将一个16 位的半字数据传送到目的寄存器中,同时将寄存器的高16 位清零。该指令通常用于从存储器中读取16位的半字数据到通用寄存器,然后对数据进行处理。当程序计数器PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。
      示例如下:

[cpp]  view plain copy
  1. LDRH R0,[R1]      @将存储器地址为R1的半字数据读入寄存器R0,并将R0 的高16 位清零。  
  2. LDRH R0,[R1,#8]  @将存储器地址为R1+8 的半字数据读入寄存器R0,并将R0 的高16 位清零。  
  3. LDRH R0,[R1,R2]  @将存储器地址为R1+R2 的半字数据读入寄存器R0,并将R0 的高16 位清零。  

5.6 半字存储指令 STRH

      STR{条件}H 源寄存器,<存储器地址>
      STRH 指令用于从源寄存器中将一个16 位的半字数据传送到存储器中。该半字数据为源寄存器中的低16 位。
      示例如下:

[cpp]  view plain copy
  1. STRH R0,[R1]       @将寄存器R0中的半字数据写入以R1 为地址的存储器中。  
  2. STRH R0,[R1,#8]   @将寄存器R0 中的半字数据写入以R1+8 为地址的存储器中。  

5.7 有符号字节加在指令 LDRSB (带符号低8位)

       指令格式与LDRB类似。

[cpp]  view plain copy
  1. LDRSB   R0, [R1, R2]       @将地址R1+R2上的8位数值送R0, R0的高24位用符号位扩展  

5.8 有符号半字加载指令 LDRSH  (带符号低16位)

      指令格式与LDRH类似。

[cpp]  view plain copy
  1. LDRSH   R0, [R1]           @将地址R1上的低16位数据送R0, R0的高16位用符号位扩展  

5.9 批量数据加载/存储指令LDM/STM

      批量数据加载/存储指令ARM 微处理器所支持批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。

     在STM、LDM指令中,寄存器列表与内存单元的对应关系:编号低的寄存器对应于内存中低地址单元;编号高的寄存器对应于内存中高地址单元。

     常用的加载存储指令如下:

     LDM(或STM){条件}{类型}  基址寄存器{!},寄存器列表{^}
     LDM(或STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。其中,{类型}为以下几种情况(它表示:LDM/STM指令地址模式选择  ):

  IA    先传送数据,后基址加4;
  IB    先基址加4,后传送数据;
  DA  先传送数据,后基址减4;
  DB  先基址减4,后传送数据;
  FD  满递减堆栈(Full Descending, ATPCS使用此规则,sp指向最后一个压入的值,数据栈由高地址向低地址生长);
  ED  空递减堆栈;
  FA   满递增堆栈;
  EA  空递增堆栈;

  (I: Increase, D: Descend, A: After, B: Before, F: Full, E: Empty)

     {!}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。

     基址寄存器不允许为R15,寄存器列表可以为R0~R15 的任意组合。{^}为可选后缀,当指令为LDM 且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR 复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。
    示例如下:

[cpp]  view plain copy
  1. STMFD R13!,{R0,R4-R12,LR} @将寄存器列表中的寄存器(R0,R4-R12,LR)存入堆栈。  
  2. LDMFD R13!,{R0,R4-R12,PC} @将堆栈内容恢复到寄存器(R0,R4-R12,PC)。  

   STMFD指令的寻址方式为事前递减方式(DB),
   STMFD SP!, {R0-R7,LR}    @把数据压栈
  其伪代码如下:

[cpp]  view plain copy
  1. SP = SP - 9 x 4;  
  2. address = SP;   
  3.   
  4. for i = 0 to 7  
  5.    Memory[address] = Ri;  
  6.    address  = address + 4;  
  7.   
  8. Memory[address] = LR;  

   LDMFD指令的寻址方式为事后递增方式(IA)
   LDMFD SP!, {R0-R7,PC}^  @恢复现场,异常处理返回
   其伪代码如下:

[cpp]  view plain copy
  1. address = SP;  
  2. for i = 0 to 7  
  3.    Ri = Memory[address]  
  4.    address = address + 4;  
  5.   
  6. PC = Memory[address]  
  7. SP = address;  

5.10 寄存器 存储器字交换指令 SWP

       SWP{条件} 目的寄存器,源寄存器1,[源寄存器2]

       SWP 指令用于将源寄存器2 所指向的存储器中的字数据传送到目的寄存器中,同时将源寄存器1 中的字数据传送到源寄存器2 所指向的存储器中。显然,当源寄存器1 和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。
       示例如下:

[cpp]  view plain copy
  1. SWP R0,R1,[R2]  @将R2 所指向的存储器中的字数据传送到R0 , 同时将R1 中的字数据传送到R2 所指向的存储单元。  
  2. SWP R0,R0,[R1]  @该指令完成将R1 所指向的存储器中的字数据与R0 中的数据交换。  

5.11 寄存器与存储器字节交换指令SWPB (高24位填0,低8位有数据)

       SWP{条件}B 目的寄存器,源寄存器1,[源寄存器2]
       SWPB 指令用于将源寄存器2 所指向的存储器中的字节数据传送到目的寄存器中,目的寄存器的高24 清零,同时将源寄存器1 中的字节数据传送到源寄存器2 所指向的存储器中。显然,当源寄存器1 和目的寄存器为同一个寄存器时,指令交换该寄存器和存储器的内容。
     示例如下:

[cpp]  view plain copy
  1. SWPB R0,R1,[R2]  @将R2 所指向的存储器中的字节数据传送到R0,R0 的高24位清零,同时将R1 中的低8 位数据传送到R2 所指向的存储单元。  
  2. SWPB R0,R0,[R1]  @该指令完成将R1 所指向的存储器中的字节数据与R0 中的低8 位数据交换。  

6 移位指令 

6.1 逻辑左移操作 LSL (低位填0)

      通用寄存器,LSL 操作数
    LSL可完成对通用寄存器中的内容进行逻辑的左移操作,按操作数所指定的数量向左移位,低位用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。
示例如下:

[cpp]  view plain copy
  1. MOV R0, R1, LSL #2 ;将R1 中的内容左移两位后传送到R0 中。  
  2.   
  3. MOV   R1, #0X01  
  4. MOV   R0, R1, LSL #2  
  5. MOV   R2, #2  
  6. MOV   R0, R1, LSL R2  


6.2 算数左移操作 ASL (低位填0)

     通用寄存器,ASL 操作数
     ASL可完成对通用寄存器中的内容进行算术的左移操作,按操作数所指定的数量向左移位,低位用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。
示例如下:

[cpp]  view plain copy
  1. MOV   R1, #0X01  
  2. MOV   R0, R1, ASL #2  


6.3 逻辑右移操作 LSR (高位填0) 

    通用寄存器,LSR 操作数
    LSR 可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充。其中,操作数可以是通用寄存器,也
可以是立即数(0~31)。
    示例如下:


[cpp]  view plain copy
  1. MOV R0, R1, LSR #2 @将R1 中的内容右移两位后传送到R0 中,左端用零来填充  


6.4 算术右移操作 ASR (高位用第31位的值填充)

     通用寄存器,ASR 操作数
     ASR 可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用第31 位的值来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。
   示例如下:

[cpp]  view plain copy
  1. MOV R0, R1, ASR #2  @将R1 中的内容右移两位后传送到R0 中,左端用第31 位的值来填充。  

6.5 循环右移操作 R0R (高位由低位填充)

      通用寄存器,ROR 操作数
      ROR可完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,左端用右端移出的位来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。显然,当进行32 位的循环右移操作时,通用寄存器中的值不改变。
    示例如下:


[cpp]  view plain copy
  1. MOV R0, R1, ROR#2  @将R1 中的内容循环右移两位后传送到R0 中。  

6.6 带扩展的循环右移操作 RRX (低位-> C -> 高位)

      通用寄存器,RRX 操作数
      RRX可完成对通用寄存器中的内容进行带扩展的循环右移的操作,按操作数所指定的数量向右循环移位,左端用进位标志位C来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。
      示例如下:

[cpp]  view plain copy
  1. MOV R0, R1, RRX #2 @将R1 中的内容进行带扩展的循环右移两位后传送到R0 中。  

7 异常产生指令

7.1 软中断指令 SWI 

     SWI{条件}  24 位的立即数
     SWI指令用于产生软件中断,以便用户程序能调用操作系统的系统例程。操作系统在SWI 的异常处理程序中提供相应的系统服务,指令中24 位的立即数指定用户程序调用系统例程的类型,相关参数通过通用寄存器传递,当指令中24 位的立即数被忽略时,用户程序调用系统例程的类型由通用寄存器R0 的内容决定,同时,参数通过其他通用寄存器传递。
    示例如下:

[cpp]  view plain copy
  1. SWI 0x02    @该指令调用操作系统编号为02 的系统例程。  


7.2 断点中断指令 BKPT 

    BKPT 16 位的立即数
    BKPT 指令产生软件断点中断,可用于程序的调试。


8 协处理指令

8.1 协处理器数据操作指令 CDP 

    CDP{条件} 协处理器编号,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2
    CDP 指令用于ARM 处理器通知ARM 协处理器执行特定的操作,若协处理器不能成功完成特定的操作,则产生未定义指令异常。其中协处理器操作码1 和协处理器操作码2 为协处理器将要执行的操作,目的寄存器和源寄存器均为协处理器的寄存器,指令不涉及ARM 处理器的寄存器和存储器。
    示例如下:

[cpp]  view plain copy
  1. CDP P3,2,C12,C10,C3,4    @该指令完成协处理器P3的初始化  
  2.   
  3.   
  4. CDP P1, 1, C2, C3, C4         @指令要操作的协处理器为p1 ,1为协处理器p1的指令操作代码。  
  5.                               @c2、c3、c4 为协处理器p1的寄存器。CPD指令的使用并不影响  
  6.                               @ARM微处理器中CPSR寄存器的状态位。  

8.2 协处理器数据读取指令LDC 

      LDC{条件}{L} 协处理器编号,目的寄存器,[源寄存器]
      LDC 指令用于将源寄存器所指向的存储器中的字数据传送到目的寄存器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。
      示例如下:

[cpp]  view plain copy
  1. LDC P3,C4,[R0]        @将ARM 处理器的寄存器R0 所指向的存储器中的字数据传送到协处理器P3 的寄存器C4 中。  
  2. LDC p5, c2, [R0, #4]    @将内存地址为R0+4处的数据送到协处理器p5的寄存器c2中。  
  3. LDC p5, c1, [R0,R1]     @将内存地址为R0+R1处的数据送到协处理器p5的寄存器c1中。  

8.3 协处理器数据写入指令STC 

      STC{条件}{L} 协处理器编号,源寄存器,[目的寄存器]
      STC 指令用于将源寄存器中的字数据传送到目的寄存器所指向的存储器中,若协处理器不能成功完成传送操作,则产生未定义指令异常。其中,{L}选项表示指令为长读取操作,如用于双精度数据的传输。
      示例如下:

[cpp]  view plain copy
  1. STC P3,C4,[R0]        @将协处理器P3 的寄存器C4中的字数据传送到ARM 处理器的寄存器R0所指向的存储器中。  


8.4 ARM微处理器到协处理器的数据传送指令MCR 

      MCR{条件} 协处理器编号,协处理器操作码1,源寄存器,目的寄存器1,目的寄存器2,协处理器操作码2
      MCR 指令用于将ARM 处理器寄存器中的数据传送到协处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1 和协处理器操作码2 为协处理器将要执行的操作,源寄存器为ARM 处理器的寄存器,目的寄存器1 和目的寄存器2 均为协处理器的寄存器。
    示例如下:

[cpp]  view plain copy
  1. MCR P3,3,R0,C4,C5,6   @该指令将ARM 处理器寄存器R0 中的数据传送到协处理器P3 的寄存器C4 和C5 中。  

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

    MRC{条件} 协处理器编码,协处理器操作码1,目的寄存器,源寄存器1,源寄存器2,协处理器操作码2
    MRC 指令用于将协处理器寄存器中的数据传送到ARM 处理器寄存器中,若协处理器不能成功完成操作,则产生未定义指令异常。其中协处理器操作码1 和协处理器操作码2 为协处理器将要执行的操作,目的寄存器为ARM 处理器的寄存器,源寄存器1 和源寄存器2 均为协处理器的寄存器。
    示例如下:

[cpp]  view plain copy
  1. MRC P3,3,R0,C4,C5,6 @该指令将协处理器P3的寄存器中的数据传送到ARM 处理器寄存器中。  
4.ARM指令集 ARM指令集 阅读详情

相关推荐

LR(R14)寄存器

来源网址: http://hi.baidu.com/a843538946/item/4e2a34fe48b6e5be31c199ec 终于明白这个LR寄存器了 看下面这个ARM汇编吧 BL  NEXT                                 ;跳转到子程序 .........                                        

少波波波波少 2373

ARM 指令集

http://wenku.baidu.com/view/7efbd1116edb6f1aff001fc9.html 文章转载于该网页,留下记号,以后供参考~谢谢作者! ARM指令集详解 ARM可以用两套指令集:ARM指令集和Thumb指令集。本文介绍ARM指令集。在介绍ARM指令集之前,先介绍指令的格式。 1  指令格式         (1)基本格式         {}{S},{

digent的专栏 3306

Arm汇编学习笔记(七)——ARM9五级流水及流水线互锁

本文主要是通过分析五级流水及流水线互锁的原理,从而可以编写出更加高效的汇编代码。 1. ARM9五级流水线 ARM7采用的是典型的三级流水线结构,包括取指、译码和执行三个部分。其中执行单元完成了大量的工作,包括与操作数相关的寄存器和存储器读写操作、ALU操作及相关器件之间的数据传输。这三个阶段每个阶段一般会占用一个时钟周期,但是三条指令同时进行三级流水的三个阶段的话,还是可以达到每个周

beyond702的专栏 1万+

一篇保你够用之ARM指令集总结

一.概念: 指令集指一个微处理器所有指令的集合。处理器的指令集可以分为CISC(复杂指令集)和RISC(精简指令集),ARM处理器使用RISC。 ARM处理器支持ARM和Thumb两种指令集:ARM指令集工作在32位模式下,指令长度都是32b;Thumb指令集工作在16位模式下,指令长度都是16b。 二.指令集种类 1.算术运算指令 1.1.ADD指令 ADD指令

1、测试博主技术知识分享 2、pos行业知识技术分享 3、java后端技术知识分享 4、嵌入式技术知识分享 5、运维部署相关知识分享 5264

HFSS仿真3dB微带双分支定向耦合器学习笔记

设计一个3dB微带双分支定向耦合器,各端口微带线特性阻抗为50Ω,中心频率为5GHz,介质基板的介电常数9.6,基板厚度为0.8mm这里重点讲解HFSS的操作,关于理论知识后面文章更新。

qq_36521926的博客 7769

Miniforge3部署教程,完美替代Anaconda3

大背景不介绍了,哎!直接上教程!

zzy_ucas的博客 1万+

ARM 汇编指 跳转指令 b , bl

1. 跳转指令 【 b 】 【 bl 】    指令格式:<opcode><cond> <address>    不带返回的跳转指令:b mov r0, #0x12 mov r1, #0x34 b fun_add @一条指令 , 有地址 mov r2, #0x56 @通过上面的跳转此处将不会得到执行 mov r3, #0x78 ...

weixin_34249367的博客 2349

Marvell 88E6390x交换芯片:从零构建No-CPU模式网络交换系统

本文详细介绍了如何为Marvell 88E6390x以太网交换芯片构建No-CPU模式网络交换系统。通过解析其核心价值与硬件准备,并手把手指导使用CodeBlocks、IMPGUI和SwitchGUI等软件工具进行配置代码编写、镜像生成与烧录,最终实现交换芯片脱离外部CPU独立工作,适用于成本敏感、空间受限的嵌入式网络设备设计。

plant的博客 483

说说ARM汇编的LDR伪指

我们知道ARM CPU中有一条被广泛使用的指令LDR,它主要是用来从存储器(确切地说是地址空间)中装载数据到通用寄存器。但不论是ARMASM还是GNU ARM AS,都提供了一条与之同名的伪指令LDR,而在实际中使用该伪指令的情况也较多,那他们有什么不同呢?下面我谈谈我的理解。 由于我使用GNU工具链,所以以下的内容都以GNU AS的ARM语法为准。 ...

weixin_34107739的博客 87

将Apollo高精地图中的车道线叠加在多种导航地图上

本文介绍了将Apollo高精地图车道线叠加到普通导航地图的技术方案。高精地图具备厘米级车道精度和丰富的语义信息,叠加可实现可视化验证、调试分析和数据对比等功能。核心技术包括坐标系统转换(UTM/WGS84/BD09/GCJ02)和数据处理流程,通过Python脚本完成Apollo地图解析、坐标批量转换和多格式输出。文章详细提供了环境准备、工作目录创建和坐标转换脚本等操作步骤,实现了高精地图数据在OpenStreetMap、百度地图和高德地图上的可视化展示。

Hi20240217的博客 1333

新手也能懂的Simulink汽车二自由度建模:从公式推导到模型搭建全流程

本文为新手提供了在Simulink中搭建汽车二自由度模型的完整实战指南。文章从模型核心概念讲起,详细讲解了如何将车辆动力学方程转化为状态空间模型,并逐步指导在Simulink中实现从参数设置、模块搭建到仿真验证的全过程。通过阶跃转向测试和参数影响分析,帮助读者直观理解车辆转向特性,并提供了实用的模型扩展思路与常见问题排查技巧。

weixin_29047919的博客 214

ARM汇编中LDR伪指令和LDR指

ARM汇编中LDR伪指令和LDR指令  (2012-08-02 16:49:25) 转载▼ 标签:  ldr   arm汇编   it 分类: NSN_BspDriver ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。比如想把数据从内存中某处读取到寄存器中,只

fuyunliushuizjf的专栏 706

PX4固件下VTOL固定翼的3种起飞方式对比:手抛vs弹射vs跑道

本文深度解析PX4固件下VTOL固定翼的三种起飞方式:手抛、弹射与跑道起飞,对比其技术差异与适用场景。通过详细的参数配置和工程实践指南,帮助开发者优化起飞性能,提升无人机在不同环境下的适应性和可靠性。文章特别针对PX4飞控系统的最新特性进行了技术探讨。

weixin_30296405的博客 87

ARM体系结构解析:PC寄存器机制、三级流水线与C/汇编交互全揭秘

文章详解ARM与Thumb双态差异,揭秘三级流水线如何导致PC寄存器"当前地址+8"现象,解析ATPCS规则下汇编与C函数的参数传递奥秘。通过反汇编实例展现编译器优化策略,结合STM32启动流程图解Flash内容布局,并探讨volatile关键字对内存访问的关键影响。最后通过Keil实战演示反汇编码阅读技巧,为理解ARM架构、编写高效底层代码提供知识框架。

C语言、数据结构、单片机、嵌入式实时操作系统、C++ 学习路径记录 1404

通过HTTP的方式克隆GitHub上的项目

通过HTTP的方式克隆GitHub上的项目 打开想要下载的项目的网页链接,点击Clone or download绿色的按钮,进行如下步骤实现通过HTP的方式下载项目。 点击红色框圈出的位置: 打开想要存放项目的文件夹,在空白处点击鼠标右键,选择Git Bash Here,打开命令行。 输入git clone 复制的下载地址,回车进行下载。 4.正在下载的界面 5.下载完成。 技多不压身 哦耶✌✌✌ ...

weixin_37826412的博客 3202

向华为学习——解读华为战略规划SP与业务计划BP流程【附全文阅读】

该方案针对大中型企业高管及战略团队,系统拆解华为SP(4-9月中长期规划)与BP(10-12月年度执行)双轨体系,形成"战略制定-业务设计-资源配置-绩效解码"闭环。SP侧重市场趋势分析、业务优先级与资源分配,BP细化KPI、预算及行动计划。通过价值树、战略解码等工具实现战略到部门/个人的目标分解,强化跨部门协同与过程管控。配套17份华为实战资料(包括战略管理、流程优化、销售组织建设等核心方法论),助力企业建立规范的战略执行体系,实现资源优化与绩效落地。

cdfunlove的博客 769

【ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或)】

根据operand哪个位为1,将Rn对应的位设置为1,其余位不变,然后将结果存入Rd。第2条汇编代码表示将 r0 寄存器的bit0-bit2清0,气他bit不变。第1条汇编代码表示将 r0 寄存器的 bit13 清0,其它bit不变。表示将 r0 寄存器的 bit8 和bit16 置 1,其它bit不变。根据operand哪个位为1,清除Rn对应的位,然后将结果存入Rd。eor 指令将 Rn 的值与操作数 operand 按位逻辑 ”,结果存放到目的寄存器Rd 中。

CodingCos的博客 7079

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ARM汇编伪指令 .word

ARM汇编伪指令 .word  ARM汇编伪指令 .word<br /><br />经常碰到那些以“.”打头的一些令人头疼的伪指令, <br />至于.globl _start .balign .align .data .text等等就算了,最最bt的如下: <br /><br />_undefined_instruction: .word undefined_instruction <br /><br />这个.word令人费解。网上的技术人员都不屑回答,说请参考GNU ASM。我去看了,对于.word解

咕唧咕唧shubo.lk的专栏 1万+

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ARM 简单分析 C函数反汇编代码的运行

前言 R13:SP堆栈指针寄存器 功能:指向堆栈的栈顶 详解: 1)异常模式发生时,程序把通用寄存器压入堆,SP一直指向栈顶的位置。返回时再出栈,保证程序状态的完整性。大部分情况下,只要程序在执行,堆栈就会被建立,而SP指向堆栈的栈顶位置。 2)有MSP 和PSP(两者只需一个,不能同时使用,默认MSP)。 MSP :主堆栈指针,系统用。PSP : 进程堆栈指针,个人堆栈指针。 R14:LR连接寄存器 功能:保存断点地址。 详解: 1)用来保存子程序的返回地址; 当调用子程序时,R14保存子程序的返

weixin_42109053的博客 845

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

arm 汇编

BIC指令 BIC指令的格式为: BIC{条件}{S}目的寄存器,操作数1,操作数2 BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。操作数2为32位的掩码,如果在掩码中设置了某一位,则清除这一位。未设置的掩码位保持不变。指令示例: BICR0,R0,#%1011;该指令清除R0中的位0、1、和

techtitan的专栏 768

ARM入门学习方法分享

ARM是Advanced RISC Machines的缩写,它是一家微处理器行业的知名企业,该企业设计了大量高性能、廉价、耗能低的RISC (精简指令集)处理器。通过掌握基本概念、学习汇编语言、使用开发工具、进行实践项目以及深入了解相关的硬件知识,你可以逐步掌握ARM架构并成为一个合格的ARM开发者。你可以查阅ARM的官方文档,了解ARM架构的细节,并参考一些在线教程和博客来学习其他开发者的经验和技巧。ARM,既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。

teach2004的博客 479

ARM汇编详解

ARM汇编基本指令: https://blog.youkuaiyun.com/weixin_38927522/article/details/119682157 Android与ARM处理器: ARM处理器架构概述 ARM处理器家族 Android支持的处理器架构 ARM/x86/MIPS 原生程序与ARM汇编语言: 原生程序逆向初步 代码混淆技术 ARM指令集 堆...

Codeooo 博客 1万+

ARM汇编与ARM GNU汇编 区别

一、想学汇编,at&t汇编与ARM汇编的区别? 问:想学汇编语言,因为现在用的是linux系统(ubuntu11.04),so 有一本《汇编语言程序设计》马朝晖译,可惜淘宝、当当、京东等都没货,淘宝上只有盗版的。 ARM的书倒是挺多(但是我不是搞嵌入式的),二者有什么区别?语法一样否?汇编器都是gas?如果学习linux内核,二者是否通用? 学汇编语言(linux平台的最好),有啥经典...

键盘的起始页 4037

ARM:ARM汇编语言与基础汇编指令

1、为什么要学习汇编语言? 1)嵌入式硬件上电的初始化代码是用汇编代码编写; 2)调试代码时,问题的解决有可能看汇编代码; 3)系统调优(提高产品整体运行效率); memcpy:C语言函数原型 :汇编代码 - 效率更高 4)有些逻辑,拿C语言无法实现 例如,用c访问r5寄存器

Hello, New World! 2万+
上一篇: LDR,STR,MOV
下一篇: ARM链接地址和烧写地址
ARM_Tutor
博客等级 码龄12年 12粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值