机组实验二报告—找出8086 8088指令系统所有指令的操作码的编码
- 格式:doc
- 大小:266.50 KB
- 文档页数:9
编码16位模式32位模式操作)000AX EAX AL001CX ECX CL010DX EDX DL011BX EBX BL100SP ESP AH101BP EBP CH110SI ESI DH111DI EDI BHR/M字段受MOD字段控制。
若MOD=11,为寄存器方式,R/M字段将指出第二操作数所在寄存器编号。
MOD=00,01,10为存储器方式,R/M则指出如何计算存储器中操作数地址。
MOD与R/M字段组合的寻址方式见表3。
表3 各种MOD与R/M字段组合编码及有关地址的计算(16位地址模式下)MOD=11寄存器寻址MOD≠11存储寻址、有效地址的计算公式R/M W=1W=0R/M不带位移l量MOD=00带8位位移量MOD=01带16位位移量MOD=10 000AX AL000[BX+SI][BX+SI+D8][BX+SI+D16]001CX CL001[BX+DI][BX+DI+D8][BX+SI+D16]010DX DL010[BP+SI][BP+SI+D8][BP+SI+D16]011BX BL011[BP+DI][BP+DI+D8][BP+DI+D16]100SP AH100[SI][SI+D8][SI+D16]101BP CH101[DI][DI+D8][DI+D16]110SI DH110(直接寻址)[BP+D8][BP+D16]111DI BH111[BX][BX+D8][BX+D16]例如:指令MOV AH,[BX+DI+50H]。
代码格式如下。
OPCODE D W MOD REG R/M DISP—8100010 1 0 01 100 001 01010000指令码:8A6150H。
指令ADD DISP [BX] [DI],DX;DISP=4523H代码格式:OPCODE D W MOD REG R/M DISP—Lo DISP—Hi000000 0 1 10 010 001 00100011 01000101指令码为:01 91 23 45H。
实验二找出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字段的作用。
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指令码汇总表8086指令有汇编语言指令和指令码两种形式,汇编语言指令形式经过汇编程序处理后生成指令码形式。
通过指令码形式可帮助理解汇编语言指令格式的含义和用法。
O、8086指令码格式0B/1B 1B或2B 0B/1B 0B/1B/2B/4B 0B/1B/2B/4B 指令前缀操作码段寻址方式段偏移量参数立即数参数说明:偏移量参数和立即数参数的有无由寻址方式段决定。
一、传送类指令MOV指令REG/MEM→/←REG 100010dw mod reg r/mIMME→REG/MEM 1000111w mod 000 r/m data data if w=1 IMME→REG 1011wreg data data if w=1MEM→AX 1010000w addr-low addr-highAX→MEM 1010001w addr-low addr-highREG/MEM→段REG 10001110 mod reg r/m 8E段REG→REG/MEM 10001100 mod reg r/m 8CPUSH指令REG/MEM 11111111 mod 110 r/m FFREG 01010reg段REG 000reg110POP指令REG/MEM 10001111 mod 000 r/m 8FREG 01011reg段REG 000reg111XCHG指令REG/MEM←→REG 1000011w mod reg r/mREG←→AX 10010regXLAT指令11010111 D7LEA指令10001101 mod reg r/m 8DLDS指令11000101 mod reg r/m C5LES指令11000100 mod reg r/m C4LAHF指令10011111 9FSAHF指令10011110 9EPUSHF指令10011100 9CPOPF指令10011101 9DIN指令直接寻址1110010w port间接寻址1110110wOUT指令直接寻址1110011w port间接寻址1110111wCBW指令10011000 98CWD指令10011001 99 说明:d—0/1表示REG为源/目的操作数;w—0/1表示操作数类型为BYTE/WORD;mod、r/m—寻址方式,参见教材P56~57;IMME—立即数操作数,字段中用data表示;reg—通用REG用3位编码,段REG只用2位编码(即为0xx)。
8086 8088寻址方式和指令系统28086/8088的指令集可分为如下六个功能组:1、数据传送;2、算术运算;3、逻辑运算;4、串操作;5、程序控制;6、处理器控制。
指令表示格式:在汇编语言中,指令语句可由四部分组成,一般格式如下:[标号]指令助记符[操作数1][,操作数2][;注释]。
对于每条指令程序员要注意:1、指令的功能;2、适用于指令的操作数寻址方式;3、指令对标志的影响;4、指令的长度和执行时间。
1、数据传送指令:又可分为传送指令、交换指令、地址传送指令、堆栈操作指令、标志传送指令、查表指令、输入输出指令。
一、传送指令:格式如下:MOV DST,SRC。
指令把一个字节活一个字从远操作数SRC送至目的操作数DST。
MOV指令可实现的传送方式如下图所示:二、交换指令:利用交换指令可方便地实现通用寄存器与通用寄存器或存储单元的数据交换,交换指令的格式如下:XCHG OPRD1,OPRD2.此指令把OPRD1和OPRD2的内容交换,操作数同时是字节或字。
OPRD1和OPRD2可以是通用寄存器活存储单元,但不包括段寄存器,也不能同时是存储单元,还不能有立即数。
三、地址传送指令:8086/8088有如下三条地址传送指令。
(1)LEA:称为spss有效弟弟指令,指令格式:LEA REG,OPRD。
该指令把操作数OPRD的有效地址传送到操作数REG。
OPRD必须是一个存储器操作数,REG必须是一个16位的通用寄存器。
(2)LDS:该指令传送32位地址指针,格式:LDS REG,OPRD。
该指令把操作数OPRD中所含的32位地址指针段值部分送到数据段寄存器DS,把偏移部分送到给出的通用寄存器REG。
(3)LES:该指令传送32位地址指针,格式:LES REG,OPRD。
该指令把操作数OPRD中所含的32位地址指针段值部分送到数据段寄存器ES,把偏移部分送到给出的通用寄存器REG。
2、堆栈操作指令:堆栈是一段RAM区域,栈底地址较大,栈顶地址叫小。
实验二找出8086/8088指令系统所有指令的操作码的编码实验目的:本实验旨在利用debug工具的e和u功能找出8086/8088指令系统的指令格式中各种操作码编码对应的指令功能,得到8086/8088操作码从00~FF所对应的汇编指令名字。
附:本次实验用到的e和u功能的解释:debug的e命令、u命令的作用及用法:e 100...表示从100号单元开始编写内容;u 100 105表示将100~105号单元共6个字节反汇编出来、所谓“反汇编”就是把机器码还原成汇编语句。
每次先用e命令改写100号单元(从00到FF,第一次是00,第二次是 01,第三次是02,第四次是03,……,最后一次是FF),再用u命令反汇编出指令,再记录下来。
第一回合实验步骤:一、启动debug程序:鼠标单击“开始->程序->附件->命令提示符”,打开DOS(其实虚拟DOS)窗口,出现命令提示符Microsoft Windows XP [版本5.1.2600]<C>版权所有1985-2001 Microsoft Corp.输入debug并按回车键,出现一个debug程序的提示符,一个短杆如下图所示:二、用试探法-e 100 00 00 00 00 00 00-u 100 1051375:0100 0000 ADD [BX+SI],AL1375:0102 0000 ADD [BX+SI],AL1375:0104 0000 ADD [BX+SI],AL结论:操作码字节前六位为000000(二进制)看来是一条ADD指令,而且只占两个字节。
记下来:指令码汇编指令---------------------------------------------------------------------1375:0100 0000 ADD [BX+SI],AL分析:指令的第一字节为操作码,规定指令的操作类型。
第一个字节的八个二进制位中前六位为操作码的主要部分,之后一位是D字段,然后是W字段。
W指出操作数类型:W=0 为字节,W=1 为字,D指出操作数的传送方向:D=0 寄存器操作数为源操作数,D=1 寄存器操作数为目标操作数。
在上述指令中,可知第一个字节的八位分别是0000 0000,D和W均为0,即寄存器操作数为源操作数,由反汇编结果可以看出汇编指令为[BX+SI],AL,表示[BX+SI]<—[BX+SI]+AL,寄存器为AL,正是源操作数。
这是第一条指令的功能。
三、将指令首字节变为01,重复以上实验-e 100 01 00-u 100 1011375:0100 0100 ADD [BX+SI],AX结论:第1字节由00(二进制0000 0000)变为01(二进制0000 0001),ADD 指令的第二个操作数由AL变为了AX。
AL为8位寄存器、AX为16位寄存器,印证了W字段的作用,增加一条有用的记录:指令码汇编指令-------------------------------------------------------------------------1375:0100 0000 ADD [BX+SI],AL1375:0100 0100 ADD [BX+SI],AX分析:第二条指令的第一个字节由00变为了01,二进制即是0000 0001,w变为1,单位变为了字即是2个字节,所以ADD指令的第二个操作数才由AL变为了AX,印证了W字段的作用。
而操作数的传送方向和第一条指令相同。
四、将指令首字节变为02,重复以上实验-e 100 02 00-u 100 1011375:0100 0200 ADD AL,[BX+SI]分析:第1字节由00(二进制0000 0000)变为02(二进制0000 0010),ADD 操作的传送方向发生转变,印证了D字段的作用。
AL,[BX+SI]代表的意思是AL<—AL+[BX+SI],即是操作数的传送方向是寄存器操作数为目标操作数,结果存到AL寄存器中。
增加一条新记录:指令码汇编指令------------------------------------------------------------------------1375:0100 0000 ADD [BX+SI],AL1375:0100 0100 ADD [BX+SI],AX1375:0100 0200 ADD AL,[BX+SI]再来,变为03,继续重复实验:-e 100 03 00-u 100 1011375:0100 0300 ADD AX,[BX+SI]分析:D和W同时变化,可看出操作数类型和传送方向均发生变化,寄存器由8位的AL变为16位的AX寄存器,传送方向变为目标寄存器。
记下:指令码汇编指令-----------------------------------------------------------------------1375:0100 0000 ADD [BX+SI],AL1375:0100 0100 ADD [BX+SI],AX1375:0100 0200 ADD AL,[BX+SI]1375:0100 0300 ADD AX,[BX+SI]第一回合实验结果如下图所示:分析:由实验条件可知:指令码均为16进制数,即是两位代表一个字节,其中1375:0100代表偏移地址,再后面的两位代表第一个字节。
第一回合的指令变化是前六位均为0,没有变化,变化的是D与W的值,每次分别变化一个值,从00到01再到10再到11,从而表明了D和W的功能,易于理解,D和W的功能在上面每条指令的分析中均有提到。
第二回合一、首字节为04~07,继续实验-e 100 04 00 00 00 00 00-u 100 1051375:0100 0400 ADD AL,001375:0102 0000 ADD [BX+SI],AL1375:0104 0000 ADD [BX+SI],AL-e 100 05 00-u 100 1011375:0100 050000 ADD AX,0000-e 100 06-u 100 1011375:0100 06 PUSH ES13751375:0101 0000 ADD [BX+SI],AL-e 100 07-u 100 1011375:0100 07 POP ES1375:0101 0000 ADD [BX+SI],AL-得到四条新的记录,出现了第1个3字节指令050000(ADD AX,0000),还捕获了两条新的单字节指令:指令码汇编指令----------------------------------------------------------------------1375:0100 0000 ADD [BX+SI],AL1375:0100 0100 ADD [BX+SI],AX1375:0100 0200 ADD AL,[BX+SI]1375:0100 0300 ADD AX,[BX+SI]1375:0100 0400 ADD AL,001375:0100 050000 ADD AX,00001375:0100 06 PUSH ES1375:0100 07 POP ES分析:在从04(0000 0100)到07(0000 0111)的过程中,前六位发生了变化,即是操作类型发生了变化,而且到05时,出现了第一个3字节指令,05(0000 0101)W为1(字),故出现了三字节指令。
而且还出现了两个单字节指令,分别是入栈和出栈指令。
二、08~0b,继续-e100 08 00 00 00 00 00-u 100 1011375:0100 0800 OR [BX+SI],AL-e 100 09-u 100 1011375:0100 0900 OR [BX+SI],AX-e 100 0a-u 100 1011375:0100 0A00 OR AL,[BX+SI]-e 100 0b-u 100 1011375:0100 0B00 OR AX,[BX+SI]-是四条OR指令:指令码汇编指令--------------------------------------------------------------------1375:0100 0000 ADD [BX+SI],AL1375:0100 0100 ADD [BX+SI],AX1375:0100 0200 ADD AL,[BX+SI]1375:0100 0300 ADD AX,[BX+SI]1375:0100 0400 ADD AL,001375:0100 050000 ADD AX,00001375:0100 06 PUSH ES1375:0100 07 POP ES1375:0100 0800 OR [BX+SI],AL1375:0100 0900 OR [BX+SI],AX1375:0100 0A00 OR AL,[BX+SI]1375:0100 0B00 OR AX,[BX+SI]三、退出-qD:\>分析:然后从08(0000 1000)到0b(0000 1011)则出现了OR指令,即是首字节的前六位0000 10表示操作类型为OR指令,后面D和W的变化与前面的分析一样。
由于这样操作过于慢,下面采用新的方法进行操作:第三回合用文件批命令代替手工操作先用一个短的进行实验:一、用in1.txt生成out1.txt原理:用DOS的输入/输出重定向功能,让debug自动执行一批命令。
小于号(<)之后的文件名(in1.txt)表示debug命令的所有输入来自该文件(而原先它的输入是来自键盘);大于号(>)之后的文件名(out1.txt)表示debug命令的所有输出内容写入该文件(而原先这些输出是写到显示器)。
编写文件in.txt,内容如下,可以用记事本,注意存放的路径是你启动和退出debug 时的那个目录。
1、编写in1.txt先写一个短的试试看,点击“开始->程序->附件->记事本”,打开记事本,输入:e100 0c 00 00 00 00 00u 100 101q注意:最后一行q后面要回车,保存文件为C:\Documents and Settings\Administrator\in1.txt2、打开命令提示符窗口点击“开始->程序->附件->命令提示符”,打开命令提示符窗口,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 1010AE9:0100 0C00 OR AL,00-q5、将out1.txt中的新操作码加入指令表。