OPCode详解及汇编与反汇编原理

1. 何为OPCode

在计算机科学领域中,操作码(Operation Code, OPCode)被用于描述机器语言指令中,指定要执行某种操作的那部分机器码,构成OPCode的指令格式和规范由处理器的指令规范指定。除了指令本身以外通常还有指令所需要的操作数,可能有的指令不需要显示的操作数。这些操作数可能是寄存器中的值,堆栈中的值,某块内存的值或者IO端口中的值等等。

OPCode在不同的场合中通常具有不同的含义,例如PHP虚拟机(Zend VM)、java虚拟机(JVM)以及一些软件保护虚拟机中的最小操作单元都可以称之为OPCode。

在本节课中,介绍的是Intel 80x86 CPU的OPCode

2. 常用单字节OPCode概览A -- 40~4F

opcode                                asm                        using

0x40                                  inc eax                 emit(0x40)

0x41                                  inc ecx                 emit(0x41)

0x42                                  inc edx                 emit(0x42)

0x43                                  inc ebx                 emit(0x43)

0x44                                  inc esp                 emit(0x44)

0x45                                  inc ebp                 emit(0x45)

0x46                                  inc esi                   emit(0x46)

0x47                                  inc edi                  emit(0x47)

0x48                                  dec eax                 emit(0x48)

0x49                                  dec ecx                 emit(0x49)

0x4a                                  dec ebx                 emit(0x4a)

0x4b                                  dec ebx                emit(0x4b)

0x4c                                  dec esp                 emit(0x4c)

0x4d                                  dec ebp                emit(0x4d)

0x4e                                  dec esi                  emit(0x4e)

0x4f                                   dec edi                 emit(0x4f)

2. 常用单字节OPCode概览B -- 50~5F

opcode                                asm                        using

0x50                                  push eax                 emit(0x50)

0x51                                  push  ecx                emit(0x51)

0x52                                  push  edx                emit(0x52)

0x53                                  push  ebx                emit(0x53)

0x54                                  push  esp                emit(0x54)

0x55                                  push  ebp                emit(0x55)

0x56                                  push  esi                 emit(0x56)

0x57                                  push  edi                 emit(0x57)

0x58                                  pop eax                   emit(0x58)

0x59                                  pop  ecx                  emit(0x59)

0x5a                                  pop  edx                 emit(0x5a)

0x5b                                  pop  ebx                 emit(0x5b)

0x5c                                  pop  esp                  emit(0x5c)

0x5d                                  pop  ebp                 emit(0x5d)

0x5e                                  pop  esi                   emit(0x5e)

0x5f                                   pop  edi                  emit(0x5f)

2. 常用单字节OPCode概览C -- 70~7F

opcode                                asm                                  using

0x70  0x12                        Jo 0x12                   {_emit(0x70)} {_emit(0x12)}

0x71  ...                             Jno ...                                          ... ...

0x72  ...                             Jb   ...                                          ... ...

0x73  ...                             Jae  ...                                          ... ...

0x74  ...                             Je    ...                                          ... ...

0x75  ...                             Jne  ...                                          ... ...

0x76  ...                             Jbe  ...                                          ... ...

0x77  ...                             Ja     ...                                          ... ...

0x78  ...                             Js     ...                                          ... ...

0x79  ...                             Jns   ...                                          ... ...

0x7a  ...                             Jp     ...                                         ... ...

0x7b  ...                             Jnp   ...                                         ... ...

0x7c  ...                             Jl       ...                                         ... ...

0x7d  ...                             Jge    ...                                        ... ...

0x7e  ...                             Jle     ...                                        ... ...

0x7f  ...                              Jg      ...                                        ... ...

短跳: 2字节

第一个字节: 操作码

第二个字节: 跳转偏移

2. 常用单字节OPCode概览D -- 90~9F

Opcode                       asm                           Using

0x90                    Nop/xchg eax,eax       _emit(0x90)

0x91                    Xchg eax,ecx

0x92                    Xchg eax,edx

0x93                    Xchg eax,ebx

0x94                    Xchg eax,esp

0x95                    Xchg eax,ebp

0x96                    Xchg eax,esi

0x97                    Xchg eax,edi

3. OPCode与指令的对应关系

同类型的指令OPCode不一定相同

B8 01000000    mov eax, 1

8B C3                mov eax, ebx

8B C7                mov eax, edi

OPCode相同的情况下指令也不一定相同

90 nop

90 xchg ax, ax

90 xchg eax, eax

结论: OPCode与汇编指令并非是单纯的对应关系

4. OPCode详解A -- 主要数据域

以上数据域只有Code域是必须存在的,其他数据域视指令格式而定,或有或无

一个指令的长度在1Byte~16Byte之间

实际正常的最长指令是,13Byte

4. OPCode详解B -- 前缀

前缀(Prefixes)的大小为1Byte,用于描述指令的前缀情况,他们可以被划分为5个集合:

66                                   -- 切换操作数大小

