实验二找出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 寄存器操作数为目标操作数。
4、用DOS的输入/输出重定向功能,让debug自动执行一批命令。
三、试验内容和步骤1、用试探法(1)打开debug,输入如下内容:-e 100 00 00 00 00 00 00-u 100 1050B5D:0100 0000 ADD [BX+SI],AL0B5D:0102 0000 ADD [BX+SI],AL0B5D:0104 0000 ADD [BX+SI],AL可以得到如下结果:结论:操作码字节前六位为000000(二进制)看来是一条ADD指令,而且只占两个字节。
记下来:指令码汇编指令---------------------------------------------------------------------0B5D:0100 0000 ADD [BX+SI],AL(2)将指令首字节变为01,重复以上实验-e 100 01 00-u 100 1010B5D:0100 0100 ADD [BX+SI],AX得到以下结果:结论:第1字节由00(二进制0000 0000)变为01(二进制0000 0001),ADD指令的第二个操作数由AL变为了AX。
AL为8位寄存器、AX为16位寄存器,印证了W字段的作用,增加一条有用的记录:指令码汇编指令-------------------------------------------------------------------------0B5D:0100 0000 ADD [BX+SI],AL0B5D:0100 0100 ADD [BX+SI],AX(3)将指令首字节变为02,重复以上实验-e 100 02 00-u 100 1010B5D:0100 0200 ADD AL,[BX+SI]得到以下结果:结论:第1字节由00(二进制0000 0000)变为02(二进制0000 0010),ADD 操作的传送方向发生转变,印证了D字段的作用。
增加一条记录:指令码汇编指令------------------------------------------------------------------------0B5D:0100 0000 ADD [BX+SI],AL0B5D:0100 0100 ADD [BX+SI],AX0B5D:0100 0200 ADD AL,[BX+SI](4)将指令首字节变为03,重复以上实验-e 100 03 00-u 100 1010B5D:0100 0300 ADD AX,[BX+SI]得到以下结果:结论:D和W同时变化,记下:指令码汇编指令-----------------------------------------------------------------------0B5D:0100 0000 ADD [BX+SI],AL0B5D:0100 0100 ADD [BX+SI],AX0B5D:0100 0200 ADD AL,[BX+SI]0B5D:0100 0300 ADD AX,[BX+SI](5)同样的方法,首字节为04~0c继续实验,可以记录到以下结果:指令码汇编指令--------------------------------------------------------------------0B5D:0100 0000 ADD [BX+SI],AL0B5D:0100 0100 ADD [BX+SI],AX0B5D:0100 0200 ADD AL,[BX+SI]0B5D:0100 0300 ADD AX,[BX+SI]0B5D:0100 0400 ADD AL,000B5D:0100 050000 ADD AX,00000B5D:0100 06 PUSH ES0B5D:0100 07 POP ES0B5D:0100 0800 OR [BX+SI],AL0B5D:0100 0900 OR [BX+SI],AX0B5D:0100 0A00 OR AL,[BX+SI]0B5D:0100 0B00 OR AX,[BX+SI](6)退出-qD:\>2、用in1.txt生成out1.txt原理:用DOS的输入/输出重定向功能,让debug自动执行一批命令。
用记事本编写文件in.txt,注意存放的路径是启动和退出debug时的那个目录,为C:\ Documents and Settings\ Administrator(1)编写in1.txt在指定目录下打开记事本,输入:e100 0c 00 00 00 00 00u 100 101q(最后一行q后面要回车),保存文件为in1.txt(2)打开命令提示符窗口点击“开始->程序->附件->命令提示符”,打开命令提示符窗口,Microsoft Windows XP [版本5.1.2600](C) 版权所有1985-2001 Microsoft Corp.C:\ Documents and Settings\ Administrator(3)输入以下命令回车执行C:\ Documents and Settings\ Administrator:\>debug <in1.txt >out1.txtC:\ Documents and Settings\ Administrator:\>(4)核实out1.txt文件的内容在此目录下生成了一个out1.txt文件,内容如下:-e 100 0c 00 00 00 00 00-u 100 1010B5D:0100 0C00 OR AL,00-q(5)将out1.txt中的新操作码加入指令表。
首字节为0c的指令是一条OR指令:指令码汇编指令----------------------------------------------------------------------0B5D:0100 0000 ADD [BX+SI],AL0B5D:0100 0100 ADD [BX+SI],AX0B5D:0100 0200 ADD AL,[BX+SI]0B5D:0100 0300 ADD AX,[BX+SI]0B5D:0100 0400 ADD AL,000B5D:0100 050000 ADD AX,00000B5D:0100 06 PUSH ES0B5D:0100 07 POP ES0B5D:0100 0800 OR [BX+SI],AL0B5D:0100 0900 OR [BX+SI],AX0B5D:0100 0A00 OR AL,[BX+SI]0B5D:0100 0B00 OR AX,[BX+SI]0B5D:0100 0C00 OR AL,00(6)用以上的方法,将首字符由00依次编写到ff,共256个,然后由debug定向输出,其中输入为:e 100 10 00 00 00 00 00u 100 101e 100 11u 100 101e 100 12u 100 101e 100 13u 100 101………………e 100 26u 100 101所生成的out.txt为:-e 100 10 00 00 00 00 00-u 100 1010B5D:0100 1000 ADC [BX+SI],AL--e 100 11-u 100 1010B5D:0100 1100 ADC[BX+SI],AX--e 100 12-u 100 1010B5D:0100 1200 ADC AL,[BX+SI] --e 100 13-u 100 1010B5D:0100 1300 ADC AX,[BX+SI] --e 100 14-u 100 1010B5D:0100 1400 ADC AL,00--e 100 15-u 100 1010B5D:0100 150000 ADC AX,0000-………………-e 100 fc-u 100 1010B5D:0100 FC CLD0B5D:0101 0000 ADD [BX+SI],AL--e 100 fd-u 100 1010B5D:0100 FD STD0B5D:0101 0000 ADD [BX+SI],AL--e 100 fe-u 100 1010B5D:0100 FE00 INC BYTE PTR [BX+SI]--e 100 ff-u 100 1010B5D:0100 FF00 INC WORD PTR [BX+SI]---q结论:如前所述,8086/8088每条指令长1~6个字节,指令第1个字节为操作码主体加D位W位,第2个字节为寻址方式字段。