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 |
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 无序的意思是至少有一个非数字操作数 2、HS HS(无符号大于或相同)是同义词CS. 3、LO LO(无符号更低)是同义词CC. 4、AL 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 |
xxx0 |
Data-processing (register) |
- |
0xx1 |
Data-processing (register-shifted |
- |
||
10xx0 |
0xxx |
Miscellaneous instructions |
- |
|
1xx0 |
Halfword multiply and multiply |
- |
||
0xxxx |
1001 |
Multiply and multiply accumulate |
- |
|
1xxxx |
1001 |
Synchronization primitives |
- |
|
not |
1011 |
Extra load/store instructions |
- |
|
11x1 |
Extra load/store instructions |
- |
||
0xx1x |
1011 |
Extra load/store instructions, |
- |
|
11x1 |
Extra load/store instructions |
- |
||
1 |
not |
- |
Data-processing (immediate) |
- |
10000 |
- |
16-bit immediate load, MOV (immediate) |
v6T2 |
|
10100 |
- |
High halfword 16-bit immediate load, |
v6T2 |
|
10x10 |
- |
MSR (immediate), and hints |
- |
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位;
ARM_Instruction_Set_Encoding_hacking(ARM指令集编码格式解读)的更多相关文章
- ARM指令集----寻址方式
ARM指令集可以分为跳转指令,数据处理指令,程序状态寄存器传输指令,LOAD/Store指令,协处理器指令和异常中断产生指令6类 ARM指令集的寻址方式 数据处理指令的操作数的寻址方式 字以及无符号字 ...
- ARM指令集学习总结-转载
ARM指令集比较简单,本文介绍ARM指令集中需要注意和不易理解的地方. 一.ARM指令集是32位的,程序的启动都是从ARM指令集开始,包括所有异常中断都是自动转化为ARM状态,并且所有的指 ...
- ARM指令集(上)
ADuC702x可以用两套指令集:ARM指令集和Thumb指令集.本小节介绍ARM指令集.在介绍ARM指令集之前,先介绍指令的格式. A.2.1 指令格式 (1)基本格式 ...
- ARM指令集相关知识
1.ARMv8引入了执行状态机制,分为AArch32和AArch64 AArch32为T32(Thumb)和A32(ARM). AArch64为A64一种指令集 A64和A32的指令都是32位宽,可以 ...
- ARM指令集----杂项指令
ARM指令集可以分为6类,即是跳转指令,数据处理指令,程序状态传输指令,Load.Store指令,协处理器指令和异常中断指令 跳转指令: 在ARM中有两种方式可以实现程序的跳转,一种是跳转指令,另一种 ...
- ARM指令集——条件执行、内存操作指令、跳转指令
ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST ...
- 对arm指令集的疑惑,静态库运行,编译报错等问题
转载自http://www.jianshu.com/p/4a70aa03a4ea?utm_campaign=hugo&utm_medium=reader_share&utm_conte ...
- 从最简单的实例学习ARM 指令集(三)
上一篇讲到赋值运算,这篇讲讲子函数调用.先看最简单范例:test4.c #include <stdio.h> void f1() { } void main() { int d = 4; ...
- ARM指令集—SWP指令
ARM指令集-SWP指令 SWP和SWPB是ARM指令集中对存储单元的原子操作.即对存储单元的一次读和一次不可被切割. SWP和SWPB分别完毕存储器和寄存器之间 一个字(32bit)和一个字节(8b ...
随机推荐
- S4 对象系统
上一节中,我们介绍了 S3 系统.与大多数其他编程语言的面向对象系统不同,与那些类被定义为固定结构,且随着程序编译有确定的方法分派的系统相比,S3 系统显得非常不严谨.当我们定义一个 S3 类时,几乎 ...
- 汇编语言调用Linux系统调用read和write
.section .data UserMsg: .ascii "Please input the message:" LenOfUserMsg: .equ lenMsg, LenO ...
- Spring AOP 切面编程记录日志和接口执行时间
最近客户现在提出系统访问非常慢,需要优化提升访问速度,在排查了nginx.tomcat内存和服务器负载之后,判断是数据库查询速度慢,进一步排查发现是因为部分视图和表查询特别慢导致了整个系统的响应时间特 ...
- 工程优化暨babel升级小记
小记背景 随着业务代码的增多,项目代码的编译时长也在增多,遂针对这个痛点在dev下做些优化 第一部分:优化dev编译时间 这里优化的主要思路是在dev环境下,单独出来一个dll配置文件,将项目中的部分 ...
- WCF配置后支持通过URL进行http方式调用
最近遇到一个小型项目,主要就是通过手机写入NFC信息,思考许久后决定就写一个简单的CS程序来搞定这个问题,可是当涉及到手机和PC通信的时候首先考虑到的就是IIS,同时因为数据库是SQLite,思前想后 ...
- codeforces 1041d// Glider// Codeforces Round #509(Div. 2)
题意:给出,n和飞行员高度h,n是区间数.在区间里飞行员高度不变,其它地方每秒高度-1,x坐标+1.问在高度变为0以前,x坐标最多加多少? 用数组gap记录本区间右端到下一个区间左端的距离.用sum记 ...
- php实现频率限制
一.前言 公司要做呼叫中心,呼叫中心为了防止骚扰,需要限制用户拨打电话的频率,比如30s只能点击一次.这样的需求是通过redis来实现的. 二.具体实现 <?php class Resource ...
- Python基础--数据类型
一.数据类型是什么鬼? 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同 ...
- python-day7--%s与%d的使用,python2中的input及raw_input
#coding:utf-8 #utf-8格式打开#%s %d# name='egon'# age=18# print('my name is',name)# print('my name is my ...
- HDU-4856 Tunnels (BFS+状压DP)
Problem Description Bob is travelling in Xi’an. He finds many secret tunnels beneath the city. In hi ...