67                                   -- 切换地址大小

F2/F3                              -- 重复操作前缀

2E/36/3E/26/64/65       -- 修改默认段

F0                                   -- 锁定前缀

所以指令独此一份,不可能为其他机器码

注意:

a.  "切换"的意思是将其在两种状态间来回切换,而并非特指某种状态

b.  将默认值修改为其他段的操作称之为"修改默认段"

c.  一个OpCode可能会有几个Prefixes

d.  如果有多个Prefixes,那么它们的顺序可能打乱

e.  如果Prefixes不能对随它之后的OpCode起作用,那么它就会被忽略

4. OPCode详解C -- 前缀

切换操作数大小

40               INC EAX

66 40          INC AX

切换顺序: 从大到小

无效的前缀应用

8AC1            MOV AL, CL

66 BAC1       MOV AL, CL

重复操作段前缀

F3 66 AD      REP LODSW

F2 AC            REPNE LODSB

段超越前缀

8B 03             MOV EAX, [DWORD DS:EBX]

658B 03        MOV EAX, [DWORD GS:EBX]

4. OPCode详解D -- ModR/M

OPCode的主要解析逻辑都集中在ModR/M域,我们可以通过对照Intel手册中的表来解析OPCode中的ModR/M域来确定指令的具体格式

例如:

89  D8   mov eax, ebx

D8 = 11011000

Mod  Reg  R/M

11      011  000

4. OPCode详解E -- Opcode小注

/0~7:  此ModR/M只使用R/M域的信息

/r :       此ModR/M同时使用R/M域与Reg域信息

+rb:    寄存器码, 此码将加载OPCode原有值上

AL = 0, CL = 1, DL = 2, BL = 3, AH = 4, CH = 5, DH = 6, BH = 7

+rw:    寄存器码,此码将加载OPCode原有值上

AX = 0, CX = 1, DX = 2, BX = 3, SP = 4, BP = 5, SI = 6, DI = 7

+rd:     寄存器码,此码将加载OPCode原有值上

EAX = 0, ECX = 1, EDX = 2, EBX = 3, ESP = 4, EBP = 5, ESI = 6, EDI = 7

+i:        仅限于浮点计算时,增加的数可以是0~7, 用于标记当前使用的FPU

堆栈,此码将加载OPCode原有值上

4. OPCode详解F -- 高大上指令赏析

13字节汇编指令赏析

F0:26:C7 8491AA000000 11000000

LOCK MOV DWORD PTR ES: [EDX*4 + ECX + 0AA], 11

Prefix    OPCode    ModR/M    SIB     Displacement    Immediate

F0:26:        C7               84          91      AA000000         01000000

注1          注2              注3       注4          偏移                  立即数

注1:  锁定前缀 + ES段超越

注2:  MOV r/m32, imm32

注3:  R/M = disp32[--][--]     Mod != EAX

注4:  Index = [EDX*4]               r32 = ECX

84 91 AA000000  -->  [EDX*4 + ECX +0xAA]

5. 练习

①. 83C4 04

分析:

83 /0 ib: ADD r/m32,imm8             ;/0~7 只使用R/M信息

C4:           ESP

结果:

add esp, 04

②. A1 78812801

A1         : MOV EAX,moffs32*               ;Move doubleword at (seg:offset) to EAX, moffs32为32位地址

结果:

mov eax, dword ptr ds:[1288178]

③. A3 54812801

A3 MOV moffs32*,EAX                        ;Move EAX to (seg:offset),moffs32为32位地址

结果:

mov dword ptr ds:[1288154], eax

④. 68 54812801

PUSH imm32

结果:

push 1288154

⑤. 8B0D 74812801

8B /r  MOV r32,r/m32                        ;/r 同时使用R/M域与Reg域信息

OD 有效地址: disp32   REG: ECX

结果:

mov ecx, dword ptr ds:[1288174]

⑥. 51

50+rdPUSH r32                              ;EAX = 0, ECX = 1, EDX = 2, EBX = 3, ESP = 4, EBP = 5, ESI = 6, EDI = 7

结果:

push ecx

⑦. 68 48812801

68           PUSH imm32

结果:

push 1288148

⑧. FF15 A4922801

FF /3CALL m16:32                         ;/0~7 只使用R/M信息

15  有效地址: disp32

结果:

call dword ptr cs:[12892A4]

总结:

ModR/M信息与确认是否有SIB字节

当Mod != 11b并且R/M的值为100b的时候,表示指令后续有SIB字节,并且该内存操作对象由SIB编码。

MODR/M里有三种情况会有SIB字节

原文地址:https://www.cnblogs.com/wanglijun/p/8830974.html

时间: 2024-09-29 09:53:54

OPCode详解及汇编与反汇编原理的相关文章

TI C66x DSP 指令集 -之- 操作码(opcode)详解

