汇编指令机器码总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汇编指令机器码总结与验证
摘要:本文介绍了汇编指令机器码的含义与作用,并讨论了指令的组成结构即操作码与地址码。

然后全面总结了机器码中的单字节操作码,并利用Debug工具进行了详细的验证。

关键词:指令;机器码
一、机器码概述[1]
机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。

这种指令集就称为机器码,它是电脑的CPU可直接解读的数据。

一条指令是机器语言的一个语句,是一组有意义的二进制代码。

计算机通过执行指令来处理各种数据。

为了指出数据的来源、操作结果的去向及所执行的操作,一条指令必须包含下列信息:
a) 操作码
b) 操作数的地址
c) 操作结果的存储地址
d) 下条指令的地址
一条指令实际上包括两种信息即操作码和地址码。

操作码用来表示该指令所要完成的操作(如加、减、乘、除、数据传送等),其长度取决于指令系统中的指令条数。

地址码用来描述该指令的操作对象,它或者直接给出操作数,或者指出操作数的存储器地址或寄存器地址(即寄存器名)。

二、机器码详解[2]
由上文已知,一条指令一般由操作码和地址码组成。

其中,操作码是指明CPU对内存或寄存器中的数据进行什么样的操作,地址码给出这些数据对象。

下面我们就将指令分为两部分进行研究。

1.操作码
操作码一般占用1个字节(8位)或2个字节(16位)。

其中最低比特(记作W)在很多指令中表示目标操作数的位宽,W=0表示字节长(8位)操作数,W=1表示双字节长(16位)操作数。

例如,操作码00000000B(W=0)表示“ADD 8位寄存器,8位寄存器”,而00000001B(W=1)表示“ADD 16位寄存器,16位寄存器”。

2.地址码
地址码一般占用1个字节,其中的8个比特位可分为三组,形式一般为“oommmrrr”。

这些分组大致可分为以下四个类型:
1) “oo”——表示指令的地址偏移量类型
a) 00:如果mmm=110,那么指令后紧跟一个地址偏移量;否则未使用地址偏移量
b) 01:指令后紧跟一个8比特无符号地址偏移量
c) 10:指令后紧跟一个16比特无符号地址偏移量
d) 11:此时mmm表示一个寄存器而不是地址
2) “mmm”——表示存储器操作数地址
a) 000 : DS:[BX+SI]
b) 001 : DS:[BX+DI]
c) 010 : SS:[BP+SI]
d) 011 : SS:[BP+DI]
e) 100 : DS:[SI]
f) 101 : DS:[DI]
g) 110 : SS:[BP]
h) 111 : DS:[BX]
3) “rrr”——表示通用寄存器(下列分别表示当W=0;W=1;32位)
a) 000:AL:AX:EAX
b) 001:CL:CX:ECX
c) 010:DL:DX:EDX
d) 011:BL:BX:EBX
e) 100:AH:SP:ESP
f) 101:CH:BP:EBP
g) 110:DH:SI:ESI
h) 111:BH:DI:EDI
4) “sss”——表示段寄存器
a) 000 : ES
b) 001 : CS
c) 010 : SS
d) 011 : DS
e) 100 : FS (386+)
f) 101 : GS (386+)
三、操作码总结与验证[3]
从上一节可以看出,一条指令的操作码变化有限(8比特操作码只有不超过256个)而且相对地址码更为重要,因此这一节我们重点讨论单字节指令的操作码。

为描述指令类型,我们约定了不同类型寄存器、内存和立即数等操作数的符号,见表1。

表1 操作数符号
符号类型说明符号类型说明
为了方便验证操作码,我们将在验证时填充地址码为0x00。

下面,我们就按照单字节操作码的比特顺序进行总结与验证。

首先,我们列出机器码为0x0n的16个操作码,见表2。

表2 0x0n机器码及对应指令
09 OR reg16/mem16,reg16
0B OR reg16,reg16/mem16
利用Debug工具进行验证,依次输入16条指令的16进制代码(地址码均为0x00),然后使用“-u”查看指令,如图1。

图1 0x0n机器码验证
从图中可以看出,我们验证的结果与理论值完全一致。

接下来,我们将重复以16条指令为单位,依次列出指令机器码,并进行验证。

表3 0x1n机器码及对应指令
13 ADC reg16,reg16/mem16
19 SBB reg16/mem16,reg16
1B SBB reg16,reg16/mem16
1F POP DS
验证结果见图2。

图2 0x1n机器码验证
从图中可以看出,我们验证的结果与理论值完全一致。

