[原创]IA-32指令解析之操作码
发表于:
2020-4-13 14:08
3574
概念:IA-32指令(Inter Architecture,32-bit)。顾名思义,32运算的英特尔体系结构指令集。简而言之,是指CPU所使用的指令。比如在OD ,IDA打开某个程序我们可以看到:
图中使用紫红色圈起来的地方
从上边两张图我们可以发现:
1. 每条指令都是由十六进制数构成
2. 指令有长有短。
我们都知道,从开始编写代码我们使用的是高级语言(比如 C++),在之后高级语言会被转换成计算机能识别的二进制语言0和1,这个过程我们称之为编译,而完成这个转化过程的程序,我们称之为编译器。 但是,单纯的0和1对于我们来说是难读懂的,因此,我们将其转换为可读性较高的16进制数。
那指令为什么有长有短呢?这就涉及到了IA-32指令格式的相关知识了。请看下图:
从图中我们可以看出:
[Prefixes][Opcode][ModR/M][SIB][Displacement][Immediate] 一条指令由这六个部分组成,但其中某些部分是可选的。所以这也就是指令会有长短之别的原因。
接下来,我们开始对指令的每个部分进行解析。
操作码(opcode)
操作码是指令中必不可少的部分。操作码比如:mov cmp push等等都是都是大家所熟知的汇编指令。操作码的长度大部分为1个字节(8位,两个16进制),少部分是2个字节,而3个字节长度的操作码则用在MMX中,一般很少遇到,这边不再详细说明。
首先我们从一条长度为1个字节的指令来对操作码部分进行解析。
41 INC ECX
41:查找单字节操作码映射表第4行第1列。
解析步骤如下:
1. 找第4行第1列的位置。
2. 我们发现指向的是 ecx REX.B。这里表明了操作操作数。
3. 我们再看看3,4标注箭头处的内容:INC(i64)和REX(o64);从下图标记处我们可以发现:
I64:The instruction is invalid or not encodable in 64-bit mode. 40 through 4F (single-byte INC and DEC) are REX prefix combinations when in 64-bit mode (use FE/FF Grp 4 and 5 for INC and DEC).
该指令在64位模式下无效或不可编码。在64位模式下40到4F(单字节INC和DEC)是REC前缀组合。
o64: Instruction is only available when in 64-bit mode.
命令只在64位模式下有效。
显而易见,o64告诉我们REX是在64位下使用的,所以在这里,他不是操作数REX。
而064说的是:在64位模式下40到4F(单字节INC和DEC)是REC的前缀组合一部分,也就说在不是64位模式下,指的是单字节INC和DEC。所以INC(i64)指的便是操作码INC
4.所以,41表示的是 INC ECX指令。
----------------------------------------------------------------------------------------------------------------
下边有2个练习,将十六进制转换成相应的汇编指令
答案在二楼。
总结 :上述图片表格是intel官方手册内容。附件上传了intel官方手册。
建议把我所提到的页数内容打印下来,一来查阅方便,二来纸质资料比较好加深印象。页数如下:40-41 2129-2131 2134-2340 2146-2147
下期见。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
上传的附件: