ARM9指令系统常用指令

一.ARM指令助记符格式

<opcode>{<cond>}{S} <Rd>,<Rn>,<op2>

1.{<cond>}
决定指令执行的条件域,即根据CPSR中的标志位的值执行指令
CMP R0,R1 ;R0与R1比较
ADDHI R0,R0,#1 ;若R0>R1,则R0=R0+1
ADDLS R1,R1,#1 ;若R0≤R1,则R1=R1+1

条件域

2.{S}
决定指令执行是否影响CPSR寄存器(程序状态寄存器)的值

以上两条可组成操作如:ADDEQS —-> <ADD>{<EQ>}{S}

3.<Rd>
目的寄存器

4.<Rn>
第一个操作数,为寄存器

5.<op2>
第二个操作数,具有如下形式:
(1) #immed_8r:常数表达式
(2) RM:寄存器方式
(3) RM,shift:寄存器移位方式

指令示例:ADDEQS R1,R2,#5

二.常用指令

1.MOV{<cond>}{S} <Rd>, <op1>
功能:Rd<-op1

MOV R0,#5  ;R0=5
MOV R0,R1  ;R0=R1
MOV R0,R1,LSL #5   ;R0=R1左移5位

2.MVN{<cond>}{S} <Rd>,<op1>
功能:Rd<-op1按位取反,即Rd=!op1

MVN R0,#0  ;R0=-1

