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位;