OpCode教程

什么是OpCode?

不管计算机技术的发展如何日新月异,其最基本的东西是不会突然改变的。OpCode就是这其中的一样东西——因此,Bill Gates的这句话用在这里并不太合适。

在开始回答什么是OpCode之前,请让我先来提几个小问题。

  1. 计算机只认识0和1吗?
  2. 如果上面的回答是“是”,那么我们平时写的程序源代码是0和1吗?
  3. 如果上面的回答是“不是”,那么计算机是怎么“知道”我们的程序的意思的?

按顺序作答,依次是:

  1. 不是
  2. ???

最后一个问题的答案是……?我们来举个例子,在汇编语言中:

NOP

这条指令很简单,是吧?

在编译的时候,Assembler会扫描整个源代码。

在前面我们已经知道了,由于计算机只认识0和1,所以,源代码“NOP”是无法直接运行的。当Assembler遇到“NOP”的时候,为了生成让计算机能运行的“东西”(暂且这样称呼吧),就会以十六进制数“0x90”来代替它。

在这里,“0x90”就是“OpCode”,而“NOP”则是“助记符(mnemonic)”。

 OpCode的全称

OpCode就是Operation Code,意即操作码的意思。

一个OpCode只对应一个助记符吗?

示例:OpCode && mnemonic
OpCodemnemonic
0x90NOP
0x90XCHG AX, AX
0x90XCHG EAX, EAX

从上表中可以看出,同一个OpCode可以对应N个mnemonic。为什么会这样呢?原因现在不必深究,以后自然会明白的。

一个助记符只对应一个OpCode吗?

示例:OpCode && mnemonic
mnemonicOpCode
ADD EAX, 10x83C001
ADD EAX, 10x0501000000
ADD EAX, 10x81C001000000

从上表中也可以看出,同一个mnemonic可以对应多个OpCode。原因同样留待以后再说。

 OpCode与mnemonic的关系

 一个OpCode不只对应一个mnemonic
 一个mnemonic不只对应一个OpCode

OpCode管中窥豹

有6个域是OpCode可能会用到的,或者说OpCode是由这6个域组成的——不过请注意:它们的名字是什么,这并不重要——重要的是它们的排列顺序。

它们是:

  1. Prefixes
  2. code
  3. ModR/M
  4. SIB
  5. Displacement
  6. Immediate

OpCode的这6个域的详细介绍留待以后再说,现在首先要知道:

 在实际的使用中,并不是这所有的6个域都会被用到的,但是有一项却是一定会有的,那就是第2项:code,有些指令甚至只会用到code这一项。

例如:

OpCode && mnemonic
OpCodemnemonic
0xC3RETN
0x2FDAS
0x90NOP
0xACLODSB

上表中的几个OpCode都只用到了code这一项。其中的最后一项:0xAC,让我们来看看能不能给它加上一些额外的“东西”:

0xF3AC    REP LODSB

可以看到:rep lodsb

为什么会多了个“rep”呢?是不是由额外的“F3”造成的呢?

Yes,猜对了,我们来看看它的OpCode格式描述,如下:(注:用{}包围起来的是域的名称)

AC -- {code}
F3 AC -- {Prefix}{code}
因此,F3 就是域 Prefix

在稍后的章节中我们会知道,F3表示的是Rep Prefix,它也能与movsbstosb等指令联用,但是,具体细节在这里暂不深究。

让我再来强调一次:OpCode中的6个域是可选的(除了域code之外),不必都用上,但是code是一定会有的。

 

更精彩内容请参考:http://www.luocong.com/learningopcode/index.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值