3.ADD{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn+op2

ADD R0,R1,R2   ;R0=R1+R2
ADD R0,R1,R2,LSL #5   ;R0=R1+R2左移5位

4.ADC{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn+op2+carry,用于实现32位的数的加法

;第一个64位操作数存放在寄存器R3 R2内,
;第二个64位操作数存放在寄存器R5 R4内
;64位结果存放在R1 R0内
ADDS R0,R2,R4  ;低32位相加,S表示结果影响标志位的值
ADC R1,R3,R5  ;高32位相加

5.SUB{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn-op2

SUB R0,R1,#5  ;R0=R1-5

6.SBC{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn-op2-!carry,由于借位需清除进位标志,因此需要执行非操作

;第一个64位操作数存放在寄存器R3 R2内,
;第二个64位操作数存放在寄存器R5 R4内
;64位结果存放在R1 R0内
SUBS R0,R2,R4  ;低32位相减
SBC R1,R3,R5  ;高32位相减

7.RSB{<cond>}{S} <Rd>,<Rn>,<op2>
功能:同SUB指令,但倒换了两操作数的前后位置,即Rd<-op2-Rn

RSB R0,R1,#5    ;R0=5-R1

8.RSC{<cond>}{S} <Rd>,<Rn>,<op2>
功能:同SBC指令,但倒换了两操作数的前后位置,即Rd<-op2-Rn-!carry

;第一个64位操作数存放在寄存器R3 R2内,
;第二个64位操作数存放在寄存器R5 R4内
;64位结果存放在R1 R0内
SUBS R0,R4,R2  ;低32位相减
RSC R1,R5,R3  ;高32位相减

9.逻辑与/逻辑或/逻辑异或指令

AND{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn AND OP2

ORR{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn OR op2

EOR{<cond>}{S} <Rd>,<Rn>,<op2>
功能:Rd<-Rn EOR op2

AND R0,R0,#5
ORR R0,R0,#5  
EOR R0,R0,#5

10. 位清除/乘法/乘加指令

  • BIC 位清除指令
    BIC{<cond>}{S} <Rd>,<Rn>,<op2>
    功能:Rd<-Rn AND (!op2),用于清除Rn中的某些位并将结果放入目的寄存器Rd内
    例:BIC R0,R0,#5
  • MUL 32位乘法指令
    MUL{<cond>}{S} <Rd>,<Rm>,<Rs>
    功能:Rd<-Rm*Rs
  • MLA 32位乘加指令
    MLA{<cond>}{S} <Rd>,<Rm>,<Rs>,<Rn>
    功能:Rd<-Rm*Rs+Rn
  • SMULL 64位有符号数乘法指令
    SMULL{<cond>}{S} <Rdl>,<Rdh>,<Rm>,<Rs>
    功能:Rdh Rdl<-Rm*Rs,Rm、Rs为32位有符号数
    例:
    SMULL R0,R1,R2,R3
    ;R0=R2*R3的低32位
    ;R1=R2*R3的高32位
  • SMLAL 64位有符号数乘加指令
    SMALAL{<cond>}{S} <Rdl>,<Rdh>,<Rm>,<Rs>
    功能:Rdh Rdl<-Rm*Rs+Rdh Rdl
    例:
    SMLAL R0,R1,R2,R3
    ;R0=R2*R3的低32位+R0
    ;R1=R2*R3的高32位+R1
  • UMULL 64位无符号数乘法指令
    类似SMULL
  • UMLAL 64位无符号数乘加指令
    类似SMLAL

11.CMP{<cond>} <Rn>,<op2>
功能:进行Rn-op2的减法运算,由结果更新CPSR中标志位的值

CMP R0,#5
ADDGT R0,R0,#5  ;若R0>5则执行ADDGT指令

12.CMN{<cond>} <Rn>,<op2>
功能:同CMP指令,但Rn的值是和op2取负的值比较:Rn-(-op2)

CMN R0,#5  ;把R0与-5进行比较

13.TST{<cond>} <Rn>,<op2>
功能:Rn AND op2,检查寄存器Rn是否设置了op2中相应的位

TST R0,#5   ;测试R0中第0位与第2位是否为1

14.TEQ{<cond>} <Rn>,<op2>
功能:Rn EOR op2,检查寄存器Rn的值是否与op2相等

TEQ R0,#5 ;判断R0的值是否与5相等

15.分支指令

  • B跳转指令(Branch)
    B{<cond>} <target_address>
    功能:PC<-PC+指令中24位有符号数左移两位,<target_address>是相对当前PC(寄存器R15)值的一个偏移量,为24为有符号数
    目标地址:24位值有符号扩展为32位后左移两位(即乘4)+PC值
    例1:
    B exit ;程序跳转到标号exit处

    exit

    例2:执行10次循环
    MOV R0,#10
    loop

    SUBS R0,#1
    BNE loop ;若R0≠0,重复循环
  • BL带返回的跳转指令(Branch with Link)
    BL{<cond>} <target_address>
    功能:子程序调用,在执行跳转的同时,还将子程序的返回地址保存到LR寄存器(R14)内
    例1:调用子程序func
    BL func

    func

    MOV R15,R14 ;子程序返回,R15:PC
    例2:条件子程序调用
    CMP R0,#5
    BLLT SUB1
    BLGE SUB2 ;若R0<5则调用SUB1,否则调用SUB2
  • BX带状态切换的跳转指令
  • BLX 带返回和状态切换的跳转指令

16.ARM存储器访问指令(寄存器与内存之间的数据传送 )

  • LDR字数据加载指令
    LDR{<cond>} <Rd>,<addr>
    功能:(1)Rd<-addr所表示的内存地址内的字数据
    (2)基址寄存器<-合成的有效地址
    addr可取的值:
    Rn:基址寄存器
    Rm:变址寄存器
    Index:偏移量,12位的无符号数
Load指令一般形式
  • LDRB 字节数据加载指令
    LDR{<cond>}B <Rd>,<addr>
    功能:类似LDR指令,偏移量为8位无符号数
    (1)Rd<-addr地址内8位的字节数据
    (2)Rd的高24位清0
    例:LDRB R0,[R1] ;将内存中起始地址为R1的一个字节数据装入R0中
  • LDRH 半字数据加载指令
  • LDRT 用户模式的字数据加载指令
  • LDRBT 用户模式的字节数据加载指令
  • LDRSB 有符号的字节数据加载指令
  • LDRSH 有符号的半字数据加载指令
  • STR 字数据存储指令
    STR{<cond>} <Rd>,<addr>
    功能:(1)addr内存地址<-寄存器Rd字数据(32位)
    (2)基址寄存器<-合成的有效地址
    寻址方式与LDR指令
    例:
    R1=0x40003000 R0=0x1A27E4F3
    STR R0, [R1, #4] !
    (1)存储器地址=R1+#4=0x40003004
    (2)R0→[0x40003004]= 0x1A27E4F3
    (3)修改R1 R1+#4→ R1= 0x40003004
  • STRB 字节数据存储指令
  • STRH 半字数据存储指令
  • STRT 用户模式的字数据存储指令
  • STRBT 用户模式的字节数据存储指令
  • LDM 批量数据加载指令
    LDM{<cond>}{<type>} <Rn> {!},<regs> {^}
    功能:连续存储单元的字数据→寄存器(多个)
    数据单位:字
    用途:一般用于数据块读出、数据出栈
    格式说明:
    1.type字段种类:8种。
type字段种类
  1. Rn:基址寄存器,其值是内存单元的起始地址。一般不使用为R15。
  2. Regs:寄存器列表,从最低序号寄存器开始处理,与书写顺序无关。
  3. !后缀:指令执行完毕后,将最后的地址写入基址寄存器。
  4. ^后缀:当regs中不包含PC时,该后缀用于指示指令所用的寄存器为用户模 式下的寄存器。否则,指示指令执行时,SPSR →CPSR。
  • STM 批量数据存储指令
    STM {<cond>}{<type>} <Rn> {!},<regs> {^}
    功能:连续的内存单元←寄存器列表的值(字数据)
    用途:一般用于数据块写入、数据的入栈。
    Rn:基址寄存器,其值为内存单元的起始地址。
    Regs:寄存器列表,包括所有当前模式下可见的寄存器。
    其他参数用法同LDM指令。
    例:
    STMEA R13!,{R0-R12,PC}
    ;将寄存器R0~R12以及PC的值保存到R13指示的堆栈中

17.交换指令

  • SWP 字数据交换指令
    SWP {<cond>} <Rd>,<Rm>,[<Rn>]
    功能:Rd = [Rn]
    [Rn] = RM
    例:SWP R0,R1,[R2]; R0<-[R2]字数据,[R2]<-R1字数据
  • SWPB 字节数据交换指令

18.ARM软件中断指令

ARM处理器支持两条异常中断指令:
(1)软件中断指令SWI
(2)断点中断指令BKPT

19.程序状态寄存器指令(状态寄存器和通用寄存器间传送数据)

  • MRS{<cond>} <Rd>,CPSR
    MRS{<cond>} <Rd>,SPSR

    功能:CPSR/SPSR->Rd
    例:MRS R0,CPSR; CPSR->R0
  • MSR{<cond>} CPSR/SPSR_<field>,<op1>
    功能:CPSR/SPSR_field<-op1
    例:MSR CPRS_f,R0 ;R0->CPRS (只修改条件域)
    MSR CPSR_fsxc,#5 ;#5->CPRS
Field域

Related post

  1. php调用python脚本

    2020-07-05

  2. 异常处理的合理使用与防御式编程

    2022-02-21

  3. DP问题专项

    2022-11-24

  4. 设计模式-单例模式

    2020-09-10

There are no comment yet.

COMMENT

Take a Coffee Break

Recommend post

  1. 常用工具指令

    2022-09-18

Category list

ABOUT

Welcome to FullStar, a captivating online destination where the realms of software development and personal reflections intertwine.

April 2025
M T W T F S S
 123456
78910111213
14151617181920
21222324252627
282930  

Life Logs

  1. 回首

    2023-07-14

Return Top