表4 0x2n机器码及对应指令
23 AND reg16,reg16/mem16
29 SUB reg16/mem16,reg16
2B SUB reg16,reg16/mem16
2F DAS
验证结果见图3。

图3 0x2n机器码验证
从图中可以看出,我们验证的结果与理论值完全一致,并且指令0x26和0x2E分别是重载段寄存器DS和CS。

表5 0x3n机器码及对应指令
33 XOR reg16,reg16/mem16
39 CMP reg16/mem16,reg16
3B CMP reg16,reg16/mem16
3F AAS
验证结果见图4。

图4 0x3n机器码验证
从图中可以看出,我们验证的结果与理论值完全一致,并且指令0x36和0x3E分别是重载段寄存器SS和DS。

表6 0x4n机器码及对应指令
43 INC BX
49 DEC CX
4B DEC BX
4F DEC DI 验证结果见图5。

图5 0x4n机器码验证
从图中可以看出,我们验证的结果与理论值完全一致。

表7 0x5n机器码及对应指令
53 PUSH BX
59 POP CX
5B POP BX
5F POP DI 验证结果见图6。

图6 0x5n机器码验证
从图中可以看出,我们验证的结果与理论值完全一致。

表8 0x6n机器码及对应指令
63 Not used
69 IMUL reg16/mem16,imm16
6B IMUL reg8/mem8,imm8
6F OUTSW
验证结果见图7。

图7 0x6n机器码验证
从图中可以看出,这一组指令在80x86架构CPU中都不存在,所以CPU自动将其翻译为数据。

表9 0x7n机器码及对应指令
73 JNB imm8
79 JNS imm8
7B JNP imm8
7F JG imm8 验证结果见图8。

图8 0x7n机器码验证
从图中可以看出,我们验证的结果与理论值完全一致。

表10 0x8n机器码及对应指令
83 Table2 reg8, reg16
89 MOV reg16/mem16,reg16
8B MOV reg16,reg16/mem16
8F POP reg16/mem16
验证结果见图9。

图9 0x8n机器码验证
从图中可以看出,我们验证的结果除了80x86架构CPU不存在的0x80-0x83指令之外,其余指令与理论值完全一致。

表11 0x9n机器码及对应指令
93 XCHG AX,BX
99 CWD
9B WAIT
9F LAHF
验证结果见图10。

图10 0x9n机器码验证
从图中可以看出,我们验证的结果与理论值完全一致。

表12 0xAn机器码及对应指令
A3 MOV [mem16],AX
A9 TEST AX,[mem16]
AB STOSW
AF SCASW
验证结果见图11。

图11 0xAn机器码验证
从图中可以看出,我们验证的结果与理论值完全一致。

表13 0xBn机器码及对应指令
B3 MOV BL,imm8
B9 MOV CX,imm16
BB MOV BX,imm16
BF MOV DI,imm16 验证结果见图12。

图12 0xBn机器码验证
从图中可以看出,我们验证的结果与理论值完全一致。

表14 0xCn机器码及对应指令
C3 RET NEAR
C9 LEAVE
CB RET FAR
CF IRET
验证结果见图13。

图13 0xCn机器码验证
从图中可以看出,我们验证的结果除了80x86架构CPU不存在的0xC0、0xC1、0xC8和0xC9指令之外,其余指令与理论值完全一致。

表15 0xDn机器码及对应指令
D3 Table1 reg16
D9 ESC imm8
DB ESC imm8
DF ESC imm8
验证结果见图14。

图14 0xDn机器码验证
从图中可以看出,指令0xD0、0xD1、0xD2和0xD3在80x86架构CPU中不存在,指令0xD8-0xDF 在80x86架构CPU中代表了不同的指令。

表16 0xEn机器码及对应指令
E3 JCXZ imm8
E9 JMP imm16
EB JMP imm8
EF OUT AX,DX 验证结果见图15。

图15 0xEn机器码验证
从图中可以看出,我们验证的结果与理论值完全一致。

表17 0xFn机器码及对应指令
F3 REP
F9 STC
FB STI
FF Table4 reg16
验证结果见图16。

图16 0xFn机器码验证
从图中可以看出,我们验证的结果除了80x86架构CPU中不一样的0xF6、0xF7、0xFE和0xFF 指令之外,其余指令与理论值完全一致。

参考文献:
[1] 机器语言.
[2] 80x86 Opcodes. /ece390/resources/opcodes.html
[3] 汇编指令机器码对应表. 。

相关文档
最新文档