8086-8088指令系统
- 格式:doc
- 大小:158.07 KB
- 文档页数:13
8086 8088 汇编指令手册一、常用指令二、算术运算指令三、逻辑运算指令四、串指令五、程序跳转指令------------------------------------------计算机寄存器分类简介:32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。
对低16位数据的存取,不会影响高16位的数据。
这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。
4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。
程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。
寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
可用于乘、除、输入/输出等操作,使用频率很高;寄存器EBX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;寄存器ECX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;寄存器EDX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,在32位CPU中,其32位寄存器EAX、EBX、ECX和EDX不仅可传送数据、暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。
实验二(找出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],AL2、将指令首字节变为01,重复以上实验结论:第1字节由00(二进制0000 0000)变为01(二进制0000 0001),ADD指令的第二个操作数由AL变为了AX。
AL为8位寄存器、AX为16位寄存器,印证了W字段的作用,增加一条有用的记录:指令码汇编指令-------------------------------------------------------------------------037F:0100 0000 ADD [BX+SI],AL037F:0100 0100 ADD [BX+SI],AX3、将指令首字节变为02,重复以上实验第1字节由00(二进制0000 0000)变为02(二进制0000 0010),ADD 操作的传送方向发生转变,印证了D字段的作用。
增加一条记录:指令码汇编指令------------------------------------------------------------------------037F:0100 0000 ADD [BX+SI],AL037F:0100 0100 ADD [BX+SI],AX037F:0100 0200 ADD AL,[BX+SI]4、将指令首字节变为03,重复以上实验D和W同时变化,记下:指令码汇编指令-----------------------------------------------------------------------037F:0100 0000 ADD [BX+SI],AL037F:0100 0100 ADD [BX+SI],AX037F: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],AL037F:0100 0100 ADD [BX+SI],AX037F:0100 0200 ADD AL,[BX+SI]037F:0100 0300 ADD AX,[BX+SI]037F:0100 0400 ADD AL,00037F:0100 050000 ADD AX,0000037F:0100 06 PUSH ES037F:0100 07 POP ES2、08~0b,继续-是四条OR指令:指令码汇编指令--------------------------------------------------------------------037F:0100 0000 ADD [BX+SI],AL037F:0100 0100 ADD [BX+SI],AX037F:0100 0200 ADD AL,[BX+SI]037F:0100 0300 ADD AX,[BX+SI]037F:0100 0400 ADD AL,00037F:0100 050000 ADD AX,0000037F:0100 06 PUSH ES037F:0100 07 POP ES037F:0100 0800 OR [BX+SI],AL037F:0100 0900 OR [BX+SI],AX037F: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],AL037F:0100 0100 ADD [BX+SI],AX037F:0100 0200 ADD AL,[BX+SI]037F:0100 0300 ADD AX,[BX+SI]037F:0100 0400 ADD AL,00037F:0100 050000 ADD AX,0000037F:0100 06 PUSH ES037F:0100 07 POP ES037F:0100 0800 OR [BX+SI],AL037F:0100 0900 OR [BX+SI],AX037F:0100 0A00 OR AL,[BX+SI]037F:0100 0B00 OR AX,[BX+SI]037F:0100 0C00 OR AL,002、用in2-zsl.txt生成out2-zsl.txt(1)编写in2-zsl.txt。
(2) 在命令提示符窗口输入命令回车执行生成了out2-zsl.txt文件,内容为:这一次收获了三条新的记录:指令码汇编指令------------------------------------------------------------------037F:0100 0000 ADD [BX+SI],AL037F:0100 0100 ADD [BX+SI],AX037F:0100 0200 ADD AL,[BX+SI]037F:0100 0300 ADD AX,[BX+SI]037F:0100 0400 ADD AL,00037F:0100 050000 ADD AX,0000037F:0100 06 PUSH ES037F:0100 07 POP ES037F:0100 0800 OR [BX+SI],AL037F:0100 0900 OR [BX+SI],AX037F:0100 0A00 OR AL,[BX+SI]037F:0100 0B00 OR AX,[BX+SI]037F:0100 0C00 OR AL,00037F:0100 0D0000 OR AX,0000037F:0100 0E PUSH CS037F: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 ES037F:0100 0E PUSH CS037F:0100 16 PUSH SS037F:0100 1E PUSH DS037F:0100 50 PUSH AX037F:0100 51 PUSH CX037F:0100 52 PUSH DX037F:0100 53 PUSH BX037F:0100 54 PUSH SP037F:0100 55 PUSH BP037F:0100 56 PUSH SI037F:0100 57 PUSH DI037F:0100 07 POP ES037F:0100 17 POP SS037F:0100 1F POP DS037F:0100 58 POP AX037F:0100 59 POP CX037F:0100 5A POP DX037F:0100 5B POP BX037F:0100 5C POP SP037F:0100 5D POP BP037F:0100 5E POP SI037F:0100 5F POP DI037F:0100 8F00 POP [BX+SI]037F:0100 8600 XCHG AL,[BX+SI]037F:0100 8700 XCHG AX,[BX+SI]037F:0100 91 XCHG CX,AX037F:0100 92 XCHG DX,AX037F:0100 94 XCHG SP,AX037F:0100 95 XCHG BP,AX037F:0100 96 XCHG SI,AX037F:0100 96 XCHG SI,AX037F: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],AL037F:0100 8900 MOV [BX+SI],AX037F:0100 8A00 MOV AL,[BX+SI]037F:0100 8B00 MOV AX,[BX+SI]037F:0100 8C00 MOV [BX+SI],ES037F:0100 A00000 MOV AL,[0000]037F:0100 A10000 MOV AX,[0000]037F:0100 A20000 MOV [0000],AL037F:0100 A30000 MOV [0000],AX037F:0100 A4 MOV SB037F:0100 A5 MOV SW037F:0100 B000 MOV AL,00037F:0100 B100 MOV CL,00037F:0100 B200 MOV DL,00037F:0100 B300 MOV BL,00037F:0100 B400 MOV AH,00037F:0100 B500 MOV CH,00037F:0100 B600 MOV DH,00037F:0100 B700 MOV BH,00037F:0100 B80000 MOV AX,0000037F:0100 B90000 MOV CX,0000037F:0100 B90000 MOV CX,0000037F:0100 BB0000 MOV BX,0000037F:0100 BC0000 MOV SP,0000037F:0100 BD0000 MOV BP,0000037F:0100 BE0000 MOV SI,0000037F:0100 BF0000 MOV DI,0000037F:0100 C60000 MOV BYTE PTR [BX+SI],00 037F:0100 C7000000 MOV WORD PTR [BX+SI],0000 037F:0100 E400 IN AL,00037F:0100 E500 IN AX,00037F:0100 EC IN AL,DX037F:0100 ED I N AX,DX037F:0100 E600 OUT 00,AL037F:0100 E700 OUT 00,AX037F:0100 EF OUT DX,AX算数运算类037F:0100 0000 ADD [BX+SI],AL037F:0100 0000 ADD [BX+SI],AL037F:0100 0100 ADD [BX+SI],AX037F:0100 0200 ADD AL,[BX+SI]037F:0100 0300 ADD AX,[BX+SI]037F:0100 0400 ADD AL,00037F:0100 050000 ADD AX,0000037F: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],AL037F:0100 1100 ADC [BX+SI],AX037F:0100 1200 ADC AL,[BX+SI]037F:0100 1300 ADC AX,[BX+SI]037F:0100 1400 ADC AL,00037F:0100 150000 ADC AX,0000037F:0100 37 AAA037F:0100 3F AAS037F:0100 1800 SBB [BX+SI],AL037F:0100 1900 SBB [BX+SI],AX037F:0100 1A00 SBB AL,[BX+SI]037F:0100 1B00 SBB AX,[BX+SI]037F:0100 1C00 SBB AL,00037F:0100 1D0000 SBB AX,0000037F:0100 2800 SUB [BX+SI],AL037F:0100 2900 SUB [BX+SI],AX037F:0100 2A00 SUB AL,[BX+SI]037F:0100 2B00 SUB AX,[BX+SI]037F:0100 2C00 SUB AL,00037F:0100 2D0000 SUB AX,0000037F:0100 3800 CMP [BX+SI],AL037F:0100 3900 CMP [BX+SI],AX037F:0100 3A00 CMP AL,[BX+SI]037F:0100 3B00 CMP AX,[BX+SI]037F:0100 3C00 CMP AL,00037F:0100 3D0000 CMP AX,0000037F:0100 A6 CMP SB037F:0100 A7 CMP SW037F:0100 40 INC AX037F:0100 41 INC CX037F:0100 43 INC BX037F:0100 42 INC DX037F:0100 44 INC SP037F:0100 45 INC BP037F:0100 46 INC SI037F:0100 47 INC DI037F:0100 FE00 INC BYTE PTR [BX+SI] 037F:0100 FF00 INC WORD PTR [BX+SI] 037F:0100 27 DAA037F:0100 2F DAS037F:0100 48 DEC AX037F:0100 49 DEC CX037F:0100 4A DEC DX037F:0100 4B DEC BX037F:0100 4C DEC SP037F:0100 4D DEC BP037F:0100 4E DEC SI037F:0100 4F DEC DI037F:0100 60 DB 60037F:0100 61 DB 61037F:0100 62 DB 62037F:0100 63 DB 63037F:0100 64 DB 64037F:0100 65 DB 65037F:0100 66 DB 66037F:0100 67 DB 67037F:0100 68 DB 68037F:0100 69 DB 69037F:0100 6A DB 6A037F:0100 6B DB 6B037F:0100 6C DB 6C037F:0100 6D DB 6D037F:0100 6E DB 6E037F:0100 6F DB 6F037F:0100 C0 DB C0037F:0100 C1 DB C1037F:0100 C8 DB C8037F:0100 C9 DB C9037F:0100 D6 DB D6037F:0100 F1 DB F1逻辑运算类037F:0100 0800 OR [BX+SI],AL037F:0100 0900 OR [BX+SI],AX037F:0100 0A00 OR AL,[BX+SI]037F:0100 0B00 OR AX,[BX+SI]037F:0100 0C00 OR AL,00037F:0100 0D0000 OR AX,0000037F:0100 2000 AND [BX+SI],AL037F:0100 2100 AND [BX+SI],AX037F:0100 2200 AND AL,[BX+SI]037F:0100 2300 AND AX,[BX+SI]037F:0100 2400 AND AL,00037F:0100 250000 AND AX,0000037F:0100 3000 XOR [BX+SI],AL037F:0100 3100 XOR [BX+SI],AX037F:0100 3200 XOR AL,[BX+SI]037F:0100 3300 XOR AX,[BX+SI]037F:0100 3400 XOR AL,00037F:0100 350000 XOR AX,0000037F: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 0102037F:0100 7100 JNO 0102037F:0100 7200 JB 0102037F:0100 7300 JNB 0102037F:0100 7400 JZ 0102037F:0100 7500 JNZ 0102037F:0100 7600 JBE 0102037F:0100 7700 JA 0102037F:0100 7800 JS 0102037F:0100 7900 JNS 0102037F:0100 7A00 JPE 0102037F:0100 7B00 JPO 0102037F:0100 7C00 JL 0102037F:0100 7D00 JGE 0102037F:0100 7E00 JLE 0102037F:0100 7F00 JG 0102037F:0100 8400 TEST AL,[BX+SI]037F:0100 8500 TEST AX,[BX+SI]037F:0100 A800 TEST AL,00037F:0100 A90000 TEST AX,0000037F:0100 9A00000000 CALL 0000:0000037F:0100 CC INT 3037F:0100 CD00 INT 00037F:0100 E000 LOOPNZ 0102037F:0100 E100 LOOPZ 0102037F:0100 E200 LOOP 0102037F:0100 E300 JCXZ 0102037F:0100 E80000 CALL 0103037F:0100 E90000 JMP 0103037F:0100 EA00000000 JMP 0000:0000037F:0100 EB00 JMP 0102037F:0100 F60000 TEST BYTE PTR [BX+SI],00037F:0100 F7000000 TEST WORD PTR [BX+SI],0000037F:0100 C20000 RET 0000037F:0100 C3 RET除单字节指令外,其余指令在寻址方式字段变化时,指令功能应该有变化。