操作码(opcode)就是操作指令,表示该指令应进行什么性质的操作.CPU从程序计数器(PC寄存器)中得到操作码的地址,然后从程序存储空间获取操作码,然后译码,取出操作数,最后执行. 下面以在.D Functional Unit中执行的LDW指令(Load Word From Memory With a 5-Bit Unsigned Constant Offset or Register Offset)讲解.以下内容可参考TMS320C66x_DSP_CPU_and_Instruction an

详解音频编解码的原理、演进和应用选型等

本文来自网易云音乐音视频实验室负责人刘华平在LiveVideoStackCon 2017大会上的分享,并由LiveVideoStack根据演讲内容整理而成(本次演讲PPT文稿,请从文末附件下载). 1.引言 大家好,我是刘华平,从毕业到现在我一直在从事音视频领域相关工作,也有一些自己的创业项目,曾为早期Google Android SDK多媒体架构的构建作出贡献. 就音频而言,无论是算法多样性,Codec种类还是音频编解码复杂程度都远远比视频要高.视频的Codec目前还主要是以宏块为处理单元,预

详解 Kubernetes Pod 的实现原理

Pod.Service.Volume 和 Namespace 是 Kubernetes 集群中四大基本对象,它们能够表示系统中部署的应用.工作负载.网络和磁盘资源,共同定义了集群的状态.Kubernetes 中很多其他的资源其实只对这些基本的对象进行了组合. Pod 是 Kubernetes 集群中能够被创建和管理的最小部署单元,想要彻底和完整的了解 Kubernetes 的实现原理,我们必须要清楚 Pod 的实现原理以及最佳实践. 在这里,我们将分两个部分对 Pod 进行解析,第一部分主要会从

【详解】DNS服务工作原理、正反向解析和主从同步

目录: 一.理论部分 二.实验部分 ******************************理论部分*************************************** 正文: 一.什么是DNS服务. DNS服务是互联网的基础性服务之一.全称为Domain Name System(域名系统).DNS是因特网上作为域名和IP地址相互映射的一个分布式数据库,提供将域名转换成对应IP地址的信息条目,能够使用户更方便的通过域名(如baidu.com)去访问互联网,而不用去记住能够被机器直接

豹哥嵌入式讲堂:ARM Cortex-M开发之文件详解(7)- 反汇编文件(.s/.lst/.dump)

大家好,我是豹哥,猎豹的豹,犀利哥的哥.今天豹哥给大家讲的是嵌入式开发里的反汇编文件(.s, .lst, .dump). 豹哥在第四.五.六节课分别介绍了编译器/链接器生成的3种output文件(relocatable.map.exectuable文件),这3种文件都是侧重的代码经过汇编/链链接后的二进制数据在存储中分布情况.如果想知道二进制数据对应的机器码具体是什么意思应该怎么办?豹哥今天要介绍的反汇编文件会给你答案. 一.标准汇编源文件 使用IAR进行编译的时候会在D:\myProject\

OPCode 详解

OpCode 操作码(Operation Code, OPCode):描述机器语言指令中,指令要执行某种操作的机器码 OPCode在不同的场合中通常具有不同的含义,例如PHP虚拟机(Zend VM).java虚拟机(JVM)以及一些软件保护虚拟机中的最小操作单元都可以称之为OPCode. 常用字节 常用单字节OPCode概览A -- 40~4F opcode asm using 0x40 inc eax emit(0x40) 0x41 inc ecx emit(0x41) 0x42 inc ed

Git详解之九 Git内部原理

来自:http://www.open-open.com/lib/view/open1328070620202.html Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式.我个人发现学习这些内容对于理解 Git 的用处和强大是非常重要的,不过也有人认为这些内容对于初学者来说可能难以理解且过于复杂.正因如此我把这部分内容放在最后一章,你在学习过程中可以先阅 读这部分,也可以晚点阅读这部分,这完全取决于你自己. 既然已

详解HashMap的内部工作原理

本文将用一个简单的例子来解释下HashMap内部的工作原理.首先我们从一个例子开始,而不仅仅是从理论上,这样,有助于更好地理解,然后,我们来看下get和put到底是怎样工作的. 我们来看个非常简单的例子.有一个”国家”(Country)类,我们将要用Country对象作为key,它的首都的名字(String类型)作为value.下面的例子有助于我们理解key-value对在HashMap中是如何存储的. 1. Country.java 1 2 3 4 5 6 7 8 9 10 11 12 13

EJB2.0教程 详解EJB技术及实现原理

EJB是什么呢?EJB是一个J2EE体系中的组件.再简单的说它是一个能够远程调用的javaBean.它同普通的javaBean有两点不同.第一点,就是远程调用.第二点,就是事务的功能,我们在EJB中声明的事务会通过容器帮助我们来处理.支持EJB的SERVER有以下几个:WeblogicWebspereAppserverJboss 我选用的是weblogic+JBuilder9开发.回过来我们继续说这个EJB的原理.它是分布式的.这个的意思其实很简单不需要想太复杂.就 是我们把事情不是交给一个人去