当前位置:文档之家› 汇编指令机器码总结

汇编指令机器码总结

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

然后全面总结了机器码中的单字节操作码,并利用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:EAXb) 001:CL:CX:ECXc) 010:DL:DX:EDXd) 011:BL:BX:EBXe) 100:AH:SP:ESPf) 101:CH:BP:EBPg) 110:DH:SI:ESIh) 111:BH:DI:EDI4) “sss”——表示段寄存器a) 000 : ESb) 001 : CSc) 010 : SSd) 011 : DSe) 100 : FS (386+)f) 101 : GS (386+)三、操作码总结与验证[3]从上一节可以看出,一条指令的操作码变化有限(8比特操作码只有不超过256个)而且相对地址码更为重要,因此这一节我们重点讨论单字节指令的操作码。

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

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

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

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

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

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

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

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

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

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

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

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

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

表6 0x4n机器码及对应指令43 INC BX49 DEC CX4B DEC BX4F DEC DI 验证结果见图5。

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

表7 0x5n机器码及对应指令53 PUSH BX59 POP CX5B POP BX5F POP DI 验证结果见图6。

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

表8 0x6n机器码及对应指令63 Not used69 IMUL reg16/mem16,imm166B IMUL reg8/mem8,imm86F OUTSW验证结果见图7。

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

表9 0x7n机器码及对应指令73 JNB imm879 JNS imm87B JNP imm87F JG imm8 验证结果见图8。

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

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

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

表11 0x9n机器码及对应指令93 XCHG AX,BX99 CWD9B WAIT9F LAHF验证结果见图10。

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

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

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

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

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

表14 0xCn机器码及对应指令C3 RET NEARC9 LEAVECB RET FARCF IRET验证结果见图13。

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

表15 0xDn机器码及对应指令D3 Table1 reg16D9 ESC imm8DB ESC imm8DF ESC imm8验证结果见图14。

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

表16 0xEn机器码及对应指令E3 JCXZ imm8E9 JMP imm16EB JMP imm8EF OUT AX,DX 验证结果见图15。

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

表17 0xFn机器码及对应指令F3 REPF9 STCFB STIFF Table4 reg16验证结果见图16。

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

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

相关主题