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

 

 

时间: 2024-09-17 16:11:39

ARM_Instruction_Set_Encoding_hacking(ARM指令集编码格式解读)的相关文章

ARM:Denver架构会最大限度延展ARM指令集

据国外媒体报道,英伟达近日发布了丹佛(Denver)高性能计算处理器计划,但并未公布具体上市时间. 公司首席执行官Jen-Hsun Huang在本周四的公司财务会议上指出该处理器可进行64位单线程计算,"我们致力于创造能够延展ARM指令集的新架构,不光考虑到高效节能,还要满足我们日益增长的市场的高性能要求.我们一直努力推行丹佛计划,目前计划运行顺利." 丹佛计划是今年1月在消费者电子产品展上首次推出的,英伟达并未具体指明该ARM架构芯片的技术,之前ARM v8架构下64位芯片是10月2

ARM指令集

ADC 带进位的32位数加法 ADD 32位数相加 AND 32位数的逻辑与 B 在32M空间内的相对跳转指令 BIC 32位数的逻辑位清零 BKPT 断点指令 BL 带链接的相对跳转指令 BLX 带链接的切换跳转 BX 切换跳转 CDP CDP2 协处理器数据处理操作 CLZ 零计数 CMN 比较两个数的相反数 CMP 32位数比较 EOR 32位逻辑异或 LDC LDC2 从协处理器取一个或多个32位值 LDM 从内存送多个32位字到ARM寄存器 LDR 从虚拟地址取一个单个的32位值 MC

ARM及指令集

   常常能看到ARM7,ARM9,ARM11,以及armv6k等不同的表达.且在GCC编译中,常常要用到 -march, -mcpu等.他们分别表达什么涵义呢?今天就仔细研究一下.   ARM(Advanced RISC Machines)是微处理器行业的一家知名企业.设计了大量高性能.廉价.耗能低的RISC处理器.相关技术及软件.1985年,第一个ARM原型在英国剑桥诞生.ARM公司的特点是只设计芯片,而不生产.ARM将其技术授权给世界上许多著名的半导体.软件和OEM厂商,每个厂商得到的都是

《逆向工程权威指南》—第3章3.4节ARM

3.4 ARM 根据我个人的经验,本书将通过以下几个主流的ARM编译器进行演示. 2013年6月版本的Keil编译器. Apple Xcode 4.6.3 IDE (含LLVM-GCC 4.2编译器) .[10] 面向 ARM64的GCC 4.9 (Linaro),其32位的Windows程序可由下述网址下载:http://www. linaro.org/ projects/armv8/. 除非特别标注,否则本书中的ARM程序都是32位ARM程序.在介绍64位的ARM程序时,本书会称其为ARM6

国内ARM阵营IC设计公司会不会处处受制于人?

到底什么才是自主可控的国产芯片,必须要有一个明确的认定.目前主流的在ARM技术授权的基础上搞国产芯片开发的方式,显然值得商榷. 近年来,在国家大力扶持集成电路产业的背景下,国内从事高性能CPU设计的单位或公司数量不断壮大. 但美中不足的是,几乎所有单位都认为自己的产品和技术路线符合自主可控标准. 比如飞腾在和中国电子合作后,将购买自ARM的Cortex A57产品打上自主可控标签进军信息安全市场:展讯把购买自ARM的Cortex A53和Mali的T720MP2集成得到的椒图芯片打上了自主可控.

外媒:证明ARM是错的 要为英特尔“平反”

随着ARMhttp://www.aliyun.com/zixun/aggregation/17728.html">架构处理器在移动市场的崛起,英特尔所坚持的x86架构似乎被认为是错的,一直以来也有不少人坚持这样的观点,Seeking Alpha作者Ashraf Eassa近日却撰文表示,ARM是错的,ARM在PC领域和服务器领域会很快消亡,而英特尔则将在平板和手机领域获得更多的份额,以下是原文: 我 欣赏ARM公司如今的成绩和产品,但是我对其首席执行官近年来宣称"ARM指令集架构

ARM架构

ARM架构(过去称作进阶精简指令集机器(Advanced RISC Machine),更早称作Acorn RISC Machine)是一个32位元精简指令集(RISC) 中央处理器(processor)架构,其广泛地使用在许多嵌入式系统(embedded)设计.由于节能的特点,ARM处理器非常适用于移动通讯领域,符合其主要设计目标为低耗电的特性. 目录 历史 内核种类 内核发展历程 1.发展历程 2.ARM内核与架构对照表 设计文件 Thumb Jazelle Thumb-2 Thumb Exe

iOS逆向工程之Hopper中的ARM指令

虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是可以的.虽然当时感觉学这门课以后似乎不怎么用的上,可曾想这不就用上了吗,不过之前学的都差不多忘了,还得捡起来呢.ARM指令集是精简指令集,从名字我们就能看出指令的个数比那些负责指令集要少一些.当然本篇所涉及的ARM指令集是冰山一角,不过也算是基础,可以阅读Hopper中的汇编了,实践出真知,看多了自

ARM相关知识

ARM7采用冯·诺依曼(Von-Neumann)结构,数据存储器和程序存储器重合在一起.    同时,此结构也被大多数计算机所采用. ARM7为三级流水线结构(取指,译码,执行),平均功耗为0.6mW/MHz,时钟速度为66MHz,每条指令平均执行1.9个时钟周期 ARM7系列微处理器包括如下几种类型的核:ARM7TDMI.ARM7TDMI-S. ARM720T.ARM7EJ ARM7采用的Neumann结构,取指令和取操作数都是通过一条总线分时进行,这样,在高速运算时,不但不能同时取指令和取操