逆向-指令-ARM

ARM指令

用户模式

  1. 不分组寄存器(R0-R7)
  2. 分组寄存器(R8-R14)
  3. 程序计数器pc(R15)
  4. 状态寄存器CPSR

ARM处理器

  1. ARM状态(32位对齐指令的ARM指令)
  2. Thumb状态(16位对齐指令的Thump指令)

ARM指令集

  1. 跳转指令
  • B 无条件跳转
  • BL 带链接的无条件跳转
  • BX 带状态切换的无条件跳转
  • BLX 带链接和状态的无条件跳转
  • B loc_地址
  • BNE 不相等跳转地址;BEQ 相等跳转地址
  1. 存储器和寄存器交互数据指令
  • 存储器(主存,内存)

  • 寄存器中的数据(字符串,数,地址,各种类型数据)

  • LDR 从存储器中加载数据到寄存器 <- load

  • LDR R8,[R9,#04] R8为寄存器,加载值为R9+#04所指向的存储单元

  • STR 将寄存器的数据加载到存储器 -> store

  • STR R8,[R9,#04] 将R8寄存器中数据存储到R9+#04所指向的存储单元

  • LDM 将存储器的数据加载到一个寄存器列表 ->

  • LDM R0, {R1-R3} 将R0指向的存储单元的数据依次加载到R1,R2,R3寄存器

  • STM 将一个寄存器列表的数据存储到指定存储器 <-

  • PUSH 将寄存器值推入堆栈

  • POP 将堆栈的值推出到寄存器

  • SWP 将寄存器与存储器之间的数据进行交换

  • SWP R1,R1 [R0] 将R1寄存器与R0指向存储单元内容进行交换

  1. 数据传送指令
  • MOV 立即数或寄存器的数据数据传送到目标寄存器
  • MOV R0,#8 R0=#8
  1. 数据算术运算指令
  • ADD,SUB,MUL,DIV
  • 有符号,无符号运算,带进位运算
  1. 数据逻辑运算指令
  • 与 ADD

  • 或 ORR

  • 异或 EOR

  • LSL 逻辑左移

  • LSR 逻辑右移

  • LSL R0,R1,#2 R0=R1*2

  1. 比较指令
  • CMP
  • CMP R0 #0 R0寄存器中值与0比较
  • 标志位
  1. 其他指令
  • 伪处理器指令 SWT (切换用户模式)
  • 伪指令 DCB
  1. 寄存器寻址指令
  • 7种,常见的5种
  • 立即寻址 MOV R0,#1234
  • 寄存器寻址 MOV R0 , R1
  • 寄存器移位寻址 MOV R0, R1,LSL #2 R0=R1*4
  • 寄存器间接寻址 LDR R0 ,[R1] R1寄存器值作为地址赋R0
  • 寄存器间接基址偏移寻址 LDR R0,[R1,#-4]将R1寄存家的值-0x4作为地址,取出地址中的值赋R0

ARM 指令收集

  1. —SUB指令—

    1
    2
    3
    减法指令SUB (SUBtract) 
    格式: SUB A,B //A=A-B;
    功能: 两个操作数的相减,即从A中减去B,其结果放在A中.
  2. —CMP指令—

    1
    2
    3
    比较指令CMP
    格式: CMP A,B // A-B;
    功能: 两个操作数的相减,即从A中减去B,其结果会影响标志位, 对标志位的影响与SUB指令相同。本条指令主要是用于配合条件转移指令使用。如JZ ZF=0时,跳转
  3. —条件转移指令 JE/JZ—

    1
    2
    3
    4
    5
    格式: JE/JZ标号 //等于跳转
    功能: ZF=1,转到指定地址执行
    说明:
    1. 指令JE与JZ等价,它们是根据标志位ZF进行转移的指令
    2. JE,JZ均为一条指令的两种助记符表示方法
  4. —str指令—

    1
    2
    3
    4
    5
    6
    7
    格式:str{条件}  源寄存器,<存储器地址>
    功能:将源寄存器中数据存到存储器地址中

    说明:
    str r1,[r2] ; 将r1中的值存到r2所指定的地址中
    str r1,[r2,#4] ;将r1中的值存到r2+4所指定的地址中
    str r1,[r2],#4 ;将r1中的值存到r2所指定的地址中, 同时r2=r2+4
  5. —LDR LDM指令—

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    A.LDR加载指令 从右往左
    格式为:LDR{条件} 目的寄存器,<存储器地址>
    功能:LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中

    说明:
    ldr r0,[r1] ;将存储器地址为R1的字数据读入寄存器R0。
    ldr r0,[r1,r2] ;将存储器地址为R1+R2的字数据读入寄存器R0。
    ldr r0,[r1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。
    ldr r0,[r1,r2]! ;将存储器地址为R1+R2的字数据读入寄存器R0,幵将新地址R1+R2写入R1。
    ldr r0,[r1,#8]! ;将存储器地址为R1+8的字数据读入寄存器R0,幵将新地址R1+8写入R1。
    ldr r0,[r1],r2 ;将存储器地址为R1的字数据读入寄存器R0,幵将新地址R1+R2写入R1。
    ldr r0,[r1,r2,lsl#2]! ;将存储器地址为R1+R2×4的字数据读入寄存器R0,并将新地址R1+R2×4写入R1。
    ldr r0,[r1],r2,lsL#2 ;将存储器地址为R1的字数据读入寄存器R0,幵将新地址R1+R2×4写入R1。”
    B.伪指令
    格式:LDR{条件} 目的寄存器,<存储器地址>
    功能:


    说明:将COUNT的值赋给R0
    LDR R1,=COUNT
    LDR R0,[R1]
    LDR R1,=COUNT这条伪指令,是怎样完成将COUNT的地址赋给R1,有兴趣的可以看它编译后的结果。这条指令实际上会编译成一条LDR指令和一条DCD伪指令。

    B.LDM记载指令
    从左往右
  6. —B,BL,BX,BLX 指令—

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    A.B跳转指令
    格式:B addr
    功能:跳转指令B使程序跳转到指定的地址执行程序。
    说明:
    B 0x1234 ;跳转到绝对地址0x1234处。

    B.BL带返回的连接跳转
    格式:
    功能:BL指令用于实现子程序调用。子程序的返回可通过将LR寄存器的值复制到PC寄存器来实现。下面的指令可实现子程序返回:(1)、BX R14 (2)、MOV PC,R14
    说明:
    BL func ;跳转到子程序func处执行,同时将当前pc值保存到LR中。

    C.BX跳转并切换状态
    格式:BX{<cond>} <Rm>
    功能:带状态切换的跳转指令BX使程序跳转到指令中指定的参数Rm指定的地址执行程序。若 Rm 的 bit[0] 为1,切换到 Thumb 指令执行;若 Rm 的 bit[0] 为0,切换到 ARM 指令执行。
    说明:
    BX R0 ;跳转到R0中的地址,如果R0[0]=1,则进入Thumb状态。

    D.BLX带返回的跳转并切换状态
    格式:
    功能:该指令为无条件执行指令
  7. —BEQ BNE指令—

    1
    2
    3
    4
    5
    6
    7
    a.BEQ指令
    格式: BEQ
    功能: 相等跳转

    b.BNE指令
    格式: BNE
    功能: 不想等跳转
  8. ——-.w——

    1
    代表32位
  9. ——CHP——

    1
    比较指令