实验报告——找出80868088指令系统所有指令的操作码的编码
- 格式:doc
- 大小:389.50 KB
- 文档页数:8
第三章80868088指令系统机器语言指令由二进制代码组成。
一条指令一般包含操作码(OP )和操作数两部分,操作码指明指令所完成的操作,操作数指出该指令在执行规定操作时所需的信息。
指令中用于说明操作数(一般指源操作数)所在地址的方式被称为寻址方式。
(8086的寻址方式分两类:数据寻址方式和转移地址的寻址方式)3.2.1数据寻址方式 P51 1.立即寻址:数据是8位或16位,直接放在指令的最后一个(8位)或两个字节(16位)中,这样的数据称为立即数。
MOV AL ,80HADD AX ,0F000HMOV AX ,1234HADD AL ,10H操作码字节AX操作数字节操作码字节操作数(a )MOV AL , 80H(b )MOV AX , 1234H图3-2 立即寻址方式指令举例 P522. 寄存器寻址:数据存放在指令规定的寄存器中。
MOV CL ,DL MOV AX ,BX注意:在双操作数指令中源操作数寻址方式和目的操作数寻址方式。
CL DL AXAL AHBL BH (a )MOV CL , DL (b )MOV AX , BX图3-3 寄存器寻址方式指令举例 P523. 直接寻址:操作数在存储器中,其16位有效地址,即段内偏移地址在指令码中,占两个字节。
MOV AL ,[1064H] ;设(DS )=2000HADD AX ,[2000H]代码段操作数偏移地址数据段图3-4 直接寻址方式指令举例 P53操作数数据4. 寄存器间接寻址:操作数在存储器中,其16位有效地址EA 在指令指定的基址寄存器BX 或变址寄存器SI 、DI 中。
BX EA = SIDI 注意:新教材中有BP 【例】 MOV AX ,[SI] MOV [BX] , AL 如果:(DS )=3000H ,(SI )=2000H ,(BX )=1000H,(AL )=64H注意:默认段地址寄存器为DS 以上为二字节指令;MOV AX,[BP]为三字节指令;实为指令MOV AX ,[BP+0]的简写!图3-5 寄存器间接寻址方式指令举例 P535. 寄存器相对寻址:操作数在存储器中,其效地址是一个8位或16位的位移量与一个基址寄存器或变址寄存器的内容之和。
实验时间: 2016 年 4月 27 日实验成绩评定:姓名:侯珍珍学号:2014310685实验三 8086/8088常用指令使用实验目的:通过实验掌握下列知识:1、8086/8088指令: MOV,ADD,ADC,SUB,SBB,DAA,XCHG2、DEBUG命令: A,D,E,F,H,R,T,U。
3、BCD码,ASCII码及用16进制数表示二进制码的方法。
4、8086/8088寄存器: AX,BX,CX,DX,FLAGS,IP。
内容及步骤:一、DEBUG 命令使用:1、打 DEBUG 进入 DEBUG 控制,显示提示符 '- '。
2、用命令 F100 10F 'A' 将'A'的ASCII码填入内存。
3、用命令 D100 10F 观察内存中的16进制码及屏幕右边的ASCII字符。
观察结果:4、用命令 F110 11F 41 重复上二项实验,观察结果并比较。
观察结果:5、用命令 E100 30 31 32 …… 3F将30H-3FH写入地址为100开始的内存单元中,再用D命令观察结果,看键入的16进制数是什么字符的ASCII码?观察结果:6、用H命令检查下列各组16进制数加减结果并和你的手算结果比较: (1)34H,22H (2)56H,78H (3) A5,79H (4)1284H,5678H (5) A758,347FH手算结果:34H+22H=56H 34H-22H=12H56H+78H=CEH 56H-78H==FFDEHA5H+79h=11EH a5H-79H=2CH1284H+5678H=68FCH 1284H-5678H=BC0CHA758H+347FH=DBD7H A758H-347FH=72D9H7、用R 命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF的内容。
8、用R命令将AX,BX内容改写为1050H及23A8H。
编码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指令系统的指令格式中各种操作码编码对应的指令功能,得到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分析:指令的第一字节为操作码,规定指令的操作类型。
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 指令码格式我们用汇编语言写的汇编程序输入计算机后,由机器提供的汇编程序将其翻译成由机器指令(指令码)组成的机器语言程序,才能由计算机识别并执行,因此汇编语言程序需由汇编程序翻译成可执行的机器语言程序,一般来说,这一过程不需要人为干预。
我们在这里只介绍一下基本原理,以便在必要时也可以用手工的方式完成类似的工作。
8086/8088 指令系统的指令程序类型很多,功能很强,各种指令由于功能不同,需要指令码提供的信息也不同。
为了满足不同用户的功能的要求又要减少指令所占的空间,8086/8088 指令系统采用了一种灵活的,由1~6 个字节组成的变字长的指令格式,包括操作码、寻址方式以及操作数3 部分,如图2所示。
通常指令的第一字节为操作码,规定指令的操作类型。
第二字节规定操作数的寻址方式接着以后的3~6 字节依据指令的不同取舍。
可变字长的指令主要体现在这里,一般由其指出存储器操作数地址位移量或立即数。
操作码(第一字节)及寻址方式字节(MOD字段)格式如下。
图1 8086/8088操作码及寻址方式字段格式第一字节中,W 指出操作数类型:W=0 为字节,W=1 为字。
D 指出操作数的传送方向:D=0 寄存器操作数为源操作数,D=1 寄存器操作数为目标操作数。
第二字节指出所用的两个操作数存放的位置,以及存储器中操作数有效地址EA 的计算方法。
图2 8086/8088 不同字长的指令码格式REG 字段规定一个寄存器操作数,它作为源操作数还是目标操作数已由第一个字节中的D 位规定。
由REG 字段选择寄存器的具体规定见表1。
表1 REG 字段编码表MOD 字段用来区分另一个操作数在寄存器中(寄存器寻址)还是在存储器中(存储器寻址)。
在存储器寻址的情况下,还用来指出该字节后面有多少偏移量字节(即指出存储器操作数地址偏移量的字节数)。
MOD 字段编码表见表2。
表2 MOD 字段编码表R/M 字段受MOD 字段将指出第二操作数所在寄存器编号。
8086指令集的操作码-回复8086指令集的操作码(Opcode)在计算机科学领域,指令集是计算机体系结构的基础架构之一。
它定义了计算机处理器支持的指令集合,以及每个指令的操作码(Opcode)。
操作码是指令的独特标识符,用于指示计算机执行特定操作的类型和参数。
本文将详细介绍8086指令集的操作码,以及如何将操作码转换为计算机可以执行的实际指令。
8086指令集是英特尔公司于1978年推出的一种16位微处理器的指令集。
它被广泛应用于早期的个人计算机,并为今天x86体系结构的基础奠定了基础。
8086指令集的操作码由不同的位字段组成,每个字段都有其特定的含义和用途。
下面是8086指令集操作码的基本组成:1. 操作码字段(Opcode field):这是操作码的核心部分,用于标识指令的类型和操作。
例如,MOV指令(用于数据传输)的操作码为"100010dw",其中"d"和"w"分别表示目的操作数和源操作数的位数。
2. 前缀字段(Prefix field):有些指令可能需要前缀来修改其行为或指示其他操作。
例如,REPE前缀用于重复执行字符串操作,POP CS前缀用于弹出代码段寄存器。
前缀字段通常位于操作码字段之前。
3. 模式字段(Mode field):这个字段用于指示指令的操作模式,例如实模式(Real mode)或保护模式(Protected mode)。
不同的模式可能会导致不同的操作码。
4. 地址模式字段(Addressing mode field):这个字段用于指示指令的地址寻址模式,即内存中操作数的位置。
常见的寻址模式包括寄存器直接寻址、立即寻址和间接寻址。
操作码的长度因指令而异,可以是1字节、2字节或3字节。
8086指令集的操作码使用不同位字段的组合来表示不同的操作和操作数。
为了解析操作码,我们需要详细了解连接每个位字段的规则和含义,并了解如何将操作码转换为机器可以执行的实际指令。
8086指令集的操作码8086指令集的操作码,指的是英特尔8086微处理器所支持的一系列指令的二进制表示。
这些操作码由不同的位字段组成,每个位字段代表不同的指令功能或参数,通过编码的方式告知处理器要执行的具体操作。
本文将以中括号内的主题为主线,分步介绍8086指令集的操作码,帮助读者了解其结构和功能。
第一步,我们先了解8086指令集的基本结构。
8086指令集主要由操作码、操作数和寄存器组成。
操作码用于表示指令的类型和功能,操作数用于指定指令要操作的数据,而寄存器则用于存储指令过程中的临时数据。
操作码是指令集的核心部分,它决定了处理器要进行的具体操作。
第二步,我们详细分析操作码的结构。
8086指令集的操作码通常由一个或多个字节组成,不同指令的操作码长度各不相同。
每个操作码由若干位字段组成,不同位字段表示不同的含义。
下面是8086指令集常见操作码的一些位字段及其含义:1. 操作码前缀:有些指令的操作码以一个或多个字节作为前缀,用于修改指令的默认行为。
例如,0x66前缀用于指示指令使用16位操作数而不是默认的8位操作数。
2. 操作码码头:通常由几个位字段组成,用于表示指令的类型和功能。
不同的码头表示不同的指令类型,例如,00开头的指令码用于表示数据传输指令,8x开头的指令码用于表示算术和逻辑操作等。
3. 操作数字段:一些指令的操作码中包含指定操作数的字段。
例如,寄存器操作数字段用于指定寄存器编号,内存操作数字段用于指定内存地址,立即数操作数字段用于指定一个常数等。
4. 模式字段:一些指令的操作码中包含用于指定指令执行模式的字段。
例如,寻址模式字段用于指定内存操作数的寻址方式,寄存器模式字段用于指示指令使用哪些寄存器。
5. 功能字段:一些指令的操作码中包含用于指定指令所执行的具体功能的字段。
例如,ALU操作码字段用于指定逻辑或算术操作的类型,位移操作码字段用于指定位移操作的方向和位数等。
第三步,我们了解如何使用操作码来编写8086汇编指令。
HUNAN UNIVERSITY 课程实习报告题目: 8086/8088指令系统学生姓名学生学号专业班级计算机科学与技术2班指导老师完成日期2013年4月21日一、实验目的利用debug工具的e和u功能找出8086/8088指令系统的指令格式中各种操作吗编码对应的指令功能,得到8086/8088操作吗从00~FF所对应的的汇编指令的名字。
并加以分析总结,形成你的关于8086/8088指令系统操作码编码方法的实验报告。
二、实验过程1、编写C++程序,生成debug的输入文件(shuru.txt)2、将shuru.txt复制到debug的根目录下,在debug界面输入如下指令“debug <shuru.txt >out.txt”,在debug的根目录下,生成了输出文本文件out.txt。
打开out.txt,对256条记录进行整理,如下所示。
3、固定前两位为00,将第二字节从00变为ff,观察汇编指令变化。
编写C++程序如下:4、将shuru2.txt复制到debug的根目录下,在debug界面输入如下指令“debug <shuru.txt >out2.txt”,在debug的根目录下,生成了输出文本文件out2.txt。
打开out2.txt,对256条记录进行分析。
三、256条记录指令码汇编指令------------------------------------------------------------- 0B76:0100 0000 ADD [BX+SI],AL0B76:0100 0100 ADD [BX+SI],AX0B76:0100 0200 ADD AL,[BX+SI]0B76:0100 0300 ADD AX,[BX+SI]0B76:0100 0400 ADD AL,000B76:0100 050000 ADD AX,00000B76:0100 06 PUSH ES0B76:0100 07 POP ES0B76:0100 0800 OR [BX+SI],AL0B76:0100 0900 OR [BX+SI],AX0B76:0100 0A00 OR AL,[BX+SI]0B76:0100 0B00 OR AX,[BX+SI]0B76:0100 0C00 OR AL,000B76:0100 0D0000 OR AX,00000B76:0100 0E PUSH CS0B76:0100 0F DB 0F0B76:0100 1000 ADC [BX+SI],AL0B76:0100 1100 ADC [BX+SI],AX0B76:0100 1200 ADC AL,[BX+SI]0B76:0100 1300 ADC AX,[BX+SI]0B76:0100 1400 ADC AL,000B76:0100 150000 ADC AX,00000B76:0100 16 PUSH SS0B76:0100 17 POP SS0B76:0100 1800 SBB [BX+SI],AL0B76:0100 1900 SBB [BX+SI],AX0B76:0100 1A00 SBB AL,[BX+SI]0B76:0100 1B00 SBB AX,[BX+SI]0B76:0100 1C00 SBB AL,000B76:0100 1D0000 SBB AX,00000B76:0100 1E PUSH DS0B76:0100 1F POP DS0B76:0100 2000 AND [BX+SI],AL0B76:0100 2100 AND [BX+SI],AX0B76:0100 2200 AND AL,[BX+SI]0B76:0100 2300 AND AX,[BX+SI]0B76:0100 2400 AND AL,000B76:0100 250000 AND AX,00000B76:0100 26 ES:0B76:0100 27 DAA0B76:0100 2800 SUB [BX+SI],AL 0B76:0100 2900 SUB [BX+SI],AX 0B76:0100 2A00 SUB AL,[BX+SI] 0B76:0100 2B00 SUB AX,[BX+SI] 0B76:0100 2C00 SUB AL,000B76:0100 2D0000 SUB AX,00000B76:0100 2E CS:0B76:0100 2F DAS0B76:0100 3000 XOR [BX+SI],AL 0B76:0100 3100 XOR [BX+SI],AX 0B76:0100 3200 XOR AL,[BX+SI] 0B76:0100 3300 XOR AX,[BX+SI] 0B76:0100 3400 XOR AL,000B76:0100 350000 XOR AX,00000B76:0100 36 SS:0B76:0100 37 AAA0B76:0100 3800 CMP [BX+SI],AL 0B76:0100 3900 CMP [BX+SI],AX 0B76:0100 3A00 CMP AL,[BX+SI] 0B76:0100 3B00 CMP AX,[BX+SI] 0B76:0100 3C00 CMP AL,000B76:0100 3D0000 CMP AX,00000B76:0100 3E DS:0B76:0100 3F AAS0B76:0100 40 INC AX0B76:0100 41 INC CX0B76:0100 42 INC DX0B76:0100 43 INC BX0B76:0100 44 INC SP0B76:0100 45 INC BP0B76:0100 46 INC SI0B76:0100 47 INC DI0B76:0100 48 DEC AX0B76:0100 49 DEC CX0B76:0100 4A DEC DX0B76:0100 4B DEC BX0B76:0100 4C DEC SP0B76:0100 4D DEC BP0B76:0100 4E DEC SI0B76:0100 4F DEC DI0B76:0100 50 PUSH AX0B76:0100 51 PUSH CX0B76:0100 52 PUSH DX 0B76:0100 53 PUSH BX 0B76:0100 54 PUSH SP0B76:0100 55 PUSH BP0B76:0100 56 PUSH SI0B76:0100 57 PUSH DI0B76:0100 58 POP AX 0B76:0100 59 POP CX 0B76:0100 5A POP DX 0B76:0100 5B POP BX 0B76:0100 5C POP SP0B76:0100 5D POP BP0B76:0100 5E POP SI0B76:0100 5F POP DI0B76:0100 60 DB 600B76:0100 61 DB 610B76:0100 62 DB 620B76:0100 63 DB 630B76:0100 64 DB 640B76:0100 65 DB 650B76:0100 66 DB 660B76:0100 67 DB 670B76:0100 68 DB 680B76:0100 69 DB 690B76:0100 6A DB 6A0B76:0100 6B DB 6B0B76:0100 6C DB 6C0B76:0100 6D DB 6D0B76:0100 6E DB 6E0B76:0100 6F DB 6F0B76:0100 7000 JO 01020B76:0100 7100 JNO 0102 0B76:0100 7200 JB 01020B76:0100 7300 JNB 0102 0B76:0100 7400 JZ 01020B76:0100 7500 JNZ 0102 0B76:0100 7600 JBE 0102 0B76:0100 7700 JA 01020B76:0100 7800 JS 01020B76:0100 7900 JNS 0102 0B76:0100 7A00 JPE 0102 0B76:0100 7B00 JPO 0102 0B76:0100 7C00 JL 01020B76:0100 7D00 JGE 01020B76:0100 7E00 JLE 01020B76:0100 7F00 JG 01020B76:0100 800000 ADD BYTE PTR [BX+SI],000B76:0100 81000000 ADD WORD PTR [BX+SI],0000 0B76:0100 820000 ADD BYTE PTR [BX+SI],000B76:0100 830000 ADD WORD PTR [BX+SI],+00 0B76:0100 8400 TEST AL,[BX+SI]0B76:0100 8500 TEST AX,[BX+SI]0B76:0100 8600 XCHG AL,[BX+SI]0B76:0100 8700 XCHG AX,[BX+SI]0B76:0100 8800 MOV [BX+SI],AL0B76:0100 8900 MOV [BX+SI],AX0B76:0100 8A00 MOV AL,[BX+SI]0B76:0100 8B00 MOV AX,[BX+SI]0B76:0100 8C00 MOV [BX+SI],ES0B76:0100 8D00 LEA AX,[BX+SI]0B76:0100 8E00 MOV ES,[BX+SI]0B76:0100 8F00 POP [BX+SI]0B76:0100 90 NOP0B76:0100 91 XCHG CX,AX0B76:0100 92 XCHG DX,AX0B76:0100 93 XCHG BX,AX0B76:0100 94 XCHG SP,AX0B76:0100 95 XCHG BP,AX0B76:0100 96 XCHG SI,AX0B76:0100 97 XCHG DI,AX0B76:0100 98 CBW0B76:0100 99 CWD0B76:0100 9A00000000 CALL 0000:00000B76:0100 9B WAIT0B76:0100 9C PUSHF0B76:0100 9D POPF0B76:0100 9E SAHF0B76:0100 9F LAHF0B76:0100 A00000 MOV AL,[0000]0B76:0100 A10000 MOV AX,[0000]0B76:0100 A20000 MOV [0000],AL0B76:0100 A30000 MOV [0000],AX0B76:0100 A4 MOVSB0B76:0100 A5 MOVSW0B76:0100 A6 CMPSB0B76:0100 A7 CMPSW0B76:0100 A800 TEST AL,000B76:0100 A90000 TEST AX,00000B76:0100 AA STOSB0B76:0100 AB STOSW0B76:0100 AC LODSB0B76:0100 AD LODSW0B76:0100 AE SCASB0B76:0100 AF SCASW0B76:0100 B000 MOV AL,000B76:0100 B100 MOV CL,000B76:0100 B200 MOV DL,000B76:0100 B300 MOV BL,000B76:0100 B400 MOV AH,000B76:0100 B500 MOV CH,000B76:0100 B600 MOV DH,000B76:0100 B700 MOV BH,000B76:0100 B80000 MOV AX,00000B76:0100 B90000 MOV CX,00000B76:0100 BA0000 MOV DX,00000B76:0100 BB0000 MOV BX,00000B76:0100 BC0000 MOV SP,00000B76:0100 BD0000 MOV BP,00000B76:0100 BE0000 MOV SI,00000B76:0100 BF0000 MOV DI,00000B76:0100 C0 DB C00B76:0100 C1 DB C10B76:0100 C20000 RET 00000B76:0100 C3 RET0B76:0100 C400 LES AX,[BX+SI]0B76:0100 C500 LDS AX,[BX+SI]0B76:0100 C60000 MOV BYTE PTR [BX+SI],000B76:0100 C7000000 MOV WORD PTR [BX+SI],0000 0B76:0100 C8 DB C80B76:0100 C9 DB C90B76:0100 CA0000 RETF 00000B76:0100 CB RETF0B76:0100 CC INT 30B76:0100 CD00 INT 000B76:0100 CE INTO0B76:0100 CF IRET0B76:0100 D000 ROL BYTE PTR [BX+SI],10B76:0100 D100 ROL WORD PTR [BX+SI],10B76:0100 D200 ROL BYTE PTR [BX+SI],CL0B76:0100 D300 ROL WORD PTR [BX+SI],CL0B76:0100 D400 AAM 000B76:0100 D500 AAD 000B76:0100 D6 DB D60B76:0100 D7 XLAT0B76:0100 D800 FADD DWORD PTR [BX+SI] 0B76:0100 D900 FLD DWORD PTR [BX+SI]0B76:0100 DA00 FIADD DWORD PTR [BX+SI] 0B76:0100 DB00 FILD D WORD PTR [BX+SI]0B76:0100 DC00 FADD QWORD PTR [BX+SI] 0B76:0100 DD00 FLD QWORD PTR [BX+SI]0B76:0100 DE00 FIADD WORD PTR [BX+SI] 0B76:0100 DF00 FILD W ORD PTR [BX+SI]0B76:0100 E000 LOOPNZ 01020B76:0100 E100 LOOPZ 01020B76:0100 E200 LOOP 01020B76:0100 E300 JCXZ 01020B76:0100 E400 IN AL,000B76:0100 E500 IN AX,000B76:0100 E600 OUT 00,AL0B76:0100 E700 OUT 00,AX0B76:0100 E80000 CALL 01030B76:0100 E90000 JMP 01030B76:0100 EA00000000 JMP 0000:00000B76:0100 EB00 JMP 01020B76:0100 EC IN AL,DX0B76:0100 ED IN AX,DX0B76:0100 EE OUT DX,AL0B76:0100 EF OUT DX,AX0B76:0100 F0 LOCK0B76:0100 F1 DB F10B76:0100 F2 REPNZ0B76:0100 F3 REPZ0B76:0100 F4 HLT0B76:0100 F5 CMC0B76:0100 F60000 TEST BYTE PTR [BX+SI],000B76:0100 F7000000 TEST WORD PTR [BX+SI],0000 0B76:0100 F8 CLC0B76:0100 F9 STC0B76:0100 FA CLI0B76:0100 FB STI0B76:0100 FC CLD0B76:0100 FD STD0B76:0100 FE00 INC BYTE PTR [BX+SI]0B76:0100 FF00 INC WORD PTR [BX+SI]三、8086/8088指令系统操作码编码方法8086/8088 指令系统采用了一种灵活的,由1~6 个字节组成的变字长的指令格式,包括操作码、寻址方式以及操作数3 部分。
8086/8088指令系统8086/8088指令系统:一、数据传送指令1.通用数据传送指令MOV(Move)传送PUSH(Push onto the stack)进栈POP(Pop from the stack)出栈XCHG(Exchange)交换.MOV指令格式为: MOV DST,SRC执行的操作:(DST)<-(SRC).PUSH进栈指令格式为:PUSH SRC执行的操作:(SP)<-(SP)-2((SP)+1,(SP))<-(SRC).POP出栈指令格式为:POP DST执行的操作:(DST)<-((SP+1),(SP))(SP)<-(SP)+2.XCHG 交换指令格式为:XCHG OPR1,OPR2执行的操作:(OPR1)<-->(OPR2)2.累加器专用传送指令IN(Input) 输入OUT(Output) 输出XLAT(Translate) 换码这组指令只限于使用累加器AX或AL传送信息. .IN 输入指令长格式为: IN AL,PORT(字节)IN AX,PORT(字)执行的操作: (AL)<-(PORT)(字节)(AX)<-(PORT+1,PORT)(字)短格式为: IN AL,DX(字节)IN AX,DX(字)执行的操作: AL<-((DX))(字节)AX<-((DX)+1,DX)(字).OUT 输出指令长格式为: OUT PORT,AL(字节)OUT PORT,AX(字)执行的操作: (PORT)<-(AL)(字节)(PORT+1,PORT)<-(AX)(字)短格式为: OUT DX,AL(字节)OUT DX,AX(字)执行的操作: ((DX))<-(AL)(字节) ((DX)+1,(DX))<-AX(字)在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH.其中前256个端口(0~FFH)可以直接在指令中指定,这就是长格式中的PORT,此时机器指令用二个字节表示,第二个字节就是端口号.所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口.当端口号>=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来传送信息..XLAT 换码指令格式为: XLAT OPR或: XLAT执行的操作:(AL)<-((BX)+(AL))3.有效地址送寄存器指令LEA(Load effective address)有效地址送寄存器LDS(Load DS with Pointer)指针送寄存器和DSLES(Load ES with Pointer)指针送寄存器和ES.LEA 有效地址送寄存器格式为: LEA REG,SRC执行的操作:(REG)<-SRC指令把源操作数的有效地址送到指定的寄存器中..LDS 指针送寄存器和DS指令格式为: LDS REG,SRC执行的操作:(REG)<-(SRC)(DS)<-(SRC+2)把源操作数指定的4个相继字节送到由指令指定的寄存器及DS寄存器中.该指令常指定SI寄存器..LES 指针送寄存器和ES指令格式为: LES REG,SRC执行的操作: (REG)<-(SRC)(ES)<-(SRC+2)把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中.该指令常指定DI寄存器.4.标志寄存器传送指令LAHF(Load AH with flags)标志送AHSAHF(store AH into flags)AH送标志寄存器PUSHF(push the flags) 标志进栈POPF(pop the flags) 标志出栈.LAHF 标志送AH格式为: LAHF执行的操作:(AH)<-(PWS的低字节).SAHF AH送标志寄存器格式为: SAHF执行的操作:(PWS的低字节)<-(AH).PUSHF 标志进栈格式为: PUSHF执行的操作:(SP)<-(SP)-2((SP)+1,(SP))<-(PSW).POPF 标志出栈格式为: POPF执行的操作:(PWS)<-((SP)+1,(SP))(SP)<-(SP+2)二、算术指令1.加法指令ADD(add)加法ADC(add with carry)带进位加法INC(increment)加1.ADD 加法指令格式: ADD DST,SRC执行的操作:(DST)<-(SRC)+(DST).ADC 带进位加法指令格式: ADC DST,SRC执行的操作:(DST)<-(SRC)+(DST)+CF.ADD 加1指令格式: INC OPR执行的操作:(OPR)<-(OPR)+12.减法指令SUB(subtract)减法SBB(subtract with borrow)带借位减法DEC(Decrement)减1NEG(Negate)求补CMP(Compare)比较.SUB 减法指令格式: SUB DST,SRC执行的操作:(DST)<-(DST)-(SRC).SBB 带借位减法指令格式: SBB DST,SRC执行的操作:(DST)<-(DST)-(SRC)-CF.DEC 减1指令格式: DEC OPR执行的操作:(OPR)<-(OPR)-1.NEG 求补指令格式: NEG OPR执行的操作:(OPR)<- -(OPR).CMP 比较指令格式: CMP OPR1,OPR2执行的操作:(OPR1)-(OPR2)该指令与SUB指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志西半球.3.乘法指令MUL(Unsigned Multiple)无符号数乘法IMUL(Signed Multiple)带符号数乘法.MUL 无符号数乘法指令格式: MUL SRC执行的操作:字节操作数:(AX)<-(AL)*(SRC)字操作数:(DX,AX)<-(AX)*(SRC).IMUL 带符号数乘法指令格式: IMUL SRC执行的操作:与MUL相同,但必须是带符号数,而MUL是无符号数.4.除法指令DIV(Unsigned divide)无符号数除法IDIV(Signed divide)带符号数除法CBW(Convert byte to word)字节转换为字CWD(Contert word to double word)字转换为双字.DIV 无符号数除法指令格式: DIV SRC执行的操作:字节操作:(AL)<-(AX)/(SRC)的商(AH)<-(AX)/(SRC)的余数字操作: (AX)<-(DX,AX)/(SRC)的商(AX)<-(DX,AX)/(SRC)的余数.IDIV 带符号数除法指令格式: DIV SRC执行的操作:与DIV相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同..CBW 字节转换为字指令格式: CBW执行的操作:AL的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFH .CWD 字转换为双字指令格式: CWD执行的操作:AX的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH.这两条指令都不影响条件码.三、逻辑指令1.逻辑运算指令AND(and) 逻辑与OR(or) 逻辑或NOT(not) 逻辑非XOR(exclusive or)异或TEST(test) 测试.AND 逻辑与指令格式: AND DST,SRC执行的操作:(DST)<-(DST)^(SRC).OR 逻辑或指令格式: OR DST,SRC执行的操作:(DST)<-(DST)V(SRC).NOT 逻辑非指令格式: NOT OPR执行的操作:(OPR)<-(OPR).XOR 异或指令格式: XOR DST,SRC执行的操作:(DST)<-(DST)V(SRC).TEST 测试指令格式: TEST OPR1,OPR2执行的操作:(DST)^(SRC)两个操作数相与的结果不保存,只根据其特征置条件码2.移位指令SHL(shift logical left) 逻辑左移SAL(shift arithmetic left) 算术左移SHR(shift logical right) 逻辑右移SAR(shift arithmetic right) 算术右移ROL(Rotate left) 循环左移ROR(Rotate right) 循环右移RCL(Rotate left through carry) 带进位循环左移RCR(Rotate right through carry) 带进位循环右移格式: SHL OPR,CNT(其余的类似)其中OPR可以是除立即数以外的任何寻址方式.移位次数由CNT决定,CNT可以是1或CL.循环移位指令可以改变操作数中所有位的位置;移位指令则常常用来做乘以2除以2操作.其中算术移位指令适用于带符号数运算,SAL用来乘2,SAR用来除以2;而逻辑移位指令则用来无符号数运算,SHL用来乘2,SHR用来除以2.四、串处理指令1.与REP相配合工作的MOVS,STOS和LODS指令.REP重复串操作直到(CX)=0为上格式: REP string primitive其中String Primitive可为MOVS,LODS或STOS指令执行的操作:1)如(CX)=0则退出REP,否则往下执行.2)(CX)<-(CX)-13)执行其中的串操作4)重复1)~3).MOVS 串传送指令格式:可有三种MOVS DST,SRCMOVSB(字节)MOVSW(字)其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如: MOVS ES:BYTE PTR[DI],DS:[SI]执行的操作:1)((DI))<-((SI))2)字节操作:(SI)<-(SI)+(或-)1,(DI)<-(DI)+(或-)1当方向标志DF=0时用+,当方向标志DF=1时用-3)字操作:(SI)<-(SI)+(或-)2,(DI)<-(DI)+(或-)2当方向标志DF=0时用+,当方向标志DF=1时用-该指令不影响条件码..CLD(Clear direction flag)该指令使DF=0,在执行串操作指令时可使地址自动增量;.STD(Set direction flag)该指令使DF=1,在执行串操作指令时可使地址自动减量..STOS 存入串指令格式: STOS DSTSTOSB(字节)STOSW(字)执行的操作:字节操作:((DI))<-(AL),(DI)<-(DI)+-1字操作: ((DI))<-(AX),(DI)<-(DI)+-2该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据DF的值及数据类型修改DI的内容,当它与REP联用时,可把AL或AX的内容存入一个长度为(CX)的缓冲区中. .LODS 从串取指令格式: LODS SRCLODSBLODSW执行的操作:字节操作:(AL)<-((SI)),(SI)<-(SI)+-1字操作: (AX)<-((SI)),(SI)<-(SI)+-2该指令把由(SI)指定的数据段中某单元的内容送到AL或AX 中,并根据方向标志及数据类型修改SI的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.一般说来,该指令不和REP联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.2.与REPE/REPZ和REPNZ/REPNE联合工作的CMPS和SCAS指令.REPE/REPZ 当相等/为零时重复串操作格式: REPE(或REPZ) String Primitive其中String Primitive可为CMPS或SCAS指令.执行的操作:1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行2)(CX)<-(CX)-13)执行其后的串指令4)重复1)~3).REPNE/REPNZ 当不相等/不为零时重复串操作格式: REPNE(或REPNZ) String Primitive其中String Primitive可为CMPS或SCAS指令执行的操作:除退出条件(CX=0)或ZF=1外,其他操作与REPE完全相同..CMPS 串比较指令格式: CMP SRC,DSTCMPSBCMPSW执行的操作:1)((SI))-((DI))2)字节操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1字操作: (SI)<-(SI)+-2,(DI)<-(DI)+-2指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS指令的规定相同..SCAS 串扫描指令格式: SCAS DSTSCASBSCASW执行的操作:字节操作:(AL)-((DI)),(DI)<-(DI)+-1字操作: (AL)-((DI)),(DI)<-(DI)+-2该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS的规定相同.五、控制转移指令1.无条件转移指令.JMP(jmp) 跳转指令1)段内直接短转移格式:JMP SHORT OPR执行的操作:(IP)<-(IP)+8位位移量2)段内直接近转移格式:JMP NEAR PTR OPR执行的操作:(IP)<-(IP)+16位位移量3)段内间接转移格式:JMP WORD PTR OPR执行的操作:(IP)<-(EA)4)段间直接(远)转移格式:JMP FAR PTR OPR执行的操作:(IP)<-OPR的段内偏移地址(CS)<-OPR所在段的段地址5)段间间接转移格式:JMP DWORD PTR OPR 执行的操作:(IP)<-(EA)(CS)<-(EA+2)2.条件转移指令1)根据单个条件标志的设置情况转移.JZ(或JE)(Jump if zero,or equal) 结果为零(或相等)则转移格式:JE(或JZ) OPR测试条件:ZF=1.JNZ(或JNE)(Jump if not zero,or not equal) 结果不为零(或不相等)则转移格式:JNZ(或JNE) OPR测试条件:ZF=0.JS(Jump if sign) 结果为负则转移格式: JS OPR测试条件:SF=1.JNS(Jump if not sign) 结果为正则转移格式:JNS OPR测试条件:SF=0.JO(Jump if overflow) 溢出则转移格式: JO OPR测试条件:OF=1.JNO(Jump if not overflow) 不溢出则转移格式: JNO OPR测试条件:OF=0.JP(或JPE)(Jump if parity,or parity even) 奇偶位为1则转移格式: JP OPR测试条件:PF=1.JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位为0则转移格式: JNP(或JPO) OPR测试条件:PF=0.JB(或JNAE,JC)(Jump if below,or not above or equal, or carry) 低于,或者不高于或等于,或进位位为1则转移格式:JB(或JNAE,JC) OPR测试条件:CF=1.JNB(或JAE,JNC)(Jump if not below,or above or equa l,or not carry) 不低于,或者高于或者等于,或进位位为0则转移格式:JNB(或JAE,JNC) OPR测试条件:CF=02)比较两个无符号数,并根据比较的结果转移.JB(或JNAE,JC)格式:同上.JNB(或JAE,JNC)格式:同上.JBE(或JNA)(Jump if below or equal,or not above) 低于或等于,或不高于则转移格式:JBE(或JNA) OPR测试条件:CFVZF=1.JNBE(或JA)(Jump if not below or equal,or above) 不低于或等于,或者高于则转移格式:JNBE(或JA) OPR测试条件:CFVZF=03)比较两个带符号数,并根据比较的结果转移.JL(或LNGE)(Jump if less,or not greater or equal) 小于,或者不大于或者等于则转移格式:JL(或JNGE) OPR测试条件:SFVOF=1.JNL(或JGE)(Jump if not less,or greater or equal)不小于,或者大于或者等于则转移格式:JNL(或JGE) OPR测试条件:SFVOF=0.JLE(或JNG)(Jump if less or equal,or not greater) 小于或等于,或者不大于则转移格式:JLE(或JNG) OPR测试条件:(SFVOF)VZF=1.JNLE(或JG)(Jump if not less or equal,or greater) 不小于或等于,或者大于则转移格式:JNLE(或JG) OPR测试条件:(SFVOF)VZF=04)测试CX的值为0则转移指令.JCXZ(Jump if CX register is zero) CX寄存器的内容为零则转移格式:JCXZ OPR测试条件:(CX)=0注:条件转移全为8位短跳!3.循环指令.LOOP 循环指令格式: LOOP OPR测试条件:(CX)<>0.LOOPZ/LOOPE 当为零或相等时循环指令格式: LOOPZ(或LOOPE) OPR测试条件:(CX)<>0且ZF=1.LOOPNZ/LOOPNE 当不为零或不相等时循环指令格式: LOOPNZ(或LOOPNE) OPR测试条件:(CX)<>0且ZF=0这三条指令的步骤是:1)(CX)<-(CX)-12)检查是否满足测试条件,如满足则(IP)<-(IP)+D8的符号扩充.4.子程序.CALL调用指令.RET返回指令5.中断.INT指令格式: INT TYPE或 INT执行的操作:(SP)<-(SP)-2((SP)+1,(SP))<-(PSW)(SP)<-(SP)-2((SP)+1,(SP))<-(CS)(SP)<-(SP)-2((SP)+1,(SP))<-(IP)(IP)<-(TYPE*4)(CS)<-(TYPE*4+2).INTO 若溢出则中断执行的操作:若OF=1则:(SP)<-(SP)-2((SP)+1,(SP))<-(PSW)(SP)<-(SP)-2((SP)+1,(SP))<-(CS)(SP)<-(SP)-2((SP)+1,(SP))<-(IP)(IP)<-(10H)(CS)<-(12H).IRET 从中断返回指令格式: IRET执行的操作:(IP)<-((SP)+1,(SP))(SP)<-(SP)+2(CS)<-((SP)+1,(SP))(SP)<-(SP)+2(PSW)<-((SP)+1,(SP))(SP)<-(SP)+2六、处理机控制指令1.标志处理指令.CLC进位位置0指令(Clear carry)CF<-0.CMC进位位求反指令(Complement carry)CF<-CF.STC进位位置1指令(Set carry)CF<-1.CLD方向标志置0指令(Clear direction)DF<-0.STD方向标志置1指令(Set direction)DF<-1.CLI中断标志置0指令(Clear interrupt)IF<-0.STI中断标志置1指令(Set interrupt)IF<-02.其他处理机控制指令NOP(No Opreation) 无操作HLT(Halt) 停机WAIT(Wait) 等待ESC(Escape) 换码LOCK(Lock) 封锁这些指令可以控制处理机状态.这们都不影响条件码. .NOP 无操作指令该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代..HLT停机指令该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序..WAIT等待指令该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT指令继续德行..ESC换码指令格式ESC mem其中mem指出一个存储单元,ESC指令把该存储单元的内容送到数据总线去.当然ESC指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如808 7)则是为了提高速度而可以选配的硬件..LOCK封锁指令该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止.当CPU与其他处理机协同工作时,该指令可避免破坏有用信息.。
内存逻辑地址逻辑地址:<段地址,偏移量>物理地址:20位实际地址=段地址*16+偏移量寻址方式:1、立即寻址MOV AX,1234H ;AX←1234H立即数无法作为目标操作数低地址放低位2 直接寻址:MOV AX,[3578H] 16位有效偏移地址EA=基址+变址+偏移量段址通常由DS提供,如果通过基址指针BP寻址,则段址由SS提供直接寻址方式下,操作数的段地址默认为数据段寄存器DS的内容,但允许段重设,即由指令定义段:MOV AX,ES:[1200H]对于双操作数指令来说,不允许两操作数同为存储器操作数。
3寄存器寻址不允许用立即数对段寄存器直接赋值,用两条指令CS段寄存器不允许被赋值源、目的操作数类型要一致4寄存器间接寻址: MOV AX,BX,SI,DI DS BP SS5 AX,[BX+DATA]MOV AL, [BP+TABLE]MOV AL, [BP]+TABLEMOV AL, TABLE[BP]SI、DI、BX时,默认段寄存器为DS;BP时,默认段寄存器为SS6基址—变址寻址:MOV AX,[BX][DI]或MOV AX,[BX+DI][BX]+[DI]或[BX]+[SI]默认段DS[BP]+[DI]或[BP]+[SI]默认段SS不允许将2个基址寄存器或2个变址寄存器组合在一起寻址!7基址—变址—相对寻址EA=[BX或BP]+[DI或SI]+8位或16位位移量基址寄存器BP的默认段SS;BX对应段为DS源操作数为立即数,需指定操作数类型8隐含寻址指令系统:1、交换指令XCHG 注意书上的功能和要求2、IN和OUT寻址直接寻址,端口地址8位,地址范围:0—FFH间接寻址,端口地址16位,DX指定,0—FFFFH寻址方式3、堆栈操作PUSH POP堆栈操作必须以字为单位可以使用除立即数以外的其它寻址方式不影响标志位不能用立即寻址方式⨯PUSH 1234HDST不能是CS ⨯POP CSPUSH和POP指令在程序中一般成对出现SP值的变化4、加减操作ADD 普通加法指令ADC 带进位位的的加法指令INC 加1指令SUB 普通减法指令SBB 考虑借位的减法指令DEC 减1指令5、BCD调整指令P120 DAA6、移位指令注意对标志位的影响7、JMP以上都是依据老师最后划的重点总结的要点,大家还是要多看看书。
实验二找出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个字节为寻址方式字段。