8086-8088指令系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二(找出8086/8088指令系统所有指令的操作码的编码)
一、实验目的
本实验旨在利用debug工具的e和u功能找出8086/8088指令系统的指令格式中各种操作码编码对应的指令功能。
二、实验原理
已经知道:
1、每条指令1~6个字节不等
2、指令的第一字节为操作码,规定指令的操作类型。
第二字节规定操作数的寻址方式
接着以后的3~6 字节依据指令的不同取舍。
3、第一个字节的八个二进制位中前六位为操作码的主要部分,之后一位是D字段,然
后是W字段,W指出操作数类型:
W=0 为字节,
W=1 为字,
D指出操作数的传送方向:
D=0 寄存器操作数为源操作数,
D=1 寄存器操作数为目标操作数。
三、实验步骤
(一)
1、用试探法
结论:操作码字节前六位为000000(二进制)看来是一条ADD指令,而且只占两个字节。
记下来:
指令码汇编指令
---------------------------------------------------------------------
037F:0100 0000 ADD [BX+SI],AL
2、将指令首字节变为01,重复以上实验
结论:第1字节由00(二进制0000 0000)变为01(二进制0000 0001),ADD指令的第二个操作数由AL变为了AX。
AL为8位寄存器、AX为16位寄存器,印证了W字段的作用,增加一条有用的记录:
指令码汇编指令
-------------------------------------------------------------------------
037F:0100 0000 ADD [BX+SI],AL
037F:0100 0100 ADD [BX+SI],AX
3、将指令首字节变为02,重复以上实验
第1字节由00(二进制0000 0000)变为02(二进制0000 0010),ADD 操作的传送方向发生转变,印证了D字段的作用。
增加一条记录:
指令码汇编指令
------------------------------------------------------------------------
037F:0100 0000 ADD [BX+SI],AL
037F:0100 0100 ADD [BX+SI],AX
037F:0100 0200 ADD AL,[BX+SI]
4、将指令首字节变为03,重复以上实验
D和W同时变化,记下:
指令码汇编指令
-----------------------------------------------------------------------
037F:0100 0000 ADD [BX+SI],AL
037F:0100 0100 ADD [BX+SI],AX
037F:0100 0200 ADD AL,[BX+SI]
037F:0100 0300 ADD AX,[BX+SI]
(二)1、首字节为04~07,继续实验
(1)首字节为04,继续实验
(2)首字节为05,继续实验
(3)首字节为06,继续实验
(4)首字节为07,继续实验
-
得到四条新的记录,出现了第1个3字节指令050000(ADD AX,0000),还捕获了两条新的单字节指令:
指令码汇编指令
----------------------------------------------------------------------
037F:0100 0000 ADD [BX+SI],AL
037F:0100 0100 ADD [BX+SI],AX
037F:0100 0200 ADD AL,[BX+SI]
037F:0100 0300 ADD AX,[BX+SI]
037F:0100 0400 ADD AL,00
037F:0100 050000 ADD AX,0000
037F:0100 06 PUSH ES
037F:0100 07 POP ES
2、08~0b,继续
-
是四条OR指令:
指令码汇编指令
--------------------------------------------------------------------
037F:0100 0000 ADD [BX+SI],AL
037F:0100 0100 ADD [BX+SI],AX
037F:0100 0200 ADD AL,[BX+SI]
037F:0100 0300 ADD AX,[BX+SI]
037F:0100 0400 ADD AL,00
037F:0100 050000 ADD AX,0000
037F:0100 06 PUSH ES
037F:0100 07 POP ES
037F:0100 0800 OR [BX+SI],AL
037F:0100 0900 OR [BX+SI],AX
037F:0100 0A00 OR AL,[BX+SI]
037F:0100 0B00 OR AX,[BX+SI]
(三)
1、用in1-zsl.txt生成out1-zsl.txt
原理:用DOS的输入/输出重定向功能,让debug自动执行一批命令。
(1)编写in1-zsl.txt
(2)打开命令提示符窗口执行
(3)核实out1-zsl.txt文件的内容
在此目录下生成了一个out1.txt文件,内容如下:
(4)将out1-zsl.txt中的新操作码加入指令表。
首字节为0c的指令是一条OR指令:
指令码汇编指令
----------------------------------------------------------------------
037F:0100 0000 ADD [BX+SI],AL
037F:0100 0100 ADD [BX+SI],AX
037F:0100 0200 ADD AL,[BX+SI]
037F:0100 0300 ADD AX,[BX+SI]
037F:0100 0400 ADD AL,00
037F:0100 050000 ADD AX,0000
037F:0100 06 PUSH ES
037F:0100 07 POP ES
037F:0100 0800 OR [BX+SI],AL
037F:0100 0900 OR [BX+SI],AX
037F:0100 0A00 OR AL,[BX+SI]
037F:0100 0B00 OR AX,[BX+SI]
037F:0100 0C00 OR AL,00
2、用in2-zsl.txt生成out2-zsl.txt
(1)编写in2-zsl.txt。
(2) 在命令提示符窗口输入命令回车执行
生成了out2-zsl.txt文件,内容为:
这一次收获了三条新的记录:
指令码汇编指令
------------------------------------------------------------------
037F:0100 0000 ADD [BX+SI],AL
037F:0100 0100 ADD [BX+SI],AX
037F:0100 0200 ADD AL,[BX+SI]
037F:0100 0300 ADD AX,[BX+SI]
037F:0100 0400 ADD AL,00
037F:0100 050000 ADD AX,0000
037F:0100 06 PUSH ES
037F:0100 07 POP ES
037F:0100 0800 OR [BX+SI],AL
037F:0100 0900 OR [BX+SI],AX
037F:0100 0A00 OR AL,[BX+SI]
037F:0100 0B00 OR AX,[BX+SI]
037F:0100 0C00 OR AL,00
037F:0100 0D0000 OR AX,0000
037F:0100 0E PUSH CS
037F:0100 0F DB 0F
四、实验报告
把所有256条记录排列出来,并加以分析总结,形成关于8086/8088指令系统操作码编码方法的实验报告。
如前所述,8086/8088每条指令长1~6个字节,指令第1个字节为操作码主体加D位W 位,第2个字节为寻址方式字段。
在以上实验过程中,将第2~6字节全部固定为00。
实际上,除单字节指令外,其余指令在寻址方式字段变化时,指令功能应该有变化。
那么当第2字节变化时,指令功能有何不同?应该如何研究?怎样才能形成一张包含寻址方式字段的完整的指令表?请在你的实验报告中给出解决这一问题的思路。
从out3.txt 文件中可以看出8086指令集的指令操作码极规整,操作码位数不定长,而且一条指令可以有多个操作码。
将其进行分类如下:
数据传送指令
MOV,XCHG,PUSH,POP,PUSHF,POPF,PUSHA,POPA,LEA,LDS,LES XLAT(XLATB) 算术运算指令
ADD,ADC,SUB,SBB,INC,DEC,NEG,MUL,IMUL,DIV,IDIV,CBW,CWD,AAA,AAS,AAM,AAD,DAA,DAS
逻辑运算指令集
AND,OR,XOR,NOT,TEST,SHR,SHL,SAR,SAL,ROR,ROL,RCR,RCL 程程序流程控制指令
CLC,STC,CMC,CLD,STD,CLI,STI ,CMP,JMP,JXX,LOOP,LOOPE(Z),CALL,RET,INT,IRET
具体分类:
数据传送类:
037F:0100 06 PUSH ES
037F:0100 0E PUSH CS
037F:0100 16 PUSH SS
037F:0100 1E PUSH DS
037F:0100 50 PUSH AX
037F:0100 51 PUSH CX
037F:0100 52 PUSH DX
037F:0100 53 PUSH BX
037F:0100 54 PUSH SP
037F:0100 55 PUSH BP
037F:0100 56 PUSH SI
037F:0100 57 PUSH DI
037F:0100 07 POP ES
037F:0100 17 POP SS
037F:0100 1F POP DS
037F:0100 58 POP AX
037F:0100 59 POP CX
037F:0100 5A POP DX
037F:0100 5B POP BX
037F:0100 5C POP SP
037F:0100 5D POP BP
037F:0100 5E POP SI
037F:0100 5F POP DI
037F:0100 8F00 POP [BX+SI]
037F:0100 8600 XCHG AL,[BX+SI]
037F:0100 8700 XCHG AX,[BX+SI]
037F:0100 91 XCHG CX,AX
037F:0100 92 XCHG DX,AX
037F:0100 94 XCHG SP,AX
037F:0100 95 XCHG BP,AX
037F:0100 96 XCHG SI,AX
037F:0100 96 XCHG SI,AX
037F:0100 8D00 LEA AX,[BX+SI]
037F:0100 C400 LES AX,[BX+SI]
037F:0100 C500 LDS AX,[BX+SI]
037F:0100 8E00 MOV ES,[BX+SI]
037F:0100 8800 MOV [BX+SI],AL
037F:0100 8900 MOV [BX+SI],AX
037F:0100 8A00 MOV AL,[BX+SI]
037F:0100 8B00 MOV AX,[BX+SI]
037F:0100 8C00 MOV [BX+SI],ES
037F:0100 A00000 MOV AL,[0000]
037F:0100 A10000 MOV AX,[0000]
037F:0100 A20000 MOV [0000],AL
037F:0100 A30000 MOV [0000],AX
037F:0100 A4 MOV SB
037F:0100 A5 MOV SW
037F:0100 B000 MOV AL,00
037F:0100 B100 MOV CL,00
037F:0100 B200 MOV DL,00
037F:0100 B300 MOV BL,00
037F:0100 B400 MOV AH,00
037F:0100 B500 MOV CH,00
037F:0100 B600 MOV DH,00
037F:0100 B700 MOV BH,00
037F:0100 B80000 MOV AX,0000
037F:0100 B90000 MOV CX,0000
037F:0100 B90000 MOV CX,0000
037F:0100 BB0000 MOV BX,0000
037F:0100 BC0000 MOV SP,0000
037F:0100 BD0000 MOV BP,0000
037F:0100 BE0000 MOV SI,0000
037F:0100 BF0000 MOV DI,0000
037F:0100 C60000 MOV BYTE PTR [BX+SI],00 037F:0100 C7000000 MOV WORD PTR [BX+SI],0000 037F:0100 E400 IN AL,00
037F:0100 E500 IN AX,00
037F:0100 EC IN AL,DX
037F:0100 ED I N AX,DX
037F:0100 E600 OUT 00,AL
037F:0100 E700 OUT 00,AX
037F:0100 EF OUT DX,AX
算数运算类
037F:0100 0000 ADD [BX+SI],AL
037F:0100 0000 ADD [BX+SI],AL
037F:0100 0100 ADD [BX+SI],AX
037F:0100 0200 ADD AL,[BX+SI]
037F:0100 0300 ADD AX,[BX+SI]
037F:0100 0400 ADD AL,00
037F:0100 050000 ADD AX,0000
037F:0100 800000 ADD BYTE PTR [BX+SI],00 037F:0100 81000000 ADD WORD PTR [BX+SI],0000 037F:0100 820000 ADD BYTE PTR [BX+SI],00 037F:0100 830000 ADD WORD PTR [BX+SI],+00 037F:0100 1000 ADC [BX+SI],AL
037F:0100 1100 ADC [BX+SI],AX
037F:0100 1200 ADC AL,[BX+SI]
037F:0100 1300 ADC AX,[BX+SI]
037F:0100 1400 ADC AL,00
037F:0100 150000 ADC AX,0000
037F:0100 37 AAA
037F:0100 3F AAS
037F:0100 1800 SBB [BX+SI],AL
037F:0100 1900 SBB [BX+SI],AX
037F:0100 1A00 SBB AL,[BX+SI]
037F:0100 1B00 SBB AX,[BX+SI]
037F:0100 1C00 SBB AL,00
037F:0100 1D0000 SBB AX,0000
037F:0100 2800 SUB [BX+SI],AL
037F:0100 2900 SUB [BX+SI],AX
037F:0100 2A00 SUB AL,[BX+SI]
037F:0100 2B00 SUB AX,[BX+SI]
037F:0100 2C00 SUB AL,00
037F:0100 2D0000 SUB AX,0000
037F:0100 3800 CMP [BX+SI],AL
037F:0100 3900 CMP [BX+SI],AX
037F:0100 3A00 CMP AL,[BX+SI]
037F:0100 3B00 CMP AX,[BX+SI]
037F:0100 3C00 CMP AL,00
037F:0100 3D0000 CMP AX,0000
037F:0100 A6 CMP SB
037F:0100 A7 CMP SW
037F:0100 40 INC AX
037F:0100 41 INC CX
037F:0100 43 INC BX
037F:0100 42 INC DX
037F:0100 44 INC SP
037F:0100 45 INC BP
037F:0100 46 INC SI
037F:0100 47 INC DI
037F:0100 FE00 INC BYTE PTR [BX+SI] 037F:0100 FF00 INC WORD PTR [BX+SI] 037F:0100 27 DAA
037F:0100 2F DAS
037F:0100 48 DEC AX
037F:0100 49 DEC CX
037F:0100 4A DEC DX
037F:0100 4B DEC BX
037F:0100 4C DEC SP
037F:0100 4D DEC BP
037F:0100 4E DEC SI
037F:0100 4F DEC DI
037F:0100 60 DB 60
037F:0100 61 DB 61
037F:0100 62 DB 62
037F:0100 63 DB 63
037F:0100 64 DB 64
037F:0100 65 DB 65
037F:0100 66 DB 66
037F:0100 67 DB 67
037F:0100 68 DB 68
037F:0100 69 DB 69
037F:0100 6A DB 6A
037F:0100 6B DB 6B
037F:0100 6C DB 6C
037F:0100 6D DB 6D
037F:0100 6E DB 6E
037F:0100 6F DB 6F
037F:0100 C0 DB C0
037F:0100 C1 DB C1
037F:0100 C8 DB C8
037F:0100 C9 DB C9
037F:0100 D6 DB D6
037F:0100 F1 DB F1
逻辑运算类
037F:0100 0800 OR [BX+SI],AL
037F:0100 0900 OR [BX+SI],AX
037F:0100 0A00 OR AL,[BX+SI]
037F:0100 0B00 OR AX,[BX+SI]
037F:0100 0C00 OR AL,00
037F:0100 0D0000 OR AX,0000
037F:0100 2000 AND [BX+SI],AL
037F:0100 2100 AND [BX+SI],AX
037F:0100 2200 AND AL,[BX+SI]
037F:0100 2300 AND AX,[BX+SI]
037F:0100 2400 AND AL,00
037F:0100 250000 AND AX,0000
037F:0100 3000 XOR [BX+SI],AL
037F:0100 3100 XOR [BX+SI],AX
037F:0100 3200 XOR AL,[BX+SI]
037F:0100 3300 XOR AX,[BX+SI]
037F:0100 3400 XOR AL,00
037F:0100 350000 XOR AX,0000
037F:0100 D000 ROL BYTE PTR [BX+SI],1 037F:0100 D100 ROL WORD PTR [BX+SI],1 037F:0100 D200 ROL BYTE PTR [BX+SI],CL 037F:0100 D300 ROL WORD PTR [BX+SI],CL
程序控制类
037F:0100 7000 JO 0102
037F:0100 7100 JNO 0102
037F:0100 7200 JB 0102
037F:0100 7300 JNB 0102
037F:0100 7400 JZ 0102
037F:0100 7500 JNZ 0102
037F:0100 7600 JBE 0102
037F:0100 7700 JA 0102
037F:0100 7800 JS 0102
037F:0100 7900 JNS 0102
037F:0100 7A00 JPE 0102
037F:0100 7B00 JPO 0102
037F:0100 7C00 JL 0102
037F:0100 7D00 JGE 0102
037F:0100 7E00 JLE 0102
037F:0100 7F00 JG 0102
037F:0100 8400 TEST AL,[BX+SI]
037F:0100 8500 TEST AX,[BX+SI]
037F:0100 A800 TEST AL,00
037F:0100 A90000 TEST AX,0000
037F:0100 9A00000000 CALL 0000:0000
037F:0100 CC INT 3
037F:0100 CD00 INT 00
037F:0100 E000 LOOPNZ 0102
037F:0100 E100 LOOPZ 0102
037F:0100 E200 LOOP 0102
037F:0100 E300 JCXZ 0102
037F:0100 E80000 CALL 0103
037F:0100 E90000 JMP 0103
037F:0100 EA00000000 JMP 0000:0000
037F:0100 EB00 JMP 0102
037F:0100 F60000 TEST BYTE PTR [BX+SI],00
037F:0100 F7000000 TEST WORD PTR [BX+SI],0000
037F:0100 C20000 RET 0000
037F:0100 C3 RET
除单字节指令外,其余指令在寻址方式字段变化时,指令功能应该有变化。
指令的第一字节为操作码,规定指令的操作类型。
第二字节规定操作数的寻址方式接着以后的3~6 字节依据指令的不同取舍。
第一个字节的八个二进制位中前六位为操作码的主要部分,之后一位是D字段,然后是W字段,W指出操作数类型:W=0 为字节,W=1 为字;D指出操作数的传送方向:D=0 寄存器操作数为源操作数,D=1 寄存器操作数为目标操作数。
每个字节都能用4位表示,即整个操作用8位表示,即2^8=256,共256种操作,操作前表示执行操作的地址。