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字节
 
 

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

  1. 详解Java GC的工作原理+Minor GC、FullGC

    详解Java GC的工作原理+Minor GC.FullGC 引用地址:http://www.blogjava.net/ldwblog/archive/2013/07/24/401919.html J ...

  2. 详解vue的数据binding原理

    自从angular火了以后,各种mv*框架喷涌而出,angular虽然比较火,但是他的坑还是蛮多的,还有许多性能问题被人们吐槽.比如坑爹的脏检查机制,数据binding是受人喜爱的,脏检查就有点…性能 ...

  3. 「JVM」知识点详解一:JVM运行原理详解

    前言 JVM 一直都是面试的必考点,大家都知道,但是要把它搞清楚又好像不是特别容易.JVM 的知识点太散,不系统,今天带大家详细的了解一下jvm的运行原理. 正文 1 什么是JVM? JVM是Java ...

  4. OPCode 详解

    OpCode 操作码(Operation Code, OPCode):描述机器语言指令中,指令要执行某种操作的机器码 OPCode在不同的场合中通常具有不同的含义,例如PHP虚拟机(Zend VM). ...

  5. Nmap参数详解(含扫描参数原理解释)

    语法结构:nmap [Scan Type(s)] [Options] {target specification} 端口状态介绍 open:确定端口开放,可达 closed :关闭的端口对于nmap也 ...

  6. 详解HashMap的内部工作原理

    本文将用一个简单的例子来解释下HashMap内部的工作原理.首先我们从一个例子开始,而不仅仅是从理论上,这样,有助于更好地理解,然后,我们来看下get和put到底是怎样工作的. 我们来看个非常简单的例 ...

  7. Git详解之九 Git内部原理

    以下内容转载自:http://www.open-open.com/lib/view/open1328070620202.html Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各 ...

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

    EJB是什么呢?EJB是一个J2EE体系中的组件.再简单的说它是一个能够远程调用的javaBean.它同普通的javaBean有两点不同.第一点,就是远程调用.第二点,就是事务的功能,我们在EJB中声 ...

  9. 阿里P7架构师详解微服务链路追踪原理

    背景介绍 在微服务横行的时代,服务化思维逐渐成为了程序员的基本思维模式,但是,由于绝大部分项目只是一味地增加服务,并没有对其妥善管理,当接口出现问题时,很难从错综复杂的服务调用网络中找到问题根源,从而 ...

随机推荐

  1. Gym102028G Shortest Paths on Random Forests 生成函数、多项式Exp

    传送门 神仙题-- 考虑计算三个部分:1.\(n\)个点的森林的数量,这个是期望的分母:2.\(n\)个点的所有森林中存在最短路的点对的最短路径长度之和:3.\(n\)个点的所有路径中存在最短路的点对 ...

  2. Flutter裁剪图片

    最近在学习中需要用到裁剪图片,记录一下解决方法 思路: 使用canvas的drawImageRect()方法,对Image进行裁剪,这里的Image需要 'dart:ui' 库中的Image. 1. ...

  3. iOS - 安装CocoaPods详细过程(重装系统后!)

    重装的系统,发现很多东西都要重装,顺便复习和检验下以前的方法还有没有效 一.简介 什么是CocoaPods CocoaPods是OS X和iOS下的一个第三类库管理工具,通过CocoaPods工具我们 ...

  4. 【转载】C#中List集合使用Exists方法判断是否存在符合条件的元素对象

    在C#的List集合操作中,有时候需要根据条件判断List集合中是否存在符合条件的元素对象,此时就可以使用List集合的扩展方法Exists方法来实现,Exists方法的签名为bool Exists( ...

  5. fastDFS遇到的并发问题recv cmd: 0 is not correct, expect cmd: 100

    这种异常一般发生在 多线程同时使用一个StorageClient操作文件的情况下.有两种解决办法:1.对StorageClient对象加锁,变成单线程2.每次下载或上传文件时,重新new一个Stora ...

  6. webpack4 从零学习常用配置梳理

    webpack 的核心价值就是前端源码的打包,即将前端源码中每一个文件(无论任何类型)都当做一个 pack ,然后分析依赖,将其最终打包出线上运行的代码.webpack 的四个核心部分 entry 规 ...

  7. mongdb插入 查询时间

    Robo 3T mongdb客户端 https://www.robomongo.org/ 模糊查找关键字 db.getCollection('test').find({"name" ...

  8. Js获取url问号(View_Detail?data='+data.zjb_ID+'&'+data.D_Name)传值

    Js逻辑 View_Detail?data='+data.zjb_ID+'&'+data.D_Name <script> $(function () { var url = dec ...

  9. Json序列化 总结

    案例总结:https://www.cnblogs.com/jsll/p/11855349.html public string Json_GetDepartment_Position(...)//st ...

  10. 微信公众号&小程序 -- 获取并解密用户数据(获取openId、unionId)

    本文转自https://my.oschina.net/u/3235888/blog/832895 前言 微信小程序API文档:https://mp.weixin.qq.com/debug/wxadoc ...