罗聪 OpCode教程 笔记一

转载 2012年03月31日 11:24:15

http://www.luocong.com/learningopcode/doc/1._什么是OpCode?.htm

 

OpCode就是Operation Code,意即操作码的意思, 就是010101了。
mnemonic就是我们用的汇编指令, 叫助记符 .

一个OpCode不只对应一个助记符
OpCode   mnemonic
0x90     NOP
0x90     XCHG AX, AX
0x90     XCHG EAX, EAX

一个助记符不只对应一个OpCode
mnemonic       OpCode
ADD EAX, 1     0x83C001
ADD EAX, 1     0x0501000000
ADD EAX, 1     0x81C001000000

OpCode与mnemonic的关系
一个OpCode不只对应一个mnemonic。
一个mnemonic不只对应一个OpCode。 

OpCode的6个域:
1. Prefixes
2. code
3. ModR/M
4. SIB
5. Displacement
6. Immediate

这6个域的先后顺序是固定的, 其中2是必选的, 其他是可选的
OpCode     mnemonic
0xC3       RETN
0x2F       DAS
0x90       NOP
0xAC       LODSB

上表中的几个OpCode都只用到了code这一项。
其中的最后一项:0xAC 我们在它前面加入F3:
0xF3AC    REP LODSB
可以看到:rep lodsb

为什么会多了个“rep”呢?
那肯定是因为加了F3的缘故了.
我们来看看它的OpCode格式描述,如下:(注:用{}包围起来的是域的名称)
AC -- {code}
F3 AC -- {Prefix}{code}
因此,F3 就是域 Prefix

F3表示的是Rep Prefix,它也能与movsb,stosb等指令联用, 等等。
看下面例子:
OpCode     mnemonic
27         DAA
2F         DAS
3F         AAS
37         AAA
D40A       AAM
D50A       AAD

在Intel的文档中,上表中的所有指令都是1字节的,但是,我们能够看到AAM和AAD是2字节的,到底有什么不同呢?
AAM和AAD的OpCode的第2个字节都是0Ah。
AAM和AAD的描述:
AAM : divide al by 10
商   放在AH里
余数 放在AL里
AAD : AL = AH * 10 + AL

注意到了吗?两者的操作都与10有关。而且两者的OpCode的第二个字节都是10(0Ah)。

AAM与AAD的指令格式不是:
D40A for AAM
D50A for AAD
而是:
D4:imm8 for AAM
D5:imm8 for AAD
(imm8表示8位的立即数)

以此类推, 我们可以通过反汇编器得知,D407表示的是AAM 7,D508表示的是AAD 8,以此类推。

现在,我们又知道了一种新的指令格式:
{code}{Immediate}(域2和域6)
(操作符 + 立即数)
虽然并不是6个域都是必要的,但是,它们的排列顺序绝对不能乱,必须严格按照上面的顺序进行。有些域也许不会出现,但是只要出现了,编号小的域就绝对不允许出现在编号大的域的后面,反之亦然。
例如,{Prefix}{code}的顺序绝对不允许变成{code}{Prefix}。

相关文章推荐

罗聪 OpCode教程 笔记二

http://www.luocong.com/learningopcode/doc/2._从哪里开始,到哪里结束.htm   计算机是如何知道哪里是某一条指令的开始,到哪里才是它的结束呢? 看下...
  • cay22
  • cay22
  • 2012年03月31日 11:38
  • 1731

罗聪 OpCode教程 笔记三

Prefixes! http://www.luocong.com/learningopcode/doc/3._Prefixes_-_Part_I.htm   OpCode            ...
  • cay22
  • cay22
  • 2012年04月02日 22:15
  • 1602

Svin的OpCode教程

  • 2012年07月25日 10:19
  • 549KB
  • 下载

PHP内核之opcode的处理函数查找

首先我们需要知道有个存放 所有opcode 的 opcode_handler_t 的函数指针字段 的集合 的文件 php-5.5.12\Zend\zend_vm_execute.h void zen...

Emit常用Opcode指令使用方法

  • 2016年10月17日 08:32
  • 25KB
  • 下载

Internet手册OPcode

  • 2017年11月11日 09:31
  • 916KB
  • 下载

深入理解PHP Opcode缓存原理

什么是opcode缓存? 当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode)。Opcode cache的目地是避免重复编译...
  • lmjy102
  • lmjy102
  • 2017年05月26日 15:34
  • 160

Opcode定义和查询

  • 2009年03月13日 17:39
  • 2.17MB
  • 下载

OpCode操作码

  • 2012年07月25日 10:21
  • 124KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:罗聪 OpCode教程 笔记一
举报原因:
原因补充:

(最多只允许输入30个字)