zoukankan      html  css  js  c++  java
  • ARM_Instruction_Set_Encoding_hacking(ARM指令集编码格式解读)

    ARM指令集编码格式解读

    说明:

    1、本文参考的书籍《ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition》中的Chapter A5: ARM Instruction Set Encoding.

    2、本人对本文最终效果中的表格缩进没有对齐的现象表示歉意,因为目前本人解决不了   :)

    3、本文的解读流程如下:

    1、Format of the CPSR and SPSRs:因为CPSR中有影响指令执行的条件标志;

    2、The major subdivisions of the ARM instruction set:这里细分ARM指令为7个种类;

    3、The condition code field:对指令中的条件位域进行了解读;

    4、Data-processing and miscellaneous instructions:针对the major subdivisions of the ARM instruction set中的7中ARM指令种类,对第一种“Data-processing and miscellaneous instructions”进行了解读;

    5、Data-processing (register):针对Data-processing and miscellaneous instructions中的14种指令,对第一种“Data-processing (register)”进行了解读;

    6、AND (register):针对Data-processing (register)中的22种指令,对第一种“AND (register)”进行了解读;

    4、如您在3中看到的,本文仅仅是对32位的ARM指令的一种简单的理解性解读;

    ********************************目录******************************

    一、为什么要解读ARM指令编码?

    二、Format of the CPSR and SPSRs(CPSR and SPSRs格式):

    三、The major subdivisions of the ARM instruction set(细分ARM指令集):

    四、The condition code field(条件位域):

    五、Data-processing and miscellaneous instructions(数据处理和杂项指令):

    六、Data-processing (register)(数据处理(寄存器)):

    七、AND (register):

    ****************************************************************

    一、为什么要解读ARM指令编码?

    以前每次当我看到或者听说汇编指令的时候,我都会觉得很好奇:

    1、汇编指令入是如何组成的?

    2、mov r2, 0x33: 这条ARM汇编指令是如何保存指令中的mov,r2,0x33各部分?

    3、bic r1, r1, r2:这条ARM汇编指令是如何保存指令中的bic,r1,r1,r2各部分?

    4、一条ARM汇编指令那么长,怎么可能32位就能包含?而且还包含了判断条件在里面;

    虽然很多时候好奇,但是毕竟个人知识水平有限,并没有能够理解这里面的原理,也许今天解读完这章英文文档能够从中得知玄机.

    二、Format of the CPSR and SPSRs(CPSR and SPSRs格式):

     1、以下是CPSR and SPSRs的位域格式图:

    2、由于本文仅仅需要用Condition flags,所以不对其他位域进行解读:

    Condition flags, bits[31:28]

    Set on the result of instruction execution(设置的指令执行结果). The flags are:

    1、N, bit[31] Negative condition flag            (负数标志)

    2、Z, bit[30] Zero condition flag                  (0标志)

    3、C, bit[29] Carry condition flag                 (进位标志)

    4、V, bit[28] Overflow condition flag            (溢出标志)

    The condition flags can be read or written in any mode.( 在任何模式下可以对条件标志读取或写入)

     

    三、The major subdivisions of the ARM instruction set(细分ARM指令集):

    1、ARM 指令流是一连串的字对齐的四字节指令流。每个 ARM 指令是一个单一的 32 位字(4字节)。ARM 指令细分编码格式如下图:

    2、以下是对细分ARM指令集的位域分布,以及细分出的指令种类说明:

    cond

    op1

    op

    Instruction classes(指令分类)

    not 1111

    00x

    -

    数据处理和杂项指令(本文只对这部分进行分析,其他部分类似)

    010

    -

    加载/存储字或无符号的字节

    011

    0

    加载/存储字或无符号的字节

    1

    媒体指令

    10x

    -

    分支、带链接分支、块数据传输

    11x

    -

    协处理器指令或软中断,包括浮点指令和先进SIMD数据传输

    1111

    -

    -

    如果cond字段为0b1111,只能无条件地执行指令

    表格中的op1、op字段中的x、-表示可以是0,也可以是1

    3、本文后续部分只对Instruction classes(指令分类)中的“数据处理和杂项指令”部分进行解读,其他部分类似,没必要全部解读,毕竟不是为了翻译。

    四、The condition code field(条件位域):

    1、每一条可条件执行的条件指令都有4位的条件位域(记住,只有四位) ,条件位域的值在0b0000-0b1110之间,如下是条件位域在32位ARM指令中的位置:

    2、以下是对条件位域的值的列表,可条件执行指令执行受CPSR的condition flags中对应的位影响:

    cond

    助记符

    意义(整数)

    意义(浮点数)

    条件标志

    0000

    EQ

    Equal(相等)

    Equal(相等)

    Z == 1

    0001

    NE

    Not equal(不相等)

    Not equal, or unordered
    (不相等,无序)

    Z == 0

    0010

    CS

    Carry set(进位)

    Greater than, equal, or unordered
    (大于,等于,无序)

    C == 1

    0011

    CC

    Carry clear(借位)

    Less than(小于)

    C == 0

    0100

    MI

    Minus, negative(负数)

    Less than(小于)

    N == 1

    0101

    PL

    Plus, positive or zero
    (正数,或者0)

    Greater than, equal, or unordered
    (大于,等于,无序)

    N == 0

    0110

    VS

    Overflow(溢出)

    Unordered(无序)

    V == 1

    0111

    VC

    No overflow(没有溢出)

    Not unordered(非无序)

    V == 0

    1000

    HI

    Unsigned higher

    (无符号大于)

    Greater than, or unordered
    (大于,无序)

    C == 1 and Z == 0

    1001

    LS

    Unsigned lower or same
    (无符号小于,等于)

    Less than or equal
    (小于,等于)

    C == 0 or Z == 1

    1010

    GE

    Signed greater than or equal
    (有符号大于,等于)

    Greater than or equal
    (大于,等于)

    N == V

    1011

    LT

    Signed less than
    (有符号小于)

    Less than, or unordered
    (小于,无序)

    N != V

    1100

    GT

    Signed greater than
    (有符号大于)

    Greater than(大于)

    Z == 0 and N == V

    1101

    LE

    Signed less than or equal
    (有符号小于等于)

    Less than, equal, or unordered
    (小于,等于,无序)

    Z == 1 or N != V

    1110

    None (AL)

    Always (unconditional)

    Always (unconditional)

    Any

          1、Unordered means at least one NaN operand.

           无序的意思是至少有一个非数字操作数

          2、HS (unsigned higher or same) is a synonym for CS.

           HS(无符号大于或相同)是同义词CS.

          3、LO (unsigned lower) is a synonym for CC.

           LO(无符号更低)是同义词CC.

          4、AL is an optional mnemonic extension for always, except in IT instructions.

           AL是always的助记符,IT指令除外.

    3、汇编语言中溢出和进位的不同:

    1、对于非符号数来说,不存在溢出的问题,它的进位就相当于符号数中的溢出;

    2、而对于符号数来说,不存在进位的问题:

    1、两个正数相加(或一个正数减一个负数)得到负数;

    2、两个负数相加得到正数,就是溢出了;

    3、一个正数和一个负数相加不可能溢出。

    五、Data-processing and miscellaneous instructions(数据处理和杂项指令):

    1、数据处理和杂项指令的位域分布图如下:

    2、这是对数据处理和杂项指令的位域说明表:

    op

    op1

    op2

    Instruction or instruction class

    Variant

    0

    not
    10xx0

    xxx0

    Data-processing (register)
    数据处理(寄存器)(本文只对这部分进行解读)

    -

    0xx1

    Data-processing (register-shifted register)
    数据处理(寄存器移寄存器)

    -

    10xx0

    0xxx

    Miscellaneous instructions
    杂项指令

    -

    1xx0

    Halfword multiply and multiply accumulate
    半字乘法和乘法累加

    -

    0xxxx

    1001

    Multiply and multiply accumulate
    乘法和乘法累加

    -

    1xxxx

    1001

    Synchronization primitives
    同步基元

    -

    not
    0xx1x

    1011

    Extra load/store instructions
    扩展的加载/存储指令

    -

    11x1

    Extra load/store instructions
    扩展的加载/存储指令

    -

    0xx1x

    1011

    Extra load/store instructions, unprivileged
    扩展的加载/存储指令,无特权

    -

    11x1

    Extra load/store instructions
    扩展的加载/存储指令

    -

    1

    not
    10xx0

    -

    Data-processing (immediate)
    数据处理(立即数)

    -

    10000

    -

    16-bit immediate load, MOV (immediate)
    16位立即数加载,MOV(立即数)

    v6T2

    10100

    -

    High halfword 16-bit immediate load, MOVT
    高半字16位立即数加载,MOVT

    v6T2

    10x10

    -

    MSR (immediate), and hints
    MSR(立即数),提示

    -

    3、本文后续部分只对Instruction or instruction class中的“Data-processing (register)(数据处理(寄存器))”部分进行解读,其他部分类似,没必要全部解读,毕竟不是为了翻译。

    六、Data-processing (register)(数据处理(寄存器)):

    1、数据处理(寄存器)位域分布如下图所示:

    2、这对数据处理(寄存器)位域的说明表,本人就不对内容进行翻译了,如果有困难,可以使用bing,google翻译,不建议使用其他的翻译软件,不解释原因  :)

    op

    op2

    imm5

    Instruction

    See

    0000x

    -

    -

    Bitwise AND

    (本文只对该指令进行解读)

    AND (register) on page A8-326

    0001x

    -

    -

    Bitwise Exclusive OR

    EOR (register) on page A8-384

    0010x

    -

    -

    Subtract

    SUB (register) on page A8-712

    0011x

    -

    -

    Reverse Subtract

    RSB (register) on page A8-576

    0100x

    -

    -

    Add

    ADD (register, ARM) on page A8-312

    0101x

    -

    -

    Add with Carry

    ADC (register) on page A8-302

    0110x

    -

    -

    Subtract with Carry

    SBC (register) on page A8-594

    0111x

    -

    -

    Reverse Subtract with Carry

    RSC (register) on page A8-582

    10xx0

    -

    -

    See Data-processing and miscellaneous instructions on page A5-196

    10001

    -

    -

    Test

    TST (register) on page A8-746

    10011

    -

    -

    Test Equivalence

    TEQ (register) on page A8-740

    10101

    -

    -

    Compare

    CMP (register) on page A8-372

    10111

    -

    -

    Compare Negative

    CMN (register) on page A8-366

    1100x

    -

    -

    Bitwise OR

    ORR (register) on page A8-518

    1101x

    00

    00000

    Move

    MOV (register, ARM) on page A8-488

    not 00000

    Logical Shift Left

    LSL (immediate) on page A8-468

    01

    -

    Logical Shift Right

    LSR (immediate) on page A8-472

    10

    -

    Arithmetic Shift Right

    ASR (immediate) on page A8-330

    11

    00000

    Rotate Right with Extend

    RRX on page A8-572

    not 00000

    Rotate Right

    ROR (immediate) on page A8-568

    1110x

    -

    -

    Bitwise Bit Clear

    BIC (register) on page A8-342

    1111x

    -

    -

    Bitwise NOT

    MVN (register) on page A8-506

    3、本文后续部分只对Instruction中的“Bitwise AND”部分进行解读,其他部分类似,没必要全部解读,毕竟不是为了翻译。

    七、AND (register):

    1、本文只对AND (register)中的Encoding A1 ARMv4*, ARMv5T*, ARMv6*, ARMv7指令进行解读,以下是位域分布图:

    2、指令编码位域意义:

    1、cond:  是条件码

    2、S:       代表该指令是否会影响CPSR的状态标志

    3、Rn:     是保存第一个操作数的寄存器

    4、Rm:    保存第二个操作数的寄存器

    5、Rd:     保存运行结果的寄存器

    6、imm5: 保存Rm中的数据要被移多少位

    7、type:   移位的类型,向左移还是向右移,以及是否是循环移位等等

    3、汇编语法:

    1、AND{S}{<c>}{<q>} {<Rd>,} <Rn>, <Rm> {, <shift>}

    2、解析:

    1、S:        如果有S标志,指令运行结果会更新CPSR状态标志。否则,该CPSR状态标志不会更新;

    2、<c>, <q>:  See Standard assembler syntax fields on page A8-287.

    3、<Rd>:     目的寄存器;

    4、<Rn> :    第一个操作数寄存器;

    5、<Rm>:    第二个操作数寄存器;

    6、<shift>:   这个数字会对<Rm>寄存器中的值进行移位; 

    3、AND指令Demo:

    1、ADD R0,R2,R3,LSL#1 ; R0 = R2 + (R3 << 1)

    2、解析:

    1、S:有S标志,说明运算结果会影响CPSR寄存器的状态标志位;

    2、<c>:没有条件,说明没有是无条件执行;

    3、<Rd>:目的寄存器为R0;

    4、<Rn>:第一个操作数寄存器为R2;

    5、<Rm>:第二个操作数寄存器为R3;

    6、<shift>:对R3进行逻辑左移1位;

     

     

  • 相关阅读:
    写代码的自动提示是怎么出来的...我的WebStorm中不能自动提示Bootstrap中的样式呢
    bootstrap 中是通过写less文件来生成css文件,用什么工具来编写呢?
    flexbox弹性盒模型
    oninput 属性
    操作文件
    深拷贝、浅拷贝、集合
    常用字符串方法
    字典-小练习
    字典
    元组
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/4377243.html
Copyright © 2011-2022 走看看