河北专升本(微机原理)

目录

第一章:计算机基础与数制转化

1. 进制运算基础

2. 常用编码形式

3. 计算机系统的组成及其工作原理

4. 微机系统主要技术指标

第二章:8086微处理器及其系统

1. 8086微处理器(CPU)

2. 8086的存储器及I/O组织 

3. 8086系统配置

第三章:指令系统

1. 8086/8088指令系统概述

2. 8086的指令系统

(一). 数据传送指令

(二). 算术运算指令

(三). 逻辑运算指令

(四). 移位指令

(五). 字符串操作指令

(六). 转移指令

(七). 循环控制指令

(八). 宏汇编语言的基本语法

(九). 伪指令

(十). 宏指令

(十一). 汇编语言程序的结构

(十二). DOS系统功能调用

第四章: 存储器

1. 存储器基础

2. 两块重要的存储芯片

3. 编址和译码

第五章: 输入输出及中断技术

1. io接口、编址、传送方式

2. 中断

3. 8086/8088的中断系统  

4.  8259A可编程中断控制器

 第六章:常用接口技术

1. 8255

2. 可编程定时/计数器8253


第一章:计算机基础与数制转化

1. 进制运算基础

进位计数制:
按照进位的方法进行计数,称为进位计数制。常见的进位计数制有:二进制、八进制、十进制、十二进制、十六进制等等。

R进制数的特点:
    1、具有R个不同的数符。0,1,2,...,R-1

    2、逢R进一。


进位计数制的一般表达式(按权展开式):
    R进制数的表示方法,任一R进制数S可表示为: 

    位置表示法:    

     其中:ai :R进制中的数字符号     

             R:基数

             Ri:位权,简称权


十进制:
      特点:(1)有十个数码:0~9
                 (2)逢十进一

      后缀为D

      加权展开式以10为基数,各位系数为0~9。

二进制:
      特点:(1)两个数码:0、1
                 (2)逢二进一

      后缀为B

      加权展开式以2为基数,各位系数为0、1。

十六进制:

       特点:(1)十六个数码0~9、A~F
                  (2)逢十六进一。

       后缀为H,一般情况如果字母开头那前面要加0
       展开式以十六为基数,各位系数为0~9,A~F。

       注意:不同进位制数以后缀区别,十进制数可不带后缀。或加括弧,再在括弧之后

                  注明。


不同进位计数制之间的转换:

      2和16进制数转换成10进制数方法:

           先将二、十六进制数按权展开,然后按照十进制运算法则求和。

    十进制数转换成二、十六进制:

           方法:整数部分,除基取余;小数部分,乘基取整

    二进制与十六进制数之间的转换:

           二进制转换为16进制时,整数部分从最低位进行划分,每4位二进制数为一组,

           不足4位的,最高位补零;小数部分从最高位进行划分,每4位二进制数为一组,

           不足4位的最低为补零


逻辑运算:

 (1)与^:两项均为 1 时,结果为 1;有一个为 0时,结果为 0。
 (2)或(倒着的与):两项均为0 时,结果为 0;有一个为 1 时,结果为 1。
 (3)非(0或1上面加一横线):0变1,1变0。
 (4)异或(圆圈里加个正号):两项相同则为 0,不同则为一。

 2. 常用编码形式

1. 二进制编码的十进制数

    BCD码(Binary Coded Decimal) 8421BCD

    特点:(1)BCD码有十个不同字符,逢十进一,是十进制数。

               (2)每一位十进制数用4 位二进制编码表示,是以二进制编码表示的十进制数。

               (3)直观。

    例:求十进制数876的BCD码           

     注意:BCD码——>十进制码——>二进制 

                一字节=8位二进制数 

     BCD(8421)有两种形式:

                1. 组合(压缩)BCD:8位2进制表示2位十进制

                    例如:78以 组合(压缩)BCD表示:0111 1000

                2. 非组合(非压缩):8位2进制表示1位十进制

                    例如:78以 非组合(非压缩)BCD表示:0000 0111    0000 1000

      除BCD编码外,还有其他二进制编码的十进制数。如余3码、余3循环码等。


2.  字符编码

     (ASCII码 American Standard Code For Information Interchange,美国标准信息交换码)

     可表示128种字符的7位基本ASCII码和可表示256种字符的8位扩充ASCII码

     (可重新定义)

      字符可分为:显示字符控制字符

                           0—9:ASCII码30H—39H

                           A—Z:  41H—5AH

                           a—z:   61H—7AH

                           回车:0DH    换行:0AH


3.  带符号数的表示方法

  (1)机器数与真值

   机器数:计算机中数的表示形式,以二进制的形式表示,位数通常为8的倍数 。

                 一般数的最高位作符号位,“0”表示“+”, “1”表示“-”

           真值: 机器数所代表的实际数值。可用二进制表示,也可用其他进制表示。

                       一般真值都代表有符号数

           举例:一个8位机器数与它的真值对应关系如下:

     (2)计算机对有符号数的三种表示方法

             原码(True Form):

                     原码和真值区别:原码用0/1表示,真值用+/-表示

             定义:正数符号位为0,负数为1,数值位保持不变

                        8位2进制数的最高位用作符号位后跟绝对值

             例:X=124      [X]原 =01111100 (8位)

                    Y=-124     [Y]原 =11111100 (8位)

      反码(One’s Complement):

            定义:正数的反码与原码表示相同。 

            负数反码符号位为 1,数值位为原码数值各位取反。

            也就是在原码的基础上,正数不变,负数除符号位按位取反(0变1,1变0)

                    例:  8位反码机器数: 

                          x= 4:       [x]原= 00000100   [x]反= 00000100

                          x= -4 :     [x]原= 10000100   [x]反= 11111011

                          x= 100:   [x]原= 01100100    [x]反= 01100100

                          x= -100 : [x]原= 11100100    [x]反= 10011011

                          [0+]反= 00000000     [0-]反= 11111111

                          [-127]反= 10000000

                    特点:

                        (1)0有两种表示方法

                        (2)8位:-127~ +127  16位:-32767~ +32767

                        (3)符号位为0,正数,后面7/15位是其数值;

                                 符号位为1,负数,后面7/15位按位取反。

                          如: [x]反= 00000101        x=5

                                  [y]反= 11111110          y=-1

                补码(Two’s Complement):

                   1. 模 —— 计数系统的量程 

                       8位2进制数的模是256100H,16位2进制数的模是6553610000H

                     2. 补码

                         定义:正数——>同原码(原反补相同)

                         负数——>其对应的原码基础上除符号位按位取反后加1。

                                         或:负数的补码 = 模 - |真值的绝对值(有符号数)|

                                                |真值(有符号数)| = 模 - 补码

                         计算机内部负数=补码

                         计算机内部不会区分有无符号数,只会正常加减

                         大于等于80H的数看作有符号数就是负的  80H=-128

                         例:求 8位补码机器数: 

                                x=+4:  [x]原=[x]反=[x]补=  00000100 

                                x=-4:   [x]原 = 10000100     [x]反 = 11111011         [x]补 = 11111100

                                [-100]原 = 11100100      [-100]补 =10011100

                                [-0]补 =11111111+1=00000000= [-0]补 = [0]补

                                [-127]补 =10000001         [-128]补 =10000000

                         特点:                           

                               采用补码,可把减法转换为加法:

                               X=64-9=64+(-9)

                               [x]补= [64]补 + [-9]补 =01000000+11110111

          三种表示方式的比较:

                 表示范围: 

                      八位二进制

                      原码:-127~+127    反码:-127~+127    补码:-128~+127

                     十六位二进制 

                      原码: -32767~+32767  反码:-32767~+32767  补码:-32768~+32767

                 信息的冗余性:原码、反码存在冗余编码,补码不存在冗余编码

                 运算的繁简程度:原码、反码对加减法需要进行不同的计算

                                              补码对加减法只需进行加法运算即可。

                 注意:2的16次方=65536   2的15次方=32768


4、机器数与真值之间的转换

   (1)真值→机器数

            以下为8位二进制数:

            X1=+127,X2=-127,求[X]原 、[X]补:

    [X1]原=[X1]补=01111111B= 7FH

    [X2]原=11111111= FFH 

    [X2]补=10000001= 81H

   (2)机器数→真值
        *注意机器数表示(原码、反码、补码)
           *注意机器数符号位

    1.  [X1]原= 59H,[X2]原= D9H,求真值?

         [X1]原=01011001 =+89       

         [X2]原= 11011001 =-89

    2.  [X1]补= 59H,[X2]补= D9H,求真值?

          X1= +1011001B =+89    

          X2=10100111B =-39


5、运算方法

     计算机内部对于加减法运算采用相同的运算器(加法器)进行计算,即:将参与运算的

     各数值转换为补码进行加、减运算,最高位作为数值直接参与运算,变减法为加法运算。

     1. 补码加法运算:[X+Y]补=[X]补+[Y]补

         注意:A+B=C    [A]补+[B]补=[C]补   A真+B真=C    这里[C]补==C求补

         例:X1=+13,Y1=+6,X2=-13,Y2= -6

                求[X1+Y1]补、   [ X2+Y2]补

                解:先求[X1]补、 [Y1]补、[X2]补、[Y2]补       

      2. 补码减法运算   [X-Y]补=[X]补-[Y]补=[X]补+[-Y]补

       3、无符号数加减运算

             法则:加法运算,直接相加;减法运算,变补相加。

        溢出:

              超出了有符号数的表示范围 

              可能溢出的情况:正+正(因为可能会>+127)       负+负(因为可能会<-128)

                                           负-正(因为可能会-<128)         正-负(因为可能会>+127)

              不可能发生溢出情况:    正+负(因为无论如何都不可能>+127和<-128)

        判断有符号数加减法是否溢出:

              (1) 把数都化成二进制进行加减

              (2) 最高位与次高位的进/借位情况是否相同,相同不溢出,不相同溢出

        总结:

              通过上例可以看出,计算机只是按照补码的运算规则进行加减法运算,

              其无法判断出参与运算的数据究竟是有符号数还是无符号数。

3. 计算机系统的组成及其工作原理

计算机系统由软件系统硬件系统组成


1、计算机硬件的基本结构       

      硬件是指组成计算机的各种电子的,机械的,光磁学的物理器件和设备。

      至今为止,不论是低档微机或是高档微机,均是冯·诺依曼型的机器。它主要由5个基本

      部分组成,即:运算器(算术与逻辑运算单元ALU)控制器存储器, 输入设备

      输出设备(或I/O设备)

        在微机中,一块集成芯片可包括控制器运算器两大部分,称为微处理器或处理器

      (center processing unit,CPU)。一台微型计算机由处理器存储器I/O接以及

        若干I/O设备所组成。各部分之间通过总线连接在一起,实现信息的交换。

         注意内存单元的地址和内容:

         每个单元都对应一个地址,以实现对单元内容的寻址 


2、计算机的基本工作原理

      例如,求5+4=?

      (1) 编制程序,并分配计算程序及数据在存储器中的存放地址。

      (2) 用输入设备将计算程序和原始数据输入到存储器指定地址的存储单元中

      (3) 从计算程序的首地址启动计算机工作,在CPU的控制下完成下列操作:

   ① 取指阶段:从首地址所在的存储单元中,取出第一条指令的操作码送入CPU中的

        控制器。控制器经分析,确认它为何种操作(比如取数)

   ② CPU自动将存储单元地址加1,然后从此地址中将第一条指令操作数的地址码送

        到存储器的地址译码器,并发出读命令从该单元中取出数据 “5”送入CPU的运算

        器中。

   ③ 至此第一条指令执行完毕。CPU再次将存储地址加1,形成下一条指令的存放地 

        址,并按此地址取出指令,在控制器中分析该指令要执行的是什么操作,并发出

        执行该操作所需要的控制信号,直至完成该条指令所规定的操作。依此类推,直

        到计算程序中的全部指令执行完毕

由此可知,计算机的基本工作原理如下:

           (1)  计算机的自动计算(或自动处理)过程就是执行一段预先编制好的计算程序的

                 过程。

           (2)  计算程序是指令的有序集合,因此,执行计算程序的过程实际上是逐条执行指

                 令的过程。

           (3)  指令的逐条执行是由微机或计算机硬件实现的,可归结为取指令分析指令 、

                 执行指令。如此重复操作,直至执行完计算程序中的全部指令,便可获得最终

                 结果。

        微处理器、微型计算机和微型计算机系统三者的关系:

   (1) 微处理器只是一个中央处理器(CPU),由算术逻辑部件(ALU),累加器和通用
        寄存器组,程序计数器,时序和控制逻辑部件,内部总线等组成。微处理器不能
        构成独立工作的系统,也不能独立执行程序。
   (2) 微型计算机由CPU,存储器,输入/输出接口电路和系统总线组成,具有计算功
         能,能独立执行程序,但不能显示或输出,仍不能正常工作。
   (3) 以微型计算机为主体,配上外部输入/输出设备及系统软件就构成了微型计算机
         系统,这样就可以正常工作了。

4. 微机系统主要技术指标

一、常用名词术语:

       1、( bit 或 b )

             ——最小的信息单位,二进制的一位数。

            例如:1101,含有4 bit;一个“bit”只能表示1种状态 (“0” 或 “1”);n 个“bit” 就能表

                        示2的n次方种状态。

       2、字节( Byte 或 B )

              ——是计算机的最小存储单元

             1Byte = 8bit , 从00000000~11111111;

             可以表示256 个状态(数值);

             一般数字、字母、普通符号用一个字节就可表示,但汉字、特殊符号等则需两个或

             多个字节来表示。

       3、(word 或 w)

              ——是计算机进行数据交换、加工、存储的基本运算单位。一个字由一个或若干

                     个字节构成,通常将组成一个字的位数叫作该字的字长。

             字长越长,在相同时间内能传送更多的信息,从而运算速度更快;计算机有更大的

             寻址空间,从而内存储容量更大;计算机系统支持的指令数量越多,功能就越强。

             1word=2B

       4、字长

             ——每个字所包含的二进制位数,字长就是字的长度,这里的长度用位来表示

                      TB>GB>MB>KB>B    1TB=1024GB   1GB=1024MB  1MB=1024KB

                      1KB=1024B                1B= 8b             1024=2的10次方

                      1K=2的10次方            1M=2的20次方          1G=2的30次方


二、主要技术指标:

1、 机器字长

        ——是指计算机内部ALU能够一次同时处理的二进制数的位数。

       字长越长,运算精度越高。通常字长都是字节(8位二进制数)的整数倍,如8位

       、16位、32位、64位。

 2、主频

        ——计算机的时钟频率,在一定程度上反映机器的运算速度,主频越高,运算速

               度越快。

       主频的单位是MHz(兆赫)和GHz。如386的主频为20M~33MHz,486的主频为25

       M~100MHz,Pentium的主频为66M~200MHz,Pentium Ⅲ的主频为336M~

       1400MHz。

       频率的倒数或频率分之一 = 周期

       主频的倒数 = 时钟周期

         3、内存容量

               ——计算机可存储信息的多少,通常以字节为计量单位。一般用KB,MB,GB,TB,PB

                      为单位。

              1KB=1024B 

              1MB=1024KB

              1GB=1024MB

              容量越大储存的程序和数据越多,处理能力也就越强。

4、运算速度

     运算速度的一种表示方式是MIPS(millions of instructions per second ),即每秒百

     万条指令,它主要是对整数运算而言。对于浮点运算,一般使用MFLOPS(million

     floating point operations per second)表示,即每秒百万次浮点运算。

第二章:8086微处理器及其系统

1. 8086微处理器(CPU)

流水线技术:

计算机中的流水线是把一个重复的过程分解为若干个子过程,每个子过程与其他子过程

并行进行。由于这种工作方式与工厂中的生产流水线十分相似, 因此称为流水线技术从

本质上讲,流水线技术是一种时间并行技术。


8086/8088微处理器概述:

      8086 CPU是Intel系列的16位微处理器,它有16位数据总线和20位地址总线,所以可寻

      址的地址空间是:2的20次方B=1MB

      8088 CPU准16位微处理器,它的内部寄存器、内部运算部件以及内部操作都是按16

      位设计的,但对外的数据总线只有8位,在处理一个16位数据时,8088需要两步操作,

      因而称8088是准16位微处理器。


一、8086CPU的编程结构

       从程序员的角度看,8086CPU分为两部分:

       执行部件(execution unit,EU)        总线接口部件(bus interface unit,BIU)

       执行部件:完成功能(运算器)            总线接口部件:与存储器交互(地址)

 

       1.  执行部件(EU)

    功能:执行指令

    组成:① 4个通用寄存器(存放数据的),即AX、BX、CX、DX;(都是16位)

                   4个专用寄存器(某些情况下放地址),即

                                              基址指针寄存器 BP(base pointer)

                                              堆栈指针寄存器 SP(stack pointer)

                                              源变址寄存器 SI(source index)

                                              目的变址寄存器DI(destination index)

               ②标志寄存器FR(或FLAGS,表示运算结果状态);

               ③算术逻辑单元ALU(arithmetic logic unit)。

               ④内部控制逻辑

           (1)内部寄存器组

                    ①数据寄存器: 可用来存放16位的数据或地址。又可分为8个8位寄存器,即:

                        数据寄存器特有的习惯用法:

                        AX:累加器(数据专用寄存器)。所有I/O指令都通过AX或AL与接口传送信息

                        ,中间运算结果也多放于AX中。

                        BX:基址寄存器(可以放地址)。在间接寻址中用于存放基地址。

                        CX:计数寄存器可以用作数据寄存器,在字符串操作、循环操作和移位

                        操作时用作计数器,存放计数值。

                        DX:数据寄存器(IO间接寄存器/AX备胎)。在间接寻址的I/O指令中存放I/O

                        端口地址;在32位乘除法运算时,存放高16位数。

②指针和变址寄存器:4个16位寄存器,主要用来存放操作数的偏移地址

                                  (即操作数的段内地址)。

    SP:堆栈指针寄存器(纯指针,纯指示位置),在堆栈操作中存放栈顶的偏移

            地址。

    BP:基址指针寄存器(也可以取数),常用于在访问内存时存放内存单元的偏

             移地址,还用作堆栈区的基地址寄存器。

                        SI:源变址寄存器(也可以取数),主要用于存放地址,在字符串操作中存放源

                               操作数的偏移地址。

                        DI:目的变址寄存器(也可以取数),主要用于存放地址,在字符串操作中存放

                               目的操作数的偏移地址。

                        注意BX与BP在应用上的区别:

                            1. 作为通用寄存器,二者均可用于存放数据
                            2. 作为基址寄存器,用BX表示所寻找的数据在 数据段; 用BP则表示数据
                                在 堆栈段
                        变址寄存器常用于指令的间接寻址或变址寻址。
                        在串操作中变址寄存器内存放的地址在数据传送完成后,具有自动修改的功
                        能。例如,传送1字节数据后地址自动加1,为下次传送做好准备,变址寄存   
                        器因此得名。
                        通过地址取数据只能用BX,BP,SI,DI
           (2)算术逻辑单元(ALU)及标志寄存器(FR)

                   ① 算术逻辑运算单元ALU:

                       可完成16位或8位的算术逻辑运算,运算结果通过内部总线送到通用寄存器,

                       或者送往BIU的内部寄存器中,等待写入存储器。ALU运算后的结果特征(有 

                       无进位,溢出等)置入标志寄存器FLAGS中保存。

                   ② 标志寄存器FR(FLAGS):

                       16位寄存器,用来存放运算结果的特征和控制标志。

                       根据功能,8086的标志可以分为两类:

                           状态标志——6个,用来表示运算结果的特征。

                                                 包括CF、PF、AF、ZF、SF和OF

                           控制标志——3个,用来控制CPU的操作。

                                                包括IF、DF和TF。

                           各标志位的作用说明如图:

                    (1)CF(Carry Flag) 进位标志位

                             CF=1,表示本次运算中最高位(第7位或第15位)有进位(加法运算时)

                             或有借位(减法运算时);否则CF=0。

                             进行二个无符号数加法或减法运算后,如果CF=1,表示运算的结果超出

                             了该字长能够表示的数据范围。例如,执行8位数据运算后,CF=1表示加

                             法结果超过了255,或者是减法得到的差小于零。

                             只针对无符号运算,进行有符号数运算时CF对运算结果没有直接意义。

                             注意:FR(FLAGS)只有一组,

                                        如果第一次运算后CF=1,第二次运算后CF=0,

                                        那么后面的运算会把前面的运算覆盖

                                        例如:80H+80H=00H   这时候CF=1

                                                   00H+00H=00H   这时候CF=0

     (2)PF(Parity Flag) 奇偶标志位

              PF=1,表示本次运算结果的低八位中有偶数个“1”

              PF=0,表示本次运算结果的低八位中有奇数个“1”

              PF可以用来进行奇偶校验,或用来生成奇偶校验位。

     (3)AF(Auxiliary Carry Flag) 辅助进位标志位      

              AF=1,表示运算结果中低4位向高4位有进位(加法运算时)或有借位

           (减法运算时),否则AF=0。

     (4)ZF(Zero Flag) 零标志位

              ZF=1,表示运算结果为0(各位全为0),否则ZF=0。

                     (5)SF(Sign Flag) 符号标志位

                              SF=1,表示运算结果的最高位(第7位或第15位)为1,否则SF=0。

                     (6)OF(Overflow Flag) 溢出标志位

                              OF=1 表示二个用补码表示的有符号数的运算结果超出了该字长所能表

                              示的范围,即产生溢出;否则OF=0。

                              例如,进行8位运算时,OF=1表示运算结果大于+127 或小于-128,此

                              时不能得到正确的运算结果。

                              OF对无符号数的运算结果没有意义。

                              如何判断溢出:

                              根据最高位的进位与次高位的进位是否相同来确定。若两者不相同则

                              OF=1(表示有溢出),否则 OF=0(表示无溢出)

             (7)IF(Interrupt Flag) 中断允许标志位

                      IF=1,表示允许CPU响应可屏蔽中断。IF可通过STI指令置位(置1),

                      也可通过CLI指令复位(清零)。

             (8)DF(Direction Flag) 方向标志位

                    在串操作指令中,若DF=0,表示串操作指令执行后地址指针自动增量,

                    串操作由低地址向高地址进行;DF=1,表示地址指针自动减量,串操作

                    由高地址向低地址进行。DF可通过STD指令置位,也可通过CLD指令复

                    位。

             (9)TF(Trap Flag) 单步标志位(陷阱标志位)

                     TF=1,控制CPU进入单步工作方式。在这种工作方式下,CPU每执行完

                     一条指令就会自动产生一次内部中断,这在程序调试过程中很有用。

               注意:如果是有符号数就只看OF不看CF,如果是无符号数只看CF不看OF

   (3)内部控制逻辑电路

            主要功能:从指令队列缓冲器中取出指令,对指令进行译码,并产生各种控制

            信号,控制各部件的协同工作以完成指令的执行过程。

2.  总线接口部件 BIU(与外部I/O和内存打交道的)

             功能:形成访问存储器的物理地址;

                       访问存储器取得指令并暂存到指令队列中等待执行;    

               访问存储器或I/O端口以读取操作数参与EU运算,或存放运算结果等。 

             组成:① 4个段地址寄存器(CS、DS、ES、SS)

                        ②16位的指令指针寄存器IP(Instruction Pointer)

                        ③ 20位的地址加法器

                        ④ 6字节的指令队列缓冲器

                        ⑤ 总线控制逻辑

           (1)段地址寄存器(CS, DS, SS, ES)

                    存储器的分段

                    8086可寻址的存储空间为1MB,有20位的地址线,而内部的寄存器是16位,

                    只能寻址64KB。所以8086/8088系统采用了地址分段的方法,将1M存储空

                    间分成若干块,称为“逻辑段”,每个段开始地址为16整数倍,每个逻辑段容

                    量≤64KB,存放一种类型的数据或者程序。因此1M的存储空间可分成16个逻

                    辑段(0~15)。在段内寻址仍采用传统的16位地址寻址方法。

                    在8086存储空间中,把16字节的存储空间称作一节(paragraph)。要求各个逻

                    辑段从节的整数边界开始,即段首地址低4位应该是“0”,把段首地址的高16位

                    称为“段基址”,存放在段寄存器DS或CS或SS或ES中。

                    允许段在整个存储空间浮动,即段与段之间可以部分重叠、完全重叠、连续

                    排列。在整个存储空间中可设置若干个逻辑段。

                    对于任何一个物理地址,可以惟一地被包含在一个逻辑段中,也可包含在多

                    个相互重叠的逻辑段中,只要有段地址和段内偏移地址就可以访问到这个物

                    理地址所对应的存储空间。

                    段空间范围:   因为两个重叠的段空间(极度重叠时)最少相差10H

                                             例如:00010H和00020H    00020H-00010H=10H=16

                                             所以 16B<=段空间<=64KB

                    段可分为代码段,数据段,附加段,堆栈段。用于存放段基址有 4个16位段寄

                    存器,代码段寄存器CS数据段寄存器DS附加段寄存器ES堆栈段寄存器

                    SS

                    代码段:存放程序代码,程序代码超过64K时,需要分成几个段存放。CS中存

                    放的是现在正在执行的程序段的段基址。

                    数据段:用于存放当前使用的数据。需要第二个数据段时可以使用附加段。

                    堆栈段:是内存中的一块存储区,用来存放专用数据。如调用子程序时的入口

                    参数,返回地址等,这些数据都按照“后进先出”的规则进行存取。SS存放堆栈

                    段的段基址,SP存放当前堆栈栈顶的偏移地址。数据进出堆栈要使用专门的堆

                    栈操作指令,SP的值在执行堆栈操作指令时根据规则自动地进行修改。

                    编程时,程序和各种不同类型的数据分别存放在不同的逻辑段中,它们的“段基

                    址”存放在“段寄存器”中,段内的偏移地址存放在指针寄存器或变址寄存器中。

                     段基址表示一个段的起始地址的高16位。偏移地址表示段内的一个单元距离

                     段开始位置的距离,因此,偏移地址也称为段内地址。 例如:2345H:1100H

                     表示段基址为2345H(段的起始地址是23450H),段内偏移地址为1100H的存

                     储单元地址。

                     注意:汇编程序在汇编时给出一个隐含的地址计数器,是地址计数器的

                                值,也就是当前所使用的存储单元的偏移地址

                     例:
                         已知CS=1055H,DS=250AH,ES=2EF0H,SS=8FF0H,

                         画出各段在内存中的分布、段首地址

         (2)地址加法器

                   功能:完成逻辑地址(段地址:偏移地址)向物理地址的变换。

                   物理地址:访问存储器的实际地址,用20位二进制表示。

                   方法:物理地址=段基址×16 (即左移4位)+ 偏移地址

          例:

               逻辑地址2345H:1100H对应的物理地址是24550H。

               23450H+1100H =24550H。

               反之,物理地址24550H,它对应的逻辑地址可以是2455H:0000H,也可以

               是2400H:0550H等。

               所以一个存储单元的物理地址是惟一的,而它对应的逻辑地址是不惟一的。

            (3)  指令指针寄存器IP——  16位(纯指针)

                  功能:用来存放将要执行的下一条指令在代码段中的偏移地址。在程序运行过

                             程中,BIU自动修改IP中的内容,使它始终指向将要执行的下一条指令。

                  注意:程序不能直接访问IP,但是可通过某些指令修改IP的内容。例如, 执行转

                             移指令时,会将转移的目标地址送入IP中,以实现程序的转移。

            (4) 指令队列缓冲器——6字节

                 BIU从存储器中读出指令送入6字节的指令队列。一旦指令队列中空出2个字节,

                 BIU将自动进行读指令的操作以填满指令队列。只要收到EU送来的操作数地址,

                 BIU将立即形成这个操作数的物理地址,完成读/写操作。遇到转移类指令,BIU

                 将指令队列中剩余的指令作废,重新从存储器新的地址单元中取指令并送入指令

                 队列。一般情况下应保证指令队列中填满指令,使得EU可以不断地得到等待执

                 行的指令。

            (5) 总线控制逻辑

                 是将CPU的内部总线与CPU引脚所连接的外部总线相连,是CPU与外部交换信息

               (数据、地址、状态、控制信息)的必经之路,包括16条数据线、20条地址线和

                 若干条控制信号线。

        3.  总线接口部件和执行部件的管理

             当8086指令队列中有2字节空闲(8088有一字节空闲)时,总线接口部件就自动将

             指令从内存中预取到指令队列缓冲器中。

             每当EU部件要执行一条指令时,它就从指令队列头部取出指令,后续指令自动向

             前推进。EU要花几个时钟周期执行指令,指令执行中若需要访问内存或I/O设备,

             EU就向BIU申请总线周期,若BIU总线空闲,则立即响应,若BIU正在取一条指令,

             则待取指令操作完成后再响应EU的总线请求。

             当指令队列已满,EU又没有申请总线时,则总线空闲。遇到转移、调用及返回指

             令时,原先预取到指令队列中的指令已不再有用,BIU就自动清除指令队列中已有

             内容,从转移、调用或返回的新地址开始,重新从内存中预读取指令并填充指令

             队列。


二、8086CPU引脚的功能:

       8086 CPU是十六位的微处理器,它向外的信号应包含16条数据线,20条地址线,再

       加上其他一些必要的控制信号。为了减少芯片引脚数量,对部分引脚采用了分时复用

       的方式,构成40条引脚的双列直插式封装。

       分时复用——就是在同一根传输线上,在不同时间传送不同的信息。

       分时复用目的:减少引脚

       8086/8088依靠分时复用技术,用40个引脚实现了众多数据、地址、控制信息的传送。

       1. 8086总线周期

           时钟周期: CPU的一切操作都是在系统主时钟CLK的控制下按节拍有序地进行的。

           系统主时钟一个周期信号所持续的时间称为时钟周期(T),大小等于频率的倒数,

           是CPU的基本时间计量单位。 

           总线周期:CPU通过外部总线对存储器或I/O端口进行一次读/写操作的过程称为总

           线周期。为完成对存储器或I/O端口的一次访问,CPU需要先后发出存储器或I/O端

           口地址,发出读或者写操作命令,进行数据的传输。以上的每一个操作都需要延续

           一个或几个时钟周期。所以,一个总线周期由若干个(>=4个)时钟周期(T)组成。 

            T1状态:CPU向多路复用总线上发送地址信息(A19~A0)指出要寻址的内存单元

            地址或I/O端口地址。这期间CPU还要送出地址锁存信号ALE(正向脉冲),在ALE

            的下降沿将内存单元地址或I/O端口地址存入地址锁存器。

            T2状态:CPU从总线上撤销地址,使总线低16位呈现高阻状态,为数据传输作准

            备。总线高4位(A19~A16)输出总线周期的状态信息,用以表示中断允许状态及

            正在使用的段寄存器名等。

             T3状态:A19~A16上状态信息不变,总线低16位上出现CPU要写出的数据或准备

             读入的数据。若外设或内存来不及与总线交换数据,以使在T4状态下结束该总线周

             期,则应通过CPU的READY信号,在T3前沿(下降沿)之前向CPU申请插入等待

             状态TW。在T3及TW的前沿查询READY线,查到为高电平则结束等待状态,进入

             下一状态。否则继续插入等待状态。

             注意:  查询READY信号的次数永远比插入Tw的次数多一次。

             T4状态:总线周期结束,若为总线读周期则在T4前沿将数据读入CPU。

             TI状态:总线空闲周期。

             基本总线周期是4个时钟周期

        2.  8086 CPU的引脚及功能  

             各种线的实际形式,和外界交换信息         

             ALE:高电平有效(工作时输出1,闲时输出0)

             RD(上面加一横线):低电平有效(工作时输出0,闲时输出1)  

              8086/8088 CPU有两种不同的工作模式(最小模式和最大模式),8条引脚(24~

              31)在两种工作模式中具有不同的功能。引脚图括号中是最大模式下被重新定义的

              控制信号。

              引脚信号的传输有以下几种类型:

                  * 输出:信号从CPU向外部传送;

                  * 输入:信号从外部送入CPU;

                  * 双向:信号有时从外部送入CPU,有时从CPU向外部传送(数据线是双向的)

                  * 三态:除了高电平、低电平两种状态之外,CPU内部还可以通过一个大的电阻

                               阻断内外信号的传送,CPU内部的状态与外部相互隔离,称为“悬浮态”。

                               高电平(1)    低电平(0)

2. 8086的存储器及I/O组织 

一、8086系统的存储器组织
       1.  8086系统的存储器的结构 

            一般情况下存储器都是8位数据线

            8086 因为有16条数据线所以支持一次性读写一个字或字节

            数据总线的低8位 总是出现偶地址单元的数据
            数据总线的高8位 总是出现奇地址单元的数据

           引脚:

               BHE(上面有一横线): 数据总线高八位是否有效引脚         

                                                对应数据总线高8位D8-D15,对应奇地址数据(有效为0,无效为

                                                1)

               A0:地址线最低位

                       对应数据总线低8位D0-D7,对应偶地址数据(有效为0,无效为1)

               谁为0谁有效

                   偶地址读一个字节(1 0)       括号里(奇,偶)

                   奇地址读一个字节(0 1)

                   偶地址读一个字(0 0)

                   奇地址读一个字:  (1)先读奇字节(0 1)    (2)后读偶字节(1 0)

           注意: 

               从偶地址读写一个字要用一个总线周期,所以从偶地址开始的字叫(规格/规范字)

               从奇地址读写一个字要用两个总线周期,所以从奇地址开始的字叫(非规格/规范字)

            关于几种读写情况的说明:

        2.  8086系统存储器的地址

            (1)物理地址的计算公式:

               物理地址=段地址×16+偏移地址。段地址由段寄存器提供,偏移地址由IP、SP、

               BP、SI、DI等寄存器或存储器提供,也可通过计算而得。不同的指令有不同的组

               合方式。

            (2)  段地址的引入,为程序在内存中浮动创造了条件,一般用户程序只涉及偏移地

                  址。段地址在程序装入内存时由操作系统分配。所以一个程序可在内存中任何一

                  个逻辑段(64KB空间)中运行。

            (3) 同一物理地址可以有不同的段地址和偏移地址表示。

            例如: CS=2000H  IP=1000H  物理地址=21000H

                        CS=2100H  IP=0000H  物理地址=21000H

       3.  8086系统内存地址的一些专用区域

            00000H~003FFH  1KB空间用于存放中断向量表,可存放256个中断服务程序的入口

            地址,每个地址占4字节。

            B0000~B0FFFH 4KB为单色显示器显示缓冲区,存放屏幕当前显示字符的ASCII

            码。

            B8000~BBFFFH 16KB彩色显示器显示缓冲区,存放当前屏幕像素代码。

            FFFF0H 起动地址,一般用来存放一条无条件转移指令,转到系统初始化程序。

            FFFF0H  是8086重新上电(复位)后第一条指令地址,因为重新上电或复位后CS

                            =0FFFFH  IP=0000H   代码从CS*16+IP=0FFFF0H开始执行


二、8086 I/O组织

       8086系统有专用的输入(IN)、输出(OUT)指令,用于外设端口(即外设接口中的内

       部寄存器)的寻址。

       I/O端口与内存分别独立编址。I/O端口使用16位地址A15~A0,I/O端口地址范围为

       0000H~FFFFH,可寻址空间为64KB

       在以8086为CPU的PC/XT微机中,只使用了10位有效端口地址A9~A0,共1KB空间。

       其中A9用于指明外设端口是否在系统板上。A9=0为系统板上512个端口,A9=1是I/O

       通道上的512个端口。

 3. 8086系统配置

一、最小模式和最大模式的概念

       8086/8088 CPU为适应不同的应用环境,8086可工作于两种工作模式:最大模式和最

       小模式。    

       最小模式:是指系统中只有一个8086/8088处理器,所有的总线控制信号都由8086/80

       88 CPU直接产生,构成系统所需的总线控制逻辑部件最少,最小模式因此得名。最小

       模式也称单处理器模式。   

       最大模式:系统内可以有一个以上的处理器,除了8086/8088作为“中央处理器”之外,

       还可以配置用于数值计算的8087(数值协处理器)和用于I/O管理的8089(I/O协处理器)

       等。各个处理器发往总线的命令统一送往“总线控制器”,由它“仲裁”后发出。

       两种工作模式由MN/MX(MX上面有一横线)引脚决定:

       接高电平(+5v),CPU工作在最小模式;

       接低电平(接地),CPU工作在最大模式。

二、最小模式系统

       1.  典型配置: 8086CPU

                               1片时钟发生器8284

                               3片地址锁存器8282

                               2片总线驱动器8286(总线数据收发器)

            CPU及其外围芯片合称为CPU子系统。

            外围芯片的作用是:

          (1)为CPU工作提供条件:提供适当的时钟信号,对外界输入的控制/联络信号进

                   行同步处理;

          (2)分离CPU输出的地址/数据分时复用信号,得到独立的地址总线和数据总线信

                   号,同时还增强它们的驱动能力;

          (3)对CPU输出的控制信号进行组合,产生稳定可靠、便于使用的系统总线信号。

       2.时钟发生器8284与8086的连接

            8284通过外接晶振芯片产生时钟信号,并对这个信号3分频,产生占空比为1/3的时

            钟信号CLK送往8086 CPU。8284还对外部输入的RESET和READY信号进行同步,

            产生与CLK同步的复位信号RESET和准备就绪信号READY送往8086。

     3.地址锁存器8282与8086的连接

          地址锁存器用来锁存8086输出的地址信号。

          8282是一个8位锁存器,STB是它的数据锁存/选通信号。STB为高电平时,DI7~DI0

          上输入的信号进入锁存器;STB由高变低出现下降沿时,输入数据被锁定,锁存器的

          状态不再改变。8282具有三态输出功能, OE是数据输出允许端,它为低电平时,锁

          存器的内容通过内部的三态缓冲器从引脚DO7~DO0输出。

          

           图中,8086的ALE与8282的STB相连。这样,8086在它的分时引脚AD15~AD0,

           A19/S6~A16/S3上输出地址信号时,20位地址被三片8282锁存。8282的输出成为

           系统地址总线。在8086访问存储器/IO设备的整个周期里,8282都会稳定地输出20

           位地址信号

           在最小模式下,8282还同时锁存了8086输出的控制信号并送往系统总线。

           8282也可以用其他具有三态输出功能的锁存器代替。
     4.  总线驱动器8286与8086的连接

          作用:总线数据收发器用来对CPU 与系统数据总线的连接进行控制,同时它还有增

                     加系统数据总线驱动能力的作用。

          8286是一种三态输出的8位双向总线收发器/驱动器,具有很强的总线驱动能力。它

          有二组8位双向的输入/输出数据线A7~A0和B7~B0。

          8286有二个控制信号:数据传送方向控制信号T,输出允许信号OE(低电平有效)

          当OE=1时,缓冲器呈高阻状态,两个方向都不能传送数据。

          当OE=0,T=1时,A7~A0为输入端,B7~B0为输出端,实现A 到B的传送;

          当OE=0,T=0时,A7~A0为输出端,B7~B0为输入端,实现B到A的传送。

           8286用作数据总线驱动器时,T与8086数据收发信号相连,用于控制数据传送方向;

           OE与8086数据允许信号相连,保证只有在CPU需要访问存储器或I/O端口时才允许

           数据通过8286。二片8286的A7~A0与8086的AD15~AD0相连,而二组B7~B0则成

           为系统数据总线。

           如果系统规模不大,并且不使用DMA传输(这意味着总线永远由8086独自控制),
           可以不使用总线收发器,将8086的引脚AD15~AD0直接用作系统数据总线。

三、最小模式下的系统控制信号

       1.读写控制信号引脚

       2. 中断控制信号引脚

       3.DMA控制信号引脚

      常用的最小模式控制总线信号归纳如下:

四、最大模式系统

       1. 最大模式下的有关引脚信号

       2. 8288总线控制器

第三章:指令系统

1. 8086/8088指令系统概述

一、8086/8088指令系统的特点

      1. 指令系统的兼容性

      2. 指令格式的灵活性

      3. 寻址方式的多样性

      4. 可对多种类型的数据进行处理

      5. 可构成多处理机系统

二、指令格式

       指令:指令是指示计算机完成特定操作的命令

       指令系统:指令系统是计算机能够执行全部命令的集合,它取决于计算机的硬件设计。                           指令系统因机而异,没有通用性。

       指令中应包含的信息:执行的运算    运算结果的去向    运算数据的来源

       指令格式:   操作码   [目的操作数],[源操作数]

                            操作码表示:执行何种操作

                            源操作数: 指令加工之前的数据

                            目的操作数:指令加工之后形成的数据

       指令中的操作数表征方法:

                           表征参加操作的数据本身——>立即数(在存储器的代码段)

                           表征数据存放的地址——>寄存器(cpu内部,例如AX,BX...),存储器(存放

                                                                     在存储器中,都带[ ],[ ]里的是偏移地址)

       操作数类型:

           1、立即数操作数:

                 表示参加操作的数据本身,可以是8位或16位

                 例: MOV  AX,1234H      

                         MOV  BL,22H  

                 立即数 无法作为目标操作数
                 立即数可以是无符号或带符号数,其数值应在 可取值范围

   2、寄存器操作数:

         表示参加运算的数存放在指令给出的寄存器中,可以是16位或8位。

         例:MOV  AX,BX

                MOV  DL,CH

   3、存储器操作数:

         表示当前参加运算的数存放在存储器的某一个或某两个单元中
         例:MOV  AX,[1200H]  

                MOV  AL, [1200H] ;   [ ]里的是偏移地址

        高高低低原则:

              高地址存高位
              低地址存低位

        指令的字长与指令的执行速度:

     指令字长由操作码的长度、操作数地址长度、操作数个数决定
     8088/8086CPU采用变字长指令格式
     指令的字长影响指令的执行速度   
     对不同的操作数,指令执行的时间不同
     寄存器>立即数>存储器

三、寻址方式

       计算机可以对存储器、寄存器中的数据进行各种操作,如取数、存数、加运算、减运算

       等,这就需要找到数据的存放地址,再对其中的数据执行相应的操作,最后将运算结果

       送往指定的地址单元或寄存器。指令的寻址方式就是寻找指令操作数所在地址的方式

       以确定数据的来源和去处。熟练地掌握寻址方式对学习指令系统和汇编语言程序设计具

       有重要作用。

       1. 立即寻址

   指令操作数部分直接给出指令的操作数,它与指令操作码相接,顺序存放在代码段
   中。立即数有 8位和16位之分。

           例1 : MOV   AH,36H  ;  AH<——立即数36H

                       MOV   CX,2A50H  ;   CX<——立即数2A50H

          注意:

          (1) 立即寻址方式只能用于源操作数,主要用于给寄存器赋值。

          (2) 立即寻址方式不执行总线周期,执行速度快。

      2. 寄存器寻址

          操作数放在寄存器内,由指令直接给出某个寄存器的名字,以寄存器的内容作为操作

          数。

          寄存器可以是16位的AX、BX、CX、DX、SI、DI、SP、BP寄存器,也可以是8位的

          AH、AL、BH、BL、CH、CL、DH、DL寄存器。 

  例:    MOV  AX,CX ;   AX<-------CX

                     DEC  AL ;    AL<-------AL-1

  注意:

   (1)寄存器寻址方式的指令操作在CPU内部执行,不需要执行总线周期,执行速度

            快。

   (2)寄存器寻址方式既适用于指令的源操作数,也适用于目的操作数,并且可同时

            用于源操作数和目的操作数。

      3. 直接寻址

  操作数在存储器中,指令中直接给出操作数所在存储单元的有效地址EA,即段内偏移
  地址,表示操作数所在存储单元距离段首址的字节数。有效地址是一个无符号的16位
  二进制数。

  例:MOV  AH,[2100H]   ;将DS段中2100H单元的内容送给AH

         MOV  AX,[2100H]   ;将DS段中2100H单元的内容送给AL ;2101H单元的    

                                               内容送给AH。

         MOV   [1000H],AH   ; DS:1000H←(AH)

          DS=3000H         MOV  AX,[2000H]

  注意:

   (1) 直接寻址方式的操作数所在存储单元的段地址一般在数据段寄存器DS中。

   (2) 如果操作数在其他段,则需要在指令中用段超越前缀指出相应的段寄存器名。

          例:MOV  AH, ES∶ [2000H] 

                 将附加段寄存器ES的内容乘16,再加上2000H作为操作数所在存储单元的地

                 址,取出该存储单元的内容送到寄存器AH中。

      4.  寄存器间接寻址

           操作数在存储器中,指令中寄存器的内容作为操作数所在存储单元的有效地址EA
         (偏移地址)。寄存器仅限于BX、BP,SI、DI。

           EA:[SI] [DI] [BX] [BP]

           当使用BX、SI、DI时,操作数所在存储单元的段地址存在数据段寄存器DS中
           当使用BP时,操作数所在存储单元的段地址存在堆栈段寄存器SS中。
           MOV   BX,[SI]         

           例:已知: DS=2100H,DI=2000H

                  指令:  MOV AX,[DI]

                  解: 物理地址=16×DS+DI=16×2100H+2000H=23000H

                  指令执行结果是将23000H和23001H单元的内容送入寄存器AX中。

           注意:

                 1.  只有SI,DI,BX,BP 可作为间址寄存器。
                 2.  若操作数所在存储单元不在数据段DS中,需要在指令中用段超越前缀表明其

                      所在段的段名。

      5.  相对基址寻址

   操作数在存储器内,指令中寄存器 (BX或BP)的内容与指令指定的位移量之和作为操
   作数所在存储单元的有效地址EA(偏移地址)。       

           使用BX时,段地址为DS的内容;

   使用BP时,段地址为SS的内容。

           例:

               SS=2000H,BP=1000H,COUNT=2000H (16位偏移量)

               指令: MOV AX,COUNT[BP]

               解:物理地址=16×SS+BP+16位偏移量=20000H+1000H+2000H=23000H

               指令执行结果是将23000H和23001H单元的内容送入寄存器AX中。

              MOV   BL,2[BX]  或  MOV  BL,[BX+2]  ;(DS:[BX+2])-->BL

      6.  相对变址寻址

   操作数在存储器内,指令将变址寄存器SI、DI内容与指令指定的位移量之和作为操
   作数所在存储单元的有效地址EA(偏移地址)。段地址规定为DS的内容。

           例 :DS=3000H,SI=1000H,COUNT=2000H

                   指令: MOV AX,COUNT[SI]

                   解:物理地址=16×DS+SI+16位偏移量=30000H+1000H+2000H=33000H

                   指令执行结果是将33000H和33001H单元的内容送入寄存器AX中。

           MOV  AX,2[DI];AX← (DS:(DI)+2)

           MOV  AX,[DI+2];AX← (DS:(DI)+2)

           MOV  BX,COUNT [SI]

      7.  相对基址加变址寻址

   操作数在存储器内。指令将基址寄存器BX、BP与变址寄存器SI、DI的内容之和再
   加上偏移量(8位或16位),得到操作数所在存储单元的有效地址EA。   

   当使用BX时,段寄存器为DS。

   当使用BP时,段寄存器为SS。

   注意: BX和BP或SI和DI只能出现一个,

            不能同时出现BX和BP或SI和DI,

            计算物理地址时段地址寄存器根据基址寄存器来

           例:已知: DS=2000H,BX=1000H,SI=0500H,MK=1120H

                  指令: MOV  AX, [MK+BX+SI]

                  解: 物理地址=20000H+1000H+0500H +1120H=22620H

                  指令执行结果是将22620H、22621H单元的内容送入寄存器AX中。

             MOV  AX,[BX][SI]

         8. 字符串寻址

             用于字符串操作指令。规定变址寄存器SI中的内容是源数据串的段内偏移地址,

             而变址寄存器DI中的内容是目标数据串的段内偏移地址。

             源数据串的段地址规定是数据段DS,目标数据串的段地址规定是附加段ES。指令

             执行后SI和DI的内容自动增量(或减量),增(或减)值为1或2。

             例 : MOVSB

             执行后:  [DI]←[SI]     SI←SI±1     DI←DI±1

        9.  I/O端口寻址

             寻找输入输出设备的端口地址,可分为直接端口寻址和间接端口寻址。

             直接端口寻址:由指令直接给出I/O设备的端口地址。它规定端口地址为8位,能寻

                                      址256 个端口

             间接端口寻址:由DX给出I/O设备的端口地址。由于DX是16位,因此间接端口寻址                                         能寻址多达64K个端口。

             例:IN  AL,20H ;将地址为20H的外设内容读入AL中

                    OUT   DX,AL;AL中内容输出给以DX的内容为地址的外设

        10.  隐含寻址

               指令隐含了的一个或两个操作数的地址,即操作数在默认的地址中。

               例: AAA; 对AL中的内容进行十进制加法调整,并把调整后的结果放入AH和AL

                       中。这条指令的隐含操作数是AH和AL。

2. 8086的指令系统

指令系统包括九大类、133种基本指令,通过寻址方式的变化与数据形式(字节、字型)的组合,可构成上千条指令。指令系统按功能分为数据传送类、算术运算类、逻辑运算与移位类、串操作类、控制转移类、处理机控制、输入输出、中断等。


(一). 数据传送指令

      数据传送类指令实现CPU内部寄存器之间、CPU与存储器之间、CPU与I/O端口之间的数

      据传送。

      1. 通用数据传送指令

          包括 MOV、进栈、出栈指令、交换指令和换码指令。     

        (1)一般数据传送指令 MOV(8位/16位)

                 格式:MOV    OP目地操作数,OP源操作数

                 功能:OP源 ——> OP目

                 要求:OP目可以是寄存器(除CS外)、存储器

                            OP源可以是寄存器、存储器和立即数

         例:    MOV   AL,BL ;     BL寄存器的内容送AL

                    MOV   SP,2AC0H ;  立即数2AC0H送SP

                    MOV  [DI],AX ;    AX中的16位数送DI和DI+1单元

                    MOV   SI,ES:[BP]  ; 附加段中BP所指向的两个单元的内容送SI寄存器

                    MOV   WORD PTR [SI],6070H    ;立即数6070H送到SI字单元。

         注意: MOV指令的两个操作数(源、目的)均可采用不同的寻址方式。

                     源操作数和目的操作数的类型必须一致(位数必须一样)
                     不允许把立即数作目的操作数,也不允许向段寄存器送立即数。
                     例如: MOV [XX],[XX]        MOV SS,ES
                     不允许在段寄存器之间、存储器单元之间传送数据。
                     CS、IP寄存器不能用作目的操作数
                     一般传送指令不影响标志位。

          例:判断下列指令正确与否:

                 MOV   AL,  BL            √

                 MOV    CX,  BX           √

                 MOV    BX,  DL           ×   类型不一致

                 MOV    DX,   0034H          √

                 MOV    DS,   1234H    ×   立即数不能送段寄存器

                 MOV     ES,   AX            √

                 MOV     CS,   BX         ×    CS不能作目的操作数

                 MOV    [SI],   CX          √

                 MOV    [DI],   [SI]         ×   不能同时为存储器操作数

                 MOV    2000H,  AX      ×   目的不能为立即数

                 MOV    DS:[2000H],  AX      √

(2)堆栈操作指令

         堆栈:是按“后进先出”原则工作的一段存储器区域。

         堆栈寄存器SS——段地址

         堆栈指针SP——始终当前栈顶所在的存储单元地址,即最新入栈数据所在的存

         储单元的地址。

         压栈操作PUSH    OP

         功能:把OP字数据压入栈中,结果SP-2 ——> SP

         原则:高字节压在高地址,低字节压在低地址  

         执行过程:   SP←SP-1;    [SP] ←OPH

                              SP←SP-1 ;   [SP] ←OPL

         例:PUSH   AX

               (1)  SP-1 ——> SP,压AH

               (2)  SP-1 ——> SP,压AL

         出栈操作: POP   OP

         功能:从栈中弹出数据 —> OP,结果SP+2 —> SP

         执行过程:  OPL ←[SP];      SP←SP+1

                             OPH←[SP] ;      SP←SP+1

         例:POP   DX

               (1) 弹出AL —> DL, SP+1 —> SP
               (2) 弹出AH —> DH, SP+1 —> SP

        例:将CX的内容压入堆栈,然后,弹出栈顶至CX中, 已知 (SS)=0200H,(SP)

               =0008H,(CX)=12FAH。

注意: 堆栈操作总是按进行的。

            压入指令,SP-2,数据在栈顶。弹出指令正好相反。
            操作数可以是存储器、寄存器或段寄存器操作数( CS不能用于POP ),
            不能是立即数。

            PUSH CS  √      POP CS ×

            PUSH 1200H ×   POP 2300H ×

            这两条指令主要用来进行现场保护和恢复,以保证子程序调用或中断程
            序的正常返回。

       (3) 数据交换指令(8/16位)

                 格式: XCHG    OP1,OP2

                 功能:实现OP1和OP2内容的相互交换。

                 操作数:通用寄存器或存储器,但不能均为内存单元。

                 注意: 段寄存器和IP不能作为交换指令的操作数。

                 例:XCHG    AX,  BX          √

                        XCHG     BH,  BL         √

                        XCHG    AX,   1122H      ×

                        XCHG     DS,    AX          ×

                        XCHG    [SI],    BP           √

                        XCHG    [SI],    [DI]        ×

       (4) 换码指令(查表指令、翻译指令)

                 换码指令是一条完成字节翻译功能的指令。它可以使累加器中的一个值变换为

                 内存表格中的某一个值,一般用来实现编码制的转换。  

                注意:  1.  使用前,先建立被转换代码(字节型)的数据表。

                             2.  换码指令只能使用寄存器BX、AL,不影响标志位。

                例:数据段中存放有一张ASCII码转换表,设首地址为2000H,现欲查出表中第9

                       个代码的ASCII码(设DS=4000H)。

                       可用如下指令实现:

                       MOV BX,2000H ;BX←表首地址

                       MOV  AL,09H  ;AL←序号

                       XALT          ; 查表转换

                       执行后得到:AL=39H

   2. 目标地址传送指令

       此类指令的功能是将操作数所在存储器的地址送入目标寄存器。

       注意:OP源必须是存储器操作数,OP目必须是16位的通用寄存器 。

                  地址传送指令不影响状态标志位。    

     (1)取有效地址(偏移地址)EA指令(去中括号指令)

      格式:LEA  OP目, OP源
      功能:将源操作数的有效地址EA送到目的操作数。
      例:  LEA   AX,[5678H]; AX ← 5678H
               LEA  BX,[BP+SI];  BX ←BP+SI

     (2)指针送寄存器和DS指令(不重要)

              格式:  LDS    OP目,OP源

              功能:把OP源指定的4个字节内容取出,低地址的两字节—>OP目,高地址的两字

                         节——>DS。

              例: LDS DI,[2130H];2130H和2131H单元中的内容——>DI                

                 2132H和2133H单元中的内容——>DS

   

     (3)指针送寄存器和ES指令(不重要)

              格式:LES    OP目,OP源

              功能:本指令与LDS指令的操作基本相同,所不同的是将OP源4个字节中高地址

                         的两字节——>ES。

              例:LES DI,[2130H];

                     2130H和2131H单元中的内容®DI;              

                     2132H和2133H单元中的内容®ES


(二). 算术运算指令

       8086的算术运算类指令能够对二进制或十进制(BCD码)数进行加、减、乘、除运算,

       操作数的数据形式可以是8位或16位的无符号数或带符号数。

       1.  加法指令

            (1) 不带进位的加法指令:

     格式:ADD   OP目, OP源  ;

     功能:OP目← OP源 + OP目,根据结果设置标志位

     例:ADD  AL,50H   ;   AL+50H——>AL

            ADD  DI,SI  ;  DI+SI ——>DI

            ADD  AX,[DI] ; (DI)、(DI+1)内容+AX ——> AX

                        ADD [BX+DI],AX ;(BX+DI)和(BX+DI+1)2个单元的内容+AX,

                                                             结果放在BX+DI和BX+DI+1所指单元     

                        ADD AX,[BX+2000H] ;BX+2000H 和BX+2001H所指单元内容和AX的内

                                                                 容相加,结果在AX中

                  注意:两操作数的类型相同,类型明确,不能同为存储器操作数 

                  例:判断下列指令正确与否

                         ADD     AL,    BX                 ×

                         ADD      CL,     CH               √

                         ADD      AX,    [BX]              √

                         ADD      [BX],    [SI]              ×

                         ADD      1000H,   AX             ×

                         ADD      [SI],    BX                 √

            (2) 进位的加法指令:

         格式:ADC   OP目, OP源 ;

         功能:OP目← OP源 + OP目+CF,置标志位    CF为前面指令产生的CF

                 说明:主要用于多字节运算(例如16位加16位),多字节运算时低位字节产生的进

                            位应加到高位。

                 例:ADC  AX,SI ; AX+SI+CF —> AX

                 例: 两个双字(32位)相加。123FAB5H+0ABC212AH

         (3) 加1指令

                 格式:INC   OP    

                 功能:OP←OP+1

                 说明:常用于修改偏移地址和计数次数。操作数可以是8/16位通用寄存器或存

                            储器操作数,不能为立即数。

                  例:   INC  AL ;AL←AL+1

 INC BYTE PTR [BX+DI];[BX+DI]←[BX+DI]+1

                  例:判断对错

                         INC    CL         √

                         INC   [DI]         ×    ——>  INC  BYTE  PTR[DI]  √ 

                         在存储器单元声明时需要说明是BYTE还是WORD

                         INC   2000H   ×

                  注意: ① INC指令不影响CF位,影响标志位AF、OF、PF、SF和ZF。

                              ② 操作数视为无符号数。

             总结:以上三条指令运算结果将影响状态标志位,但 INC不影响标志CF。

       2.  减法指令

 (1)不带借位的减法指令

          格式:SUB    OP目,OP源

          功能: OP目← OP目-OP源 ,并根据结果设置标志

          例: SUB   BX,CX ;   BX-CX —> BX

                  SUB   AL,[SI+2];    AL-(SI+2)单元中的数 —> AL

                  SUB   AL,20    ;  AL-20 —> AL

 (2)带借位的减法指令

          格式:SBB   OP目,OP源

          功能:OP目← OP目-OP源 -CF,根据结果设置标志

          说明:主要用于多字节或多精度数据相减的运算

          例: SBB   AX,2030H ;     AX- 2030H-CF —> AX                      

                  SBB   WORD PTR [DI+2],1000H ;将DI+2和DI+3所指两单元的内

                  容-1000H-CF, 结果存在DI+2和DI+3所指的单元

 (3)减1指令

          格式:DEC   OP      

          功能:OP←OP-1;根据结果置标志位,不影响CF

          例:DEC   AX   ;      AX-1 —> AX

                 DEC   BL   ;    BL-1 —> BL

                 DEC  BYTE  PTR [DI+2];  将DI+2所指单元的内容减1,结果送回此单元     

         (4)取补指令

                  格式: NEG   OP      

                  功能: 0- OP→ OP,  将操作数取补后送回原操作数              

                              OP可以是8/16位通用寄存器和存储器操作数,  不能为立即数。

                  例:NEG  AL       ;  0- AL ——>  AL

                         MOV  AX,1  ;  AX=0001H    

                         NEG  AX         ;  AX=0FFFFH

                  注意:  (1) 对80H或8000H取补时,操作数没有变化,但OF=1。

                       (2) 对CF影响较特殊,只要操作数不是0,总是使CF=1       

 (5)比较指令

          格式:CMP   OP目,OP源

          功能:OP目-OP源,不回送结果,只根据结果置标志位。  

          例:  CMP  AX,BX ;AX-BX,根据结果置标志位

   CMP   AL,20H ; AL-20H,根据结果置标志位

          说明:本指令主要通过比较(相减)结果置标志位,表示两个操作数的关系,

                     指令执行的结果不影响目标操作数。

          用途:用于比较两个数的大小,可作为条件转移指令转移的条件   

     

    3.   乘法指令

          (1) 无符号数乘法

               格式:MUL   OP  

               功能:AX←AL×OP           8位数乘法

                         (DX高16、AX低16)←AX×OP    16位数乘法

          (2) 带符号数乘法

               格式: IMUL     OP 

               功能: 操作同上,但是操作数为带符号数

           注意:(1)进行字节运算时, OP目必须是AL,乘积在AX中;进行字运算时, OP

                               目必须是AX,乘积在DX、AX中。 源操作数不允许使用立即数寻址方

                               式。

                      (2)运算结果只影响CF、OF,其他的无定义。

                      (3)对于MUL,若字节型数据相乘之积AH=0或字数据相乘之积DX=0,

                               则CF=OF=0,否则CF=OF=1;

                               对于IMUL指令,若字节数据相乘之积AH或字数据相乘之积DX的内容

                               是低一半的符号扩展(低八/四位的最高位扩展到了高八/四位的每一位),

                               则CF=OF=0,否则CF=OF=1。

            例:已知 AL=0FEH,

                   视为无符号数为254,视为带符号数,数值为-2。  

                   BH=0AH,视为无符号数为10,视为带符号数,数值为+10。

                   执行指令MUL    BH  后 AX=09ECH,CF=OF=1  

                   执行指令IMUL  BH  后 AX=FFECH,CF=OF=0

            例:MUL BL  ;AL×BL —> AX中

                   MUL CX  ;AX×CX —> DX AX

                   MUL BYTE PTR  [DI];AL × [DI] —> AX

                   IMUL BX  ;AX和BX中的两个有符号数相乘,结果在DX和AX中

            例: 设在M1和M2单元中各有一个16位无符号数,求其乘积,将结果存于从R开始的

                  字单元中。

                  MOV  AX,M1

                  MUL  M2

                  MOV  R,AX

                  MOV  R+2,DX

       4.  除法指令

            指令要求被除数是除数的双倍字长,即当除数是8/16位时,要求被除数是16/32位

            的二进制数。

          (1)无符号数除法

                  格式:DIV   OP

                  功能: 字节除法:AX/OP ——> AL =商,AH =余数      16位/8位

                              字除法: (DX、AX)/OP  ——> AX =商,DX =余数          32位/16位          

          (2)带符号数除法

                   格式:IDIV     OP

                   功能:操作同DIV,但是操作数为带符号数

                  注意: (1) 当除数是字节时,被除数必须放在AX中,

                                   当除数是字时,被除数必须放在DX,AX中。

                              (2) 商超出规定的范围时,将产生0号中断。

                              (3) IDIV运算结果余数的符号与被除数相同。

                              (4) 带符号数除法运算中,当被除数位数不够时,则需将被除数扩展到

                                    所需的位数。( 8086/8088设有带符号数扩展指令)

                   例:  DIV  CL  ;AX/CL,商 —> AL,余数 —> AH

                            DIV WORD PTR [DI];

                            DX和AX中32位数除以DI、DI+1所指的16位数,商—>AX,余数——>DX

                            IDIV  BX   ;DX、AX/ BX,商—>AX,余数—>DX                            

                            IDIV BYTE PTR[DI] ;AX中16位数除以DI所指单元中的8位数,

                            商—>AL,余数—>AH

    (3)  符号扩展指令格式:

           字节扩展指令(8位—>16位)

          格式:CBW

          功能:将AL中的数的符号位扩展到AH

          规则:若最高位=1,则执行后AH=FFH

                     若最高位=0,则 执行后AH=00H

          字扩展指令(16位—>32位)

          格式: CWD     

          功能:将AX中的数的符号位扩展到DX,

          规则:若最高位=1,则执行后DX=FFFFH

                     若最高位=0,则执行后DX=0000H

          这两条指令不影响标志位

                  例:分析指令执行后的结果    

                        MOV  AL,44H

                        CBW                 结果:AX=0044H

                        MOV  AX,0AFDEH

                        CWD                结果DX=FFFFH,    AX=0AFDEH

                        MOV  AL,86H

                        CBW                结果:AX=FF86H

     5.  十进制运算调整指令

          BCD码:二进制编码的十进制数,又称为二—十进制数。

          非组合(非压缩)BCD码:用一个字节表示一位十进制数。

          组合(压缩)BCD码:用一个字节表示二位十进制数。

          由于BCD码是四位二进制编码,四位二进制数共有16个编码,BCD码只用其中的

          10个,其余没用的编码1010~1111称为无效码。BCD码运算结果进入或跳过无效

          码区时,都会出现错误。为了得到正确结果,必须进行调整。

         (1)  非组合BCD码的加法调整指令

                格式:AAA

                功能:对AL中的由两个非组合BCD码相加的和进行调整,结果(非组合BCD码)

                          存于AX中。

                调整过程:若AL的低4位大于9或AF=1,则AL←AL+6, AF←1,CF←1,

                                  AH←AH+1,清除AL的高四位;否则清除AL的高4位以及AF和CF

                                  标志;

         (2)  组合BCD码的加法调整指令

                格式: DAA

                功能:对AL中的由两个组合BCD码相加的和进行调整,将结果(组合BCD码)

                           存于 AL中。

                调整过程: 调整方法与AAA类似,只是此指令要分别考虑AL的高4位和低4位。

    若AL低4位大于9或AF=1,则AL+6→AL,置AF=1;

    若AL高4位大于9或CF=1,则AL+60H→AL,置CF=1

                注意:以上两条指令使用时必须紧跟在ADD或ADC之后 。   

          (3) 非组合BCD码的减法调整指令

                格式: AAS 

                功能:对AL中由两个非组合BCD码相减的差进行调整,将结果(非组合BCD码)

                           存于AL中。

                调整过程:调整方法与AAA类似,不同的是当AL的低4位表示的数大于9或AF=1

                                  时,将AL-6→AL,AH-1→AH,并将AF和CF置1,清除AL的高四位。

          (4) 组合BCD码的减法调整指令

               格式: DAS

               功能:对AL中由两个组合BCD码相减所得的结果进行调整,并将结果(组合BCD

                         码)存于AL中。

               调整过程:调整方法与DAA类似,不同的是当AL的低4位>9或者 AF=1,则AL-                                         6→AL,并置AF=1;而当 AL的高4位大于9或者 CF=1时,则AL-60H

                                 → AL,并置CF=1。

               注意:使用AAS、DAS指令必须紧跟在减法指令之后。

          (5) 非组合BCD码的乘法调整指令

                格式: AAM 

                功能:对AX中的由两个非组合BCD码相乘所得的结果进行调整,并将调整后的

                           结果存于AX中。

                 调整过程:AH←AL/0AH(商),AL←AL%0AH(余数)

                 注意:本指令必须紧跟在MUL指令之后使用

          (6) 非组合BCD码的除法调整指令

               格式: AAD 

               功能:把AX中的两个非组合BCD码进行调整,然后可用DIV指令实现两个非组合

                         BCD码的除法运算

               调整过程: AL←10×AH+AL,AH←0

               注意:本指令必须在DIV运算前使用

          总结: DAA或DAS必须用在ADD(ADC)或SUB(SBB)之后,结果对OF无影响,

                      对其他状态标志位均有影响。

                      AAA或AAS必须用在ADD(ADC)或SUB(SBB)之后,结果影响AF和CF,
                      对其他标志位均无意义。
                      AAM必须用在MUL之后,结果影响SF、ZF和PF,对AF、CF和OF无影响。
                      AAD必须用在DIV之前,结果影响SF、ZF和PF,对AF、CF和OF无影响。

   例:设在AX和BX中分别存有用组合BCD码表示的十进制数,编写程序段将两个数相

          加,结果存于AX中。

          ADD  AL,BL  ;低字节相加

         DAA  ;低字节调整

         MOV  CL,AL  ;暂存低字节

         MOV  AL,AH 

         ADC  AL,BH  ;高字节相加

         DAA  ;高字节调整

         MOV  AH,AL 

         MOV  AL,CL  ;存放结果于AX中

           例:在1000H中开始的单元中,连续存放着4个压缩BCD码表示的两个十进制数,

                  将两个数相加(相减),结果送回1000H中。

                  MOV SI,1000H

                  MOV AL,[SI]             

                  ADD  AL, [SI+2]   ;低字节相加

                  DAA  ;低字节调整

                  MOV  [SI],AL  ;暂存低字节

                  MOV  AL, [SI+1]  

                  ADC  AL, [SI+3]  ;高字节相加

                  DAA  ;高字节调整

          MOV  [SI+1] ,AL  ;存放结果于AX中


(三). 逻辑运算指令

         OP源:  8/16位通用寄存器、存储器操作数或立即数   

         OP目:  通用寄存器和存储器操作数。

         除“非”运算外,其余指令都会使OF=CF=0

         1. 逻辑与运算指令

             全1出1,有0出0

             格式:AND  OP目,OP源

             功能:对两个操作数按位进行与操作,结果回送OP目。

             说明:该指令常用于截取(或屏蔽)若干位二进制数

             例:已知AL=46H,将AL的低4位保留,高4位屏蔽。        

                     AND  AL,0FH;

                     AL=06H , 屏蔽高位(高位清0) ,取出低位;

                                       即对应位为0则清0,对应位为1则不变                                         

         2. 逻辑或运算指令

             有1出1,全0出0

             格式:OR OP目,OP源

             功能:对两个操作数进行或运算,结果回送到OP目。

             说明:可用于组合某个字,或将某位置1。

             例:MOV  AX,8888H;

                    OR  AX,00FFH  ;

                    AX=88FFH,将AX的低8位置1,其他位不变。

                                         即对应1位置1,对应0位则不变。

             例:将AL中的非组合BCD码转换成ASCⅡ码

                    OR   AL,30H

         3. 逻辑异或运算指令

             相同为0,不同为1

             格式:XOR OP目,OP源

             功能:对两个操作数进行异或运算,结果回送到OP目。

             说明:用于对某个二进制数按位取反或对某寄存器清0。

             和0异或不变和1异或取反

             例: XOR   AL,0FFH ;   AL数据按位求反 

             例:    MOV   AX,  3333H
                      XOR   AX,  00FFH ; 

             结果:AX=33CCH, AH数据保持不变,对AL数据求反。即对应0不变,对应1求反

             例:寄存器清0(有4条指令可达到AX清0目的):

                    XOR   AL,AL    ;      AL清0

                    MOV  AX,0

                    SUB  AX,AX

                    AND  AX,0   

             例:将0-9转为ASCII或将ASCII转为0-9   XOR AL,30H

          4. 逻辑非运算指令

              整体取反

              格式:NOT OP

              功能:对操作数逐位取反后回送到原处。

              例: MOV  AX,1

                      NOT   AX         ;

                      AX=0FFFEH

              注意:  (1)该指令只是执行求反操作,而不是求反码指令,对符号位也求反。

(2)不影响标志位。

          5. 测试指令

              格式:TEST OP目,OP源

              功能:将OP目与OP源进行与运算,不回送结果,只根据结果置标志位。

              说明:主要用来检测目的操作数的某些位是1或0,根据测试结果,决定转向

              例:测试AX中的D15位是1还是0

                     TEST    AX,8000H;

                     若D15为1,ZF=0,否则ZF=1 

          总结:

                (1)AND  OR   XOR  TEST均影响标志,CF=0,OF=0,而PF,SF,ZF由结

                         果而定,AF无意义。此类指令可用来清CF,常用于拆字,拼字。

                (2)NOT 不影响标志。

          例: 让AX清零的几个办法:

                ① 给AX送0  MOV AX, 0

                ②自己减自己  SUB AX,AX

                ③与运算(有0出零) AND AX,0

                ④异或  XOR,AX,AX


(四). 移位指令

         移位操作:    (1)非循环移位:逻辑移位、算术移位

                             (2)循环移位:不带进位的移位、带进位的移位

         规定:移动一位时由指令中的计数值直接给出;移动两位及以上,则移位次数由CL

                    指定,即必须将移位位数N事先装入CL中。

         1. 非循环移位指令

              逻辑左移算数左移:最高位移进CF,最低位补零

              逻辑右移:最低位移进CF,最高位补零

              算数右移:最低位移进CF,最高位补本身(最高位是什么就补什么)

              算术左移与逻辑左移相同,可用于无符号数乘2操作;

              逻辑右移可用于无符号数除2操作;

              算术右移可以用于有符号数除2操作。

              算术逻辑移位指令是双操作数指令,操作数可以是除立即数之外的任何寻址方式, 

              当计数值大于1时,必须使用CL作计数器。

      例:MOV   BX, FFFCH

             SAR     BX,1

             结果:  BX=FFFEH,BX由-4变为-2

      例:  MOV  BL,0CH  ;BL=12

             SHL    BL,    1      ;    BL=24 

              例:  对AX内容进行乘10运算(设无溢出,乘10后仍为一个字)

                    分析:  AX * 10=AX *(2的三次方+2)=AX * 2+AX *2的三次方

                    程序:MOV  BX,   AX

                               SAL    BX,   1        ; 原数*2àBX

                               MOV  CL,    3

                               SAL    AX,  CL      ; 原数*23àAX

                               ADD   AX,  BX      ; 原数*10àAX

         2.  循环移位指令

             (1)不带进位的循环移位

                     循环左移:ROL  OP目,计数值

                                       把最高位移给CF的同时移给最低位

                     循环右移:ROR  OP目,计数值 

                                       把最低位移给CF的同时移给最高位

              (2)  带进位的循环移位

                    循环左移:RCL  OP目,计数值

                                      CF移给最低位,最高位移给CF

                    循环右移:RCR  OP目,计数值

                                      CF移给最高位,最低位移给CF


(五). 字符串操作指令

         串操作指令实现对一串字符或数据的操作,分为基本串操作指令重复前缀指令。基

         本串操作指令每执行一次只能处理一个数据,与重复前缀指令结合可以处理一串数据。

         串操作有如下共同点:

             (1)源串一般存放在数据段(DS),偏移地址由SI指定, 目标串在附加段(ES),偏移

                 地址由DI指定。

             (2)每执行一次串操作后自动修改指针SI、DI。若方向标志DF=0,则每次操作后

                   SI和DI自动加1(或加2);若DF=1,则每次操作后SI和DI自动减1(或减2)修改。

             (3)串长(字或字节个数)存放在CX中。

         注意:在执行指令前必须DS、ES、SI、DI、DF、CX置好需要的值,它们是串操作

                    指令的隐含操作数。

         1.字符串串操作指令

            (1)字符串传送指令 

                格式: MOVS  OP目,OP源(必须说明操作数的类型,确定是字节/字传送)

                            MOVSB——字节传送

                            MOVSW——字传送

                功能:把位于数据段由SI指定的内存单元的字节/字数据传送到附加段由DI指定

                           的内存单元,指令不影响状态标志位。

                过程:[DI]←[SI]  若DF=0 SI←SI+1/2,DI←DI+1/2

                           [DI]←[SI]  若DF=1 SI←SI - 1/2,DI←DI-1/2

                说明:串传送指令常与无条件重复前缀连用

            (2)字符串比较指令

                格式: CMPS    OP目,OP源

                            CMPSB   ——字节比较

                            CMPSW ——字比较

                功能:把位于数据段由SI指定的字节/字数据与附加段由DI指定的字节/字数据进

                           行比较,结果不保存,但影响状态标志位,并由DF状态决定SI、DI的修

                           改方向。

                过程:[SI] -[DI]   SI←SI±1/2,DI←DI±1/2

                说明:串比较指令常与条件重复前缀连用,指令的执行不改变操作数,仅影响标

                           志位。

             (3)字符串搜索指令 

                 格式:  SCAS   OP(目标操作数)

 SCASB

 SCASW

                 功能: 把AL/AX中的内容与附加段由DI指定的一个字节/字数据进行比较,结果不

                          保存,但影响状态标志位,并由DF状态决定DI的修改方向。    

                 过程:字节——AL-[DI],DI←DI±1

                            字——AX-[DI],DI←DI±2

            (4)取字符串指令(不常用)

                 格式:LODSB   ——AL←[SI],SI←SI±1

   LODSW  ——AX←[SI],SI←SI±2

                 功能:把位于数据段由SI指定内存单元的内容取到AL或AX中,并修改SI的内容,

                            指向下一字节/字单元。   

            (5)存字符串指令(不常用)

                格式:STOSB ——[DI]←AL,DI←DI±1

  STOSW ——[DI]←AX,DI←DI±2

                功能:  把寄存器AL或AX中的内容存到附加段由DI指定的内存单元,并修改DI的

                          内容,指向下一字节/字的存放单元。
        2. 重复前缀指令

            基本串操作指令每执行一次只能处理一个数据,与重复前缀指令结合可以处理一串

            数据。

         

        注意:         

    (1)重复前缀指令不能单独使用,其后必须紧跟基本串操作指令,控制基本串操作
             指令重复执行。其执行过程相当于一个循环程序的运行。在每次重复之后,地
             址指针SI和DI都被修改,但指令指针IP仍保持指向带有前缀的串操作指令的地
             址。
    (2)重复执行次数由数据串长度决定,数据串长度应预置在寄存器CX中。
    (3)执行重复前缀指令不影响标志位。
JZ 表示ZF=1跳转
JNZ表示ZF不等于0跳转
        CLD会让DF=0  STD会让DF=1

(六). 转移指令

        一. 寻址方式

             控制转移指令在段内、段间转移时,使用直接(相对)寻址或间接寻址方式。

             1. 直接寻址方式

                 段内直接寻址方式——目标程序和源程序在同一个程序段内,只给出源地址和目

                 标地址的差值,此差值是偏移量,它是一个以IP为基准的8位或16位的带符号补

                 码数。

                 段间直接寻址方式——直接给出转移目标地址的段地址和段内位移量,用前者取

                 代CS当前的值,用后者取代IP中当前的值,使程序从一个代码段转移到另一个

                 代码段。

             2.  间接寻址方式

                  段内间接寻址方式——指令转移的有效地址存在一个寄存器或存储器单元中,

                  用它取代当前IP的值,实现程序转移。

                  段间间接寻址方式——指令给出一个存储器地址,从该地址开始的4个字节单元

                  中存放转移目标地址的段内偏移量和段地址,这两个地址在指令执行时用于取

                  代当前的IP和CS的内容,使程序从一个代码段转移到另一个代码段。

        二. 转移指令

              通过修改指令的偏移地址或段地址及偏移地址实现程序的转移

              无条件转移指令无条件转移到目标地址,执行新的指令

              有条件转移指令在具备一定条件的情况下转移到目标地址

        三. 无条件转移指令

                    JMP指令

                    格式:JMP  OP

                    功能:无条件地将控制转移到目标地址去。

                    原则上可实现在整个内存空间的转移。              

                   段内转移:

                   段内转移指令:

             

      

                    段间转移:

                    段间转移指令:

         

       

          四. 调用和返回指令(CALL和RET指令)

                1. 调用指令

                    格式:CALL    OP

                    功能:将CALL指令的下一条指令的地址(断点地址)IP或IP与CS压栈,新

                               的目标地址(子程序首地址)装入IP或IP与CS中,控制程序转移到由

                               OP指明入口的子程序。其中OP为子程序(过程)的名字。

                    操作过程:

                             (1)SP-2 → SP, 当前CS压栈,OP所在段地址 → CS

                             (2)SP-2 → SP, 当前IP压栈,OP的偏移地址 → IP

   对于段内调用只有(2)。

                     (1). 段内调用

                     (2).  段间调用

                            子过程与原调用程序不在同一代码段,在调用之前需保护断点的段基地址

                            和偏移地址。先将断点的CS压栈,再压入IP

                            格式:CALL  FAR  PROC

                            例:CALL  FAR  TIMRE

                                   CALL  DWORD  PTR[SI]

                2.  返回指令

                     格式:RET

                     功能:通常作为一个子程序的最后一条指令,用以返回到调用子程序的断点

                                处,即从堆栈弹出断点送IP和CS。

                     操作过程:  

     (1)从栈顶弹出一个字给IP,SP+2→SP 

     (2)从栈顶弹出一个字给CS,SP+2→SP 

       对于段内调用只有(1)。

                     调用指令与转移指令的比较:

                               用于调用一个子过程

                               调用前须保护断点地址

                               子过程执行结束后要返回原调用处继续执行原程序

                     调用指令的执行过程

                               将调用指令的下一条指令的地址(断点)压入堆栈

                               获取子过程的入口地址(子过程第1条指令的偏移地址)

                               执行子过程,含相应参数的保存及恢复

                               将断点偏移地址由堆栈弹出,返回原程序

          3. 条件转移指令

              条件转移指令将前一条指令执行结果对状态标志位的影响,作为程序转移的
              条件。满足条件时转移到指令指定的地址,否则将顺序执行下条指令。可作
              为判断条件的状态标志位有CF、PF、ZF、SF和OF。
              条件转移指令都是采用相对寻址方式的双字节指令,指令第一字节是操作码,
              第二字节是带符号的位移量。条件转移指令只能在当前段中实现短转移,不
              影响状态标志。

     ①对无符号数

         A:大于    B:小于    E:等于     N: 取反

         高于/不低于也不等于转移   JA/JNBE 目标标号  CF AND ZF=0

         高于或等于/不低于转移       JAE/JNB 目标标号         CF=0

         低于/不高于也不等于转移    JB/JNAE 目标标号         CF=1

         低于或等于/不高于转移    JBE/JNA 目标标号       CF  OR  ZF=1

             ②对有符号数

                 G:大于   L:小于   E:等于     N: 取反

                 大于/不小于也不等于转移   JG/JNLE 目标标号

                                                          (SF  XOR  OF)AND  ZF=0

                 大于或等于/不小于转移       JGE/JNL 目标标号

                                                             SF  XOR  OF=0 

                 小于/不大于也不等于转移   JL/JNGE 目标标号 

                                                             SF  XOR  OF=1

                 小于或等于/不大于转移       JLE/JNG 目标标号

                                                          (SF  XOR  OF)=1OR  ZF=1

     ③对标志位

         进位为1转移         JC    目标标号            CF=1

         进位为0转移         JNC     目标标号        CF=0

         等于/结果为0转移          JZ/JE   目标标号        ZF=1

         不等于/结果不为0转移  JNZ/JNE 目标标号    ZF=0

         溢出转移          JO      目标标号            OF=1

         不溢出转移      JNO     目标标号          OF=0

         奇偶位为0/奇偶性为奇转移     JNP/JPO 目标标号     PF=0

         奇偶位位1/奇偶性为偶转移     JP/JPE  目标标号       PF=1

         符号标志位为0转移           JNS     目标标号  SF=0

         符号标志位为1转移           JS      目标标号  SF=1


(七). 循环控制指令

     使用循环控制指令之前,必须在 CX(计数器)中预置循环次数的初值。
     不影响状态标志位。
     主要用于数据块比较、查找关键字等操作。
     注意:同一个循环不要用多个LOOP,不然CX会异常
             如果需要用两个循环嵌套,那么需要把外部循环的CX进栈保护一下,内部循环
             用完CX再pop出来

     ⑴ 计数循环

          格式:LOOP    目标标号

          功能:CX-1→CX,若CX≠0,循环转移到目标标号,直到CX=0退出循环。

     ⑵ 结果为0/相等循环(不常用)

         格式:LOOPZ/LOOPE    目标标号

         功能:CX-1→CX,若CX≠0且ZF=1时,循环转移到目标标号,直到CX=0或ZF=0

                    退出循环。

      ⑶ 结果不为0/不相等循环(不常用)

          格式:LOOPNZ/LOOPNE    目标标号

          功能:CX-1→CX,若CX≠0且ZF=0时,循环转移到目标标号,直到CX=0或ZF=1

                     时退出循环  

     (4) 计数为0转移(不常用)

          格式:JCXZ  目标标号

          功能:若CX=0时,则转向目标标号,否则顺序执行

      1. 处理器控制指令

  (1)标志操作指令

       格式:  CLC  ;置CF= 0

                    STC  ;置CF= 1

                    CMC  ;置CF= CF(上面有一横线,表示CF取反)

                    CLD  ;置DF=0

                    STD  ;置DF=1

                    CLI  ;置IF=0

                    STI  ;置IF=1

       标志操作指令完成对标志位的置位、复位等操作,这些指令只影响与其相关

       的标志位。

  (2)CPU控制指令

       ① 处理器暂停指令

            格式:HLT

            功能:使处理器处于暂时停机状态。

            说明:HLT引起的暂停,只有RESET(复位)、NMI(非屏蔽中断请求)、

                       INTR(可屏蔽中断请求)信号可以使CPU退出暂停状态。

       ② 处理器等待指令

            格式:WAIT

            功能:执行WAIT指令后,处理器处于等待状态,直到检测到TEST引脚

                      有效,才退出等待状态,执行后续指令。

            说明:用于处理器与外设同步。

                ③ 处理器交权指令

                     格式:ESC  EXTOPCD,OP源(其中EXTOPCD为外部操作码,OP源为源

                                操作数)

             功能:用来为协处理器提供一个操作码和操作数,以便完成主机对协处理器

                        的某种操作要求。

                 ④ 空操作指令

                     格式:NOP

                     功能:在执行本指令期间,CPU不完成任何操作,只是每执行一条NOP

                               指令,耗费3个时钟周期的时间。

                ⑤ 总线封锁前缀

                    前缀格式:LOCK

                    功能: 当CPU执行带有LOCK前缀的指令时,不允许其他设备对总线进行访问

                    说明:LOCK可作为任意指令前缀使用。

                    注意:此类指令均不影响标志位。

        2.  输入输出指令

             CPU对外设端口有两种寻址方式,即直接寻址和间接寻址。直接寻址范围为00H

             —0FFH个端口;间接寻址范围为0000H—0FFFFH共64K个端口。间接寻址时,

             只能用DX作间址寄存器。

             (1)  输入指令

                   格式: :IN  累加器(AX或AL),端口(00H-FFH或DX)

                                端口在0-255(00H-FFH)时直接给出,大于255时把地址给DX

                                从地址为端口号xxx的地方取8/16位数据送AL/AX

                   功能: 把一个字节/字由输入端口传送到AL/AX中.

                   注意:   当外设是16位时用AX,外设是8位时用AL

                              当端口号大于8位或十进制数大于255时用间接寻址

                              端口中存放的是地址,累加器中存放的是数据

                              IN是读指令,而且区分奇偶地址

                   例: IN  AL,21H  ;将端口21H的8位数读到AL中

                           MOV  DX,201H;    

                           IN  AX,DX;     从201H号端口读16位给AX

             (2)  输出指令

                   格式:OUT  端口,累加器

                   功能:把AX中的16位数或AL中的8位数输出到指定端口。 

                   例:OUT  22H ,AL  ;将AL中的数传到22H端口

                          MOV  DX,511H   

                          OUT  DX ,AX 

         3.  中断指令

              (1) 溢出中断指令

                   格式:INTO

                   功能:检测OF标志位。当OF=1时,产生一个中断类型4的中断;当OF=0时,

                              本指令不起作用。

                   注意:影响标志位IF、TF。

               (2) 软中断指

                    格式:INT n(n为中断类型号)

                    功能:产生一个软件中断,把控制转向一个类型号为n的软中断。

                    注意:影响标志位IF、TF。 

               (3) 中断返回指令

                    格式:IRET

                    功能:让CPU执行完中断服务程序后,正确返回原程序的断点处。

                               SP+6  恢复IP,CS,FR

                    注意:影响所有标志位。 


(八). 宏汇编语言的基本语法

         1. 常数

             常数——没有任何属性的纯数值。在汇编期间,它的值已经完全确定,而且在程

             序的运行中也不会发生变化。它可以有以下几种类型:

             ⑴二进制数:以字母B结尾的由一串“0”和“1”组成的序列。例如:0010110B。

             ⑵八进制数:以字母o或Q结尾,由若干个0到7的数字组成的序列。例如:255Q、

             ⑶十进制数:由若干个0到9的数字组成的序列,可以以字母D结尾,也可以省略

                 字母D。例如:1234D或1234。

             ⑷十六进制数:以字母H结尾,由若干个0到9的数字和字母A到F组成的序列,且

                 必须以数字开头。例如:56H,0B3FH。

             ⑸字符串常数:用引号括起来的一个或多个字符。这些字符以ASCII 码形式存在

                 内存中。例如‘A’的值是41H,而‘B’的值是42H。因此串常量与整数常量可以交

                 替使用。

             注意:为了区别由A~F组成的一个字符串是十六进制数还是英文符号,规定凡以

                        字母A~F为起始字符的十六进制数,必须在前面冠以数字“0”

             总之,常数主要以立即数、位移量的形式出现在指令语句或数据定义伪指令中。

         2. 变量

             变量——通常是存放在某些存储单元的数据,这些数据在程序运行期间可以修改。

             变量名——表示数据在段中的有效地址,由用户指定。变量名是可选的,如果使用

             变量名,它代表数据区中第一个数据项的地址。

             变量的三个属性:  (1)段属性(SEGMENT):表示变量所在段的段首地址

                                            (2)偏移属性(OFFSET):表示变量的偏移地址

                                            (3)类型属性(TYPE):表示变量占用存储单元的字节数。

                                                类型:字节,字,双字,四字,十字节类型,

             变量是用数据定义伪指令DB、DW、DD等定义的。

             DB—字节

             DW—字(2字节)

             DD—双字(4字节)

             例如: DATA1 DB 12H,13H,00H

             注意:变量也可以定义为一个数据区或存储区,但变量名仅表示该数据区或存储区

                        的第一个数据单元(即数据区或存储区的首地址)。        

         3. 标号

             表示一条指令所在的地址,也是指令语句的地址符号,常用作转移指令(包含子程
             序调用指令)的操作数,即目标地址。
             通常由字母数字串组成,但第一个字符必须为字母。最多允许使用31个字符,且
             可以使用下划线(-)使标号容易阅读。
             例如: JMP LOP
                       LOP : MOV AL,AH    LOP表示标号
              标号的三个属性:   (1)段属性(SEGMENT):表示标号所在段的段基址   

                              (2)偏移属性(OFFSET):表示标号的偏移地址

                              (3)距离属性(类型属性TYPE):表示标号作为段内或段间的

                                                                                    转移属性

             距离属性分为两种:

                 (1)NEAR(近):表示本标号只能被标号所在段内的转  移和调用指令访问

                   (即段内转移)。

                 (2)FAR(远):表示本标号可以被其他段(不是标号所在段)的转移和调用指

                      令访问(即段间转移)。

         4. 运算符与表达式

             表达式:(1)数值表达式:只产生数值结果

                           (2)地址表达式:产生的结果是一个存储器地址,若该地址存放的是数据,

                                一般称它为变量,若存放的是指令,一般称它为标号

             运算符:

                      (1)算术运算符 

                          包括:+、-、*、/、MOD(求余)、SHL(左移)和右移(SHR)

                          例:CONT = 14*4       

                                 CONT = CONT/8  

                                 MOV AL, 21H SHL 2           

                      (2)逻辑运算符 

                          包括:AND、OR、XOR和NOT。只适用于对常数进行逻辑运算。

                          例:  AND  DX,PORT AND 0FEH

              (3)关系运算符

                  包括:EQ(相等)、NE(不相等)、LT(小于)、GT(大于)、

                             LE(小于或等于)、GE(大于或等于)。

                  结果:若关系为假(不成立),结果为0;

                             若关系为真(成立),结果为0FFH或0FFFFH。

                  例:  MOV  BX,PORT  LT  5

                  例:  MOV  BX,( (PORT  LT  5) AND  20) OR

                                           ( (PORT  GE  5) AND 30 )

                        当PORT<5时,等价 MOV   BX,   20     

                        当PORT>5时,等价 MOV   BX,   30

       (4)分析操作符(数值返回运算符)  

           ①取地址的偏移量

               格式:OFFSET  变量名或标号

               功能:取变量名或标号所在段的段内偏移量。

           ②取段基址

               格式:SEG  变量名或标号

               功能:取变量名或标号所在段的段首地址。

                         ③求变量名或标号的类型值

                             格式:TYPE   变量名或标号

                             功能:返回一个数字值。若TYPE加在变量名前,返回该变量的类型

                                        属性;若加在标号前,返回该变量的距离属性。

                         ④求长度

                             格式:LENGTH   变量名

                             功能:返回一个变量名所占存储单元(字节、字或双字)的数目。若变

                                        量是用重复定义子句说明的,则返回DUP前面的数值;其余返回

                                        1。

                         ⑤求大小

                            格式:SIZE    变量名

                            功能:返回变量名所占存储单元的字节数,它等于LENGTH和TYPE两个

                                       运算符返回值的乘积。

                        ⑥指定偏移地址

                           格式:ORG   指定的偏移地址(必须是立即数)

                           功能:指定下一条指令的偏移地址

                    (5)综合运算符

① PTR运算符

    格式:类型   PTR  表达式

    功能:用于指出变量、标号或地址表达式的类型属性,新的类型只在当

               前指令内有效。

                             例:   MOV BYTE PTR [DI],4 ;指明目的操作数为字节类型                         

                                    JMP DWORD PTR [BP];指明目的操作数为双字类型

                         ②THIS运算符(不常用)

                             格式:THIS   类型 

                             功能:把它后面指定的类型或距离属性赋给当前的变量、标号或地址表

                                        达式。

                             例:  A EQU THIS BYTE

                                   B DW  20  DUP(?)

                             说明:A、B对应同一存储器地址,对变量A为字 节访问,对变量B为字

                                       访问,且A和B具有相同的段基址和偏移量。 

                              注:THIS使下面的原标号或原变量有新的名字和类型,但不分配新的存

                                      储单元。

                              例:将数据表原来按字节定义使用,现改为按字定义使用。

                                     WBUFFER1 EQU THIS WORD

                                     BUFFER DB 100 DUP(0)

                                     二者段地址,偏移地址相同,类型不同。

             (6)其他运算符

                  ①HIGH和LOW运算符(不常用)

                      格式:  HIGH  表达式

                                   LOW   表达式

                      功能:从运算对象中分离出高字节或低字节。

                      例:K1     EQU  1234H

                             MOV    AL,LOW     K1 ;AL ← 34H

                             MOV    BL,HIGH   K1 ;BL ← 12H

                  ②SHORT运算符(不常用)

                              格式:  SHORT  标号

                              功能:当转移的目标地址与本转移指令的下一条指令之间的字节距

                                         离在-128~127范围时,可以用SHORT运算符进行说明。

                              例:   L1:  JMP   SHORT  L2

                                                    ┇

                                      L2:  MOV  AX,BX

                                                    ┇


(九). 伪指令

         8086宏汇编语言有两种类型的语句:

         指令语句:在汇编过程中被翻译成相应的目标代码,经连接后生成可执行的机器指令

                           代码。

         伪指令语句:(指示性语句)在汇编时被解释执行,由汇编程序来处理的一类操作,

                              如数据定义,分配存储器等。

         伪指令不生成机器码,不能被执行,起解释说明的作用

       一. 伪指令语句的格式 

             格式:符号名  定义符   操作数;

             符号名:在伪指令语句的前面,可以是常量名、变量名、段名和过程名等。

                            标号后用“:”——在指令语句中

             定义符:表示该语句的伪操作功能。定义符由汇编程序规定,宏汇编程序中使用了

                           数十种定义符。

             操作数:可以是常数(二、十、十六进制等)、字符串、常量名、变量名、标号和

                            一些专用符号等。

       二. 常用伪指令

            1. 符号定义伪指令(赋值语句)

                ⑴ 等值伪指令

                     格式:符号名    EQU    表达式

                     功能:将表达式的值赋给符号名。

                     例:  ALFA    EQU   100

                           COUNT   EQU   ALFA

                     注意:符号名一旦被EQU定义,就不能再赋值,即不能用EQU再为符号名重

                                新赋值。

                                EQU定义不占用内存单元

                ⑵ 等号伪指令

                     格式:符号名 = 表达式

                     功能:将表达式的值赋给符号名。

                     说明:可以在程序中不同的地方多次使用以重新为符号名赋值。

                     =定义也不占用内存单元

                     例:   ALFA = 100

                               MOV  AL,ALFA  ;AL←100

                               ALFA = ALFA+2         ;  ALFA = 102

  (3) 定义符号名伪指令(不重要)

       格式:符号名   LABEL  类型

       功能:定义一个标号或变量,并指定其类型。

       例:    BARY  LABEL  WORD;定义BARY为字类型

                ADD    AX,BARY  ;字加法

                ABCF  LABEL   FAR  ;ABCF为FAR类型标号

             2. 数据定义伪指令

                 格式:[变量名]    DB    表达式  ;定义字节

                            [变量名]   DW    表达式  ;定义字

                            [变量名]    DD    表达式  ;定义双字 

                            [变量名]   DQ    表达式  ;定义8个字节 

                            [变量名]    DT    表达式  ;定义10个字节 

                            表达式——是赋给变量的初始值,可以有一个,也可以有多个,常见的

                            有以下几种:

                ⑴数值表达式

                   实际上是为数据分配存储单元,并把变量名作为该存储单元的名称。若要定

                   义多个相同类型的数据,可用逗号把这些数据隔开,并依次分配在相邻的存

                   储单元。

                   例:   BUF  DB  20H,30H

                           BUF1 DW 100

                           DAT  DW 1234H,5678H ;

                           字变量DAT的内容为1234H,占用两个字节单元,下一个字单元即

                           DAT+2单元的内容为5678H,仍是低字节存在低地址单元。

              ⑵ASCII字符串

                  字符串必须用引号括起来,并且不超过256个字符,它们在内存中按地址递

                  增顺序自左向右依次存放字符的ASCII码。

                  注意: 字符串定义一般用DB

                  例:STRING DB ‘ABC’

                         STRING1 DB ‘ How are you? ’

                  例:  DATA   DB  ‘AB’ 

                         DATA1  DW ‘AB’

              ⑶为数据项分配存储单元的一种方法,只是存储单元中不预置确定的值,常用

                  来预留存储单元,存放程序的中间结果或最终结果。

                  例:  RESULT  DB  ?;预置一个字节单元,其值不定

                         ABC DB 12H , ?, ? , 24H

                         DEF DW  ?,895H ,?

     ⑷重复定义子句 DUP——可以为若干个重复数据分配存储单元。

         格式:    n   DUP  (表达式)

      说明:  n:重复次数       表达式:重复的内容

         例:   C    DB   100  DUP(0) 

                   TAB  DB  100  DUP(5  DUP(1),2)  

         注意:   (1) DUP操作可以嵌套。

                    (2)在定义变量及存储单元的同时,也定义了它们的类型属性。

                         同一数据定义语句所定义的各存储单元具有相同的类型。

         例:  DA1  DB  3  DUP(5,?, 6);

               从DA1地址单元开始存放三组“05H,预留,06H”共9个地址单元

               DA2  DW  40  DUP(?);

               从DA2地址单元开始保留40个字共80个地址单元

               DA3   DB  10   DUP(1,2,3 DUP(30,4);

               从DA3地址单元开始存放十组“01,02,30,04,30,04,30,04”,

               共占用80个字节。

              3. 段定义伪指令

    格式:段名    SEGMENT [定位类型][组合类型][‘类别名’]

                          段体

               段名    ENDS 

    段名为该段起的名字,用来指出汇编程序为该段分配的存储器起始地址,开始

    的段名和结束的段名必须相同。

    段体为段内的语句序列

    功能:把模块化分为若干个逻辑段。

               每个SEGMENT/ENDS可定义一个逻辑段。

    4. 段寄存器说明伪指令

        格式:  ASSUME   段寄存器  :段名[,段寄存器  :段名…]

        功能:向汇编程序指示当前各段所用的段寄存器,设定段寄存器与段的对应

                   关系。

        注意: ① 本伪指令只是指示各逻辑段使用寄存器的情况,并没有对段寄存器内

                        容进行装填。段寄存器的实际值(CS除外)还要由MOV指令在程序

                        中装填数据。

                    ②也可用来取消段寄存器与段之间的对应关系(用NOTHING),然后

                        再建立新的对应关系。

                  例:     ASSUME   DS: NOTHING

                           ASSUME   DS: DATAB                

                           MOV      AX, DATAB

                           MOV      DS, AX 

              5. 过程定义伪指令 

   过程是程序的一部分,它可以被程序调用。每次可调用一个过程,当过程中的

   指令执行完后,控制返回调用它的地方。过程的定义是用过程定义伪指令完成         的。

   格式: 过程名     PROC   [NEAR / FAR]    

                              过程体

                              RET

               过程名     ENDP

   过程名:自定义符,开始、结束要相同;有三个属性(段地址,偏移地址和距

               离属性)

   RET:可有多个RET,一般作为最后一条指令

                  例: CODE SEGMENT

                           APRC  PROC  NEAR

                                      ADD  AX, BX

                                       …

                                      RET

                           APRC  ENDP

                          START: MOV  AX, NOM

                                      CALL APRC

                                       ……

                                      CALL  APRC

                                       …….

                           CODE  ENDS

                           END STAR        

             6.  模块定义及通信伪指令 

  汇编语言可以把程序划分成许多模块,并对每个模块独立地进行汇编和调试。

  ⑴ 模块开始伪指令

         格式:NAME   模块名

         功能:指明程序模块的开始,并指出模块名。

         说明:模块名是自定义符,不能是系统保留字。若该项缺省,则取TITLE

                    语句中的页标题6个字符;若没有TITLE语句,则取源程序文件名

                    为模块名。

   ⑵ 模块结束伪指令(源程序结束伪指令)

  格式:END   启动标号或过程名

  功能:END表示一个模块(源程序)的结束。通知汇编程序源程序到此

             结束,并给出执行程序的入口位置。

  例:      START: MOV    AX,DATA

                                         ┇

                               END  START 

                         注意:①END与NAME联合使用,当NAME缺省时,END 值表示原程序

                                         的结束。

                                    ②汇编处理只进行到END为止。


(十). 宏指令

         1. 宏定义及其调用

             宏定义格式:  宏指令名   MACRO   [形参,形参,┅]
                                       宏体    

                                     ENDM

             宏调用的格式为:  宏指令名  [实参,实参,┅]

             例:为了实现ASCII码和BCD码之间的相互转换,往往需要把AL中的内容左移或右

                    移4位。设左移4位,可用下列指令序列实现:

      MOV  CL,4

      SAL    AL,CL

             若多次使用,则可用一条宏指令来代替,宏定义如下:

  SHIFT   MACRO

      MOV  CL,4

      SAL  AL,CL

  ENDM

              例:

      MOV  AL,[DI]

      ADD  AL,[SI]

      SHIFT  ;宏调用

      MOV  [BX],AL

宏和子程序区别:  宏是原样替换,子程序是跳转执行


(十一). 汇编语言程序的结构

              一个标准的汇编语言源程序的框架结构:

DATA    SEGMENT

                  ┇ 定义数据段

DATA    ENDS

CODE   SEGMENT 定义代码段

       ASSUME  CS:CODE,DS:DATA

       START: MOV   AX,DATA   装载数据段

                    MOV   DS,AX  设置用户数据段,附加段

                        ┇

       MOV    AH,4CH

       INT      21H         返回DOS

CODE  ENDS                   

               END    START


(十二). DOS系统功能调用

             MS-DOS系统中设置了几十个内部子程序,在汇编语言源程序中可采用软中断指令

             调用它们。 MS-DOS中常用的软中断有8条,系统规定它们的中断类型码为20H—

             27H, INT  21H是DOS系统功能调用。

             INT 21H中断本身包含很多子程序,调用它们时采用统一的格式:

             ①传送入口参数到指定寄存器中

             ②功能号送入AH寄存器

             ③INT 21H

             1. 键盘输入单字符——1号系统功能调用

                 格式:MOV  AH,1

                            INT   21H

                 功能:无入口参数,执行时,系统等待键盘输入,待按下任何一键,系统先检查

                            是否是Ctrl—Break键。若是则退出,否则将键入值置入AL中,并在屏幕

                            上显示该字符。

             2. 输出单字符——2号系统功能调用

   格式: MOV  DL,‘A’

               MOV  AH,2

               INT    21H 

   功能:将DL中的字符送屏幕显示。

             3. 键盘输入字符串——0AH号系统功能调用

                 功能:将键盘输入的字符串写入到内存缓冲区中,必须事先定义一个缓冲区

                 缓冲区的第一个字节:该缓冲区存放的字节数。

                 第二个字节:预留,系统填写实际的字符数

                 从第三个开始:存放字符串,回车(0DH)表示结束

                 格式:          ┇

                          BUF  DB  20

                                   DB  ?

                                   DB  20 DUP(?)            

                                      ┇ 

                         MOV  DX,OFFSET  BUF

                         MOV  AH,0AH

                         INT  21H 

             4.  输出字符串——9号系统功能调用

                  功能:将指定的内存缓冲区中的字符串在屏幕上显示出来,缓冲区的字符串

                             以“$为结束标志

                  格式: BUF  DB  ‘GOOD BYE$

                                              ┇

                              MOV   DX,OFFSET  BUF

                              MOV   AH,9

                              INT    21H

                              结果:显示GOOD BYE

             5.  返回操作系统——4CH号系统功能调用

                  格式:   MOV  AH,4CH

                                INT   21H

第四章: 存储器

1. 存储器基础

1. 存储系统的层次结构

    存储系统的层次结构——就是把各种不同存储容量,不同存储速度的存储器,按照一定

    的体系结构方式组织起来,使所存放的程序数据按层次分布在各种存储器中

    三级存储系统:  高速缓冲存储器——主存储器——外存储器

    (1)主存储器—外存储器(弥补主存容量的不足)

        主存(内存)一般把具有一定容量且速度较高的存储器作为内存,CPU可直接用指

        令对内存储器进行读写。存放现行程序和数据,存取速度快,容量有限,是主机的一

        部分。通常用半导体存储器作为内存。

        外存(辅存或海存):存储容量大、速度较低、位于主机之外的存储器。用来存放当

        前暂时不用的程序和数据。CPU不能直接用指令对外存进行读写。要使用外存中的信

        息,必须先将它调入内存。

        内存-外存存储层次的形成解决了存储器的大容量和低成本之间的矛盾

    (2)主存储器—高速缓冲存储器

         为使主存储器与CPU的速度相匹配,提高CPU访问存储器的速度,在CPU和内存中

         间设置高速缓冲器(cache)。

         高速缓存-内存层次的形成解决了速度与成本的矛盾。

    在现代微机中同时采用这两种存储层次,构成cache-内存-外存三级存储系统。这三级存

    储系统的形成,满足了现代微型计算机对存储系统的速度快、容量大且价格低廉的要求。

    高速缓冲存储器(cache):

    高速缓冲存储器是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,

    容量比较小但速度比主存(内存)高得多, 接近于CPU的速度。它和主存储器一起构成

    一级的存储器。高速缓冲存储器和主存储器之间信息的调度和传送是由硬件自动进的。

    某些机器甚至有二级三级缓存,每级缓存比前一级缓存速度慢且容量大。


2. 存储器的分类(按存取方式分类)

    ①随机存储器(RAM)

        既可读有可写,又称读/写存储器。如主存。

    ②只读存储器(ROM)(可以随机读)

        只能读,不能写。存放固定不变的系统程序和子程序等。

    ③顺序存储器(SAM)

        按照顺序进行读/写 ,如磁带。 

     RAM和ROM区别:  RAM掉电消失,ROM永久保存


3. 存储器的技术指标

    (1)存储容量——通常以允许存放的字数×位数或字节数表示存储器的容量。

         32K×16   1KB=2十次方B=1024B,1MB=2十次方KB=1024KB

         1KB=1K×8b

         容量=单元数*每个单元位数

         一般单元数就是寻址范围就是2的地址线次方,位数就是数据线条数

    (2)存取周期(又称读写周期或访问周期)

        通常指连续存入或取出两个数据所间隔的时间。

    (3)取数时间——从CPU发出读命令开始,直到存储器获得有效读出信号的一段时间。

    (4)可靠性——通常以平均无故障工作时间来衡量存储器的可靠性。

    (5)经济性——常以“性能价格比”来衡量存储器经济性能的好坏。

    存取周期>取数时间


4. 随机读写存储器

    (1)静态RAM(SRAM)

        静态RAM的工作原理:MOS型静态RAM的基本存储单元,可由六个MOS场效应晶体

        管构成,其基本存储单元电路如图所示。

        静态RAM组成:将多个存储单元按一定方式排列起来,就组成了一个静态RAM存储器,

        如图所示。

      静态RAM举例:Intel 2114    1K×4位   4094字节    64×64矩阵

   (2)动态RAM(DRAM)

       特点:存储的信息具有一定的时间性,在很短的时间内,其数据是有效的,超过一定

       的时间,数据就消失了。为了使数据常在,就要周期性地对所在数据重写(刷新),

       这种存储器为动态存储器。

       动态RAM的使用举例:

       例:用4K1的存储芯片构成16K字节(8位)的内存模块。  

              需要32个 4K1的芯片

             分4组:每组由4K1的8个芯片组成(4K字节)。

   静态RAM(SRAM)和动态RAM(DRAM)的区别:

   ①DRAM用作内存比较多,SRAM用作cache比较多。
   ②SRAM不需要刷新电路就能够保存数据,所以具有静止存取数据的作用。而DRAM则
       需要不停地刷新电路,否则内部的数据将会消失。
   ③SRAM追求的速度,所以一般做的比较小(K)而DRAM追求的仅仅是暂时性的存储数
       据,所以较大(G)且较为廉价。
   ④由于SRAM的容量较小,所以行和列的地址可以一次性送入,而DRAM则需要将行和
       列的地址分别送入。

5. 半导体只读存储器

    (1)掩膜式只读存储器ROM

        制造厂家根据程序设计者编好的程序组成的“1”、“0”代码矩阵,利用集成电路工艺制

        造出相应的掩膜图案并生产出ROM芯片。这种ROM中的信息是永久性存储。使用

        时只能读出而不能写入新内容。

   (2)可编程的只读存储器PROM

        制作时不写入信息,使用时可写入自己的程序。但写入是一次性的,一旦写入内容后

        就不能更改,所以称一次性可编程序只读存储器,又称为现场可编程序只读存储器。

  (3) 可编程、可擦除的只读存储器——EPROM

       用户使用时可重复编程、可多次改写所写内容。

      (1)紫外线擦除的EPROM

          采用紫外线擦去原存内容,再用专门写入器改写内容。因此又称UVEPROM。实

          际中,用紫外线(或X射线)灯,相距3cm,进行照射10~20min,就可把EPROM

          中的原存全部信息抹去,并成为全“1”状态。然后,再根据用户程序,用加电压的

          手段使要存入“0”的那些存储位进行写“0”,而对要存“1”的存储位不加电压,仍保存

          原有的“1”代码。

          常用的:2732(4KB)  2764 (16K)    27256    27128     Intel 2716

   (2)电可擦除只读存储器

          简称为EEPROM或E的平方PROM 。

          它是采用金属—氮—氧化物—硅(MNOS)集成工艺制成的。使用时让电流只通过

          指定的存储单元,把其中一个字(或字节)擦去并改写,其余未通入电流的单元内

          容保持不变。

      (3)EPROM芯片举例——Intel 2716

          16K位,可组成2K×8的紫外线擦除的EPROM

2. 两块重要的存储芯片

1. SRAM-6264

2. Intel 2164

     2164A的容量为64K×1位,即片内共有64K(65536)个地址单元,每个地址放一位数

     据。片内寻址需64K即16根地址线。为减少引脚,地址线分为两部分:行地址与列地

     址,故地址译码线只需8条,内部设有地址锁存器来锁存行列地址。

 3. 编址和译码

门电路:

存储器地址分配及译码:

存储器地址分配在进行存储器与CPU连接前,首先要确定内存容量的大小和选择存储器芯片的容量大小。 

存储器地址译码

常用的译码电路:

一种常见的3∶8译码器74LS138

存储器与CPU的连接:

存储器芯片的外部引脚按功能分为数据线、地址线和控制线。CPU对存储器的读写操作首先是向其地址线发地址信号,然后向控制线发读写信号,最后在数据线上传送数据信息。每一块存储器芯片的地址线、数据线和控制线都必须和CPU建立正确的连接,才能进行正确的操作。

CPU与存储器的连接就是指地址线、数据线和控制线的连接。重点说明的是存储器与CPU地址总线的连接方式,必须满足对这些芯片所分配的地址范围的要求。

CPU发出的地址信号必须实现两种选择:

  (1)片选:对存储器芯片的选择,使相关芯片的片选端CS为有效。

  (2)字选:在选中的芯片内部再选择某一存储单元。

    片选信号和字选信号均由CPU发出的地址信号经译码电路产生,其中:

        片选信号:由存储器芯片的外部译码电路产生,需自行设计。

        字选信号:由存储器芯片的内部译码电路产生,这部分译码电路不需用户设计。

下面介绍外部译码电路的两种译码方法。

1. 线性选择法

    直接用CPU地址总线中某一高位线作为存储器芯片的片选信号,简称为线选法。

    优点:连接简单,片选信号的产生不需复杂的逻辑电路。

    缺点:(1) 当采用线选法时,高位地址未全部用完、而又没有对其实施控制时,会出现

                    地址的不连续和多义性。

               (2)即使所有的高位地址线都用作线选,其能寻址的存储空间也十分有限。

2. 全译码法

    将高位地址全部作为译码器的输入,用译码器的输出作为片选信号。

    在这种方法中,低位地址线用作字选,与芯片的地址输入端直接相连;高位地址线全部

    连接进译码电路,用来生成片选信号。这样,所有的地址线均参与片内或片外的地址译

    码,不会产生地址的多义性和不连续性。在全译码方式中,译码电路的核心常用一块译

    码器充当,例如74LS138等。

    地址连续:前一片存储器的最后一个单元地址加一是后一片存储器的首单元

    容量=末字节地址-首字节地址+1 

    末字节地址=首字节地址+容量-1 

    ​​​​​末字地址=首字地址+容量-2

第五章: 输入输出及中断技术

1. io接口、编址、传送方式

1. 串行与并行
    计算机与外部的信息交换称为通信,基本的通信方式有两种, 并行通信串行通信
    并行通信:数据各位同时传送,此方式传输数据的速度快,但使用的通信线多,若要并行
    传8位数据,需要用8根数据线,另外还需一些控制信号线。随着传输距离的增加,通信线
    成本的增加将成为突出的问题,而且传输的可靠性随着距离的增加而下降。因此,并行通
    信适用于近距离传送数据的场合。
    串行通信:将要传送的数据或信息按一定的格式编码,然后在单根线上按一位接一位的先
    后顺序进行传送。发送完一个字符后,再发送第二个。接收数据时,每次从单根线上一位
    接一位的接收信息,再把它们拼成一个字符,送给CPU作进一步处理。适用于远距离信,
    需要的通信线少和传送距离远等优点。
    什么叫波特率?
    在串行通信中,波特率表示数据传送的速率,每秒钟内所传送数据的位数称为波特率,单
    位为波特bps(Bd)。在波特率指定后,输入移位寄存器/输出移位寄存器在接收时钟/发送
    时钟控制下,按指定的波特率速度进行移位。

2. io接口

    I/O接口: 将外设连接到总线上的一组逻辑电路的总称。用以实现外设与主机之间的信息
                  交换
    I/O端口:接口中的寄存器,可以由CPU读或写。
                    端口分为: 数据端口  状态端口  控制端口 
    一个简单的外设接口框图 :


3. 编址

    统一编址 (存储器映射):在这种编址方式中,I/O端口和内存单元统一编址,即把I/O端口
                   当作内存单元对待,从整个内存空间中划出一个子空间给I/O端口,每一个I/O
                   端口分配一个地址码,用访问存储器的指令对I/O端口进行操作。

    独立编址I/O端口编址和存储器的编址相互独立,即I/O端口地址空间和存储器地址空

                      间分开设置,互不影响。采用这种编址方式,对I/O端口的操作使用输入/输

                      出指令(I/O指令)。

    统一编址的优点:①访问内存指令均适用于I/O端口,对I/O端口的数据处理能力强

                         ②cpu无需产生区别访问内存操作和I/O操作的控制信号,从而可减少
                             引脚。

    统一编址的缺点:①程序中I/O操作不清晰,难以区分程序中的I/O操作和存储器操作

                         ②I/O端口占用了一部分内存空间
    独立编址的优缺点(8086):①不占用内存空间
           ②使用I/O指令,程序清晰,很容易看出是I/O操作还是存储器操作
           ③译码电路比较简单(因为I/0端口的地址空间一般较小,所用地址线也就较少)
           ④I/O独立编址缺点是:需要特定的引脚来区分内存和IO单元的访问
    CPU同外设间交换的信息有三类:

     I/O端口的访问:

    (1)输入指令

        格式:IN   累加器(AX或AL),端口(DX或00-FFH)

        功能:把端口中数据读到AL、或AX中。

        例:IN   AL,21H         MOV  DX,201H

                                               IN   AX,DX

    (2)输出指令

        格式:OUT   端口(DX或00-FFH),累加器(AX或AL)

        功能:把寄存器AL、或AX中数据输出到端口。

        例: OUT  32H,AL       MOV  DX,201H

                                               IN  DX,AX 


4. CPU与外设交换数据的方式

    程序控制传递方式 :无条件传送  查询式传送  中断方式传送

    特点:(1)以CPU为中心,控制来自CPU,通过预先编写好的I/O程序实现数据的传送。

               (2)速度较低,传送路径经过CPU内部寄存器同时数据I/O响应也比较慢。

    (1)无条件传送方式 (同步传送方式) 

        特点:适用于总是处于准备好状态的外设

        方法:把I/O指令插入到程序中,当程序执行到该指令时,外设已作好准备,于是在此

                   指令时间内完成数据传送任务。

        优点:软件及接口硬件简单

        缺点:CPU效率低,只适用于简单外设,适应范围较窄        

    (2)查询传送方式(异步传送方式)

        当CPU同外设不同步且不知道外设工作速率时,可采用此方式传送。传送前,CPU必

        须先对外设进行状态检测。

        适用场合:①外设并不总是准备好      ②对传送速率和效率要求不高

        对外设及接口的要求:①外设应提供设备状态信息    ②接口应具备状态端口

        完成一次传送过程的步骤如下:

        ①通过执行一条输入指令,读取所选外设的当前状态

           外设 “忙”或“未准备就绪” —>重复检测外设状态

           外设 “空”或“准备就绪” —>发出I/O指令,进行一次数据传送。

        ②根据该设备的状态决定程序去向         

        优点:软件比较简单
        缺点:CPU效率低,数据传送的实时性差,速度较慢
    (3)中断传送方式

         无条件传递和查询传送的缺点是:CPU和外设只能串行工作。

         为提高系统的工作效率,充分发挥CPU的高速运算能力,引入了“中断”系统,利用中

         断来实现CPU与外设之间的数据传送,这就是中断传送方式。

         特点:外设在需要时向CPU提出请求,CPU再去为它服务。服务结束后或在外设不

         需要时,CPU可执行自己的程序。

         中断使CPU和外设以及外设之间能并行工作。

         工作过程:在中断传送方式中,通常在程序中安排好某一时刻启动某一台外设,然后

         CPU继续执行其主程序,当外设完成数据传送的准备后,向CPU发出中断请求信号,

         在CPU可以响应中断的条件下,现行主程序被“中断”,转去执行“中断服务程序”,在

         “中断服务程序”中完成一次CPU与外设之间的数据传送,传送完成后仍返回被中断的

         主程序,从断点处继续执行

          优点:CPU效率高, 实时性好,速度快
          缺点:程序编制较为复杂
    以上三种I/O方式的共性:
         均需CPU作为中介:
         软件: 外设与内存之间的数据传送是通过CPU执行程序来完成的
         硬件: I/O接口和存储器的读写控制信号、地址信号都是由CPU发出的 
          缺点:程序的执行速度限定了传送的最大速度

    (4)DMA(直接存储器存取)传递方式

        外设和内存之间直接传送数据的方式,即DMA传送方式。在DMA传送方式中,对这

        一数据传送过程进行控制的硬件称为DMA控制器(DMAC)。

        特点:外设直接与存储器进行数据交换 ,不需要CPU干预也不需软件介入。

                   总线由DMA控制器(DMAC)进行控制(CPU要放弃总线控制权),
                   内存/外设的地址和读写控制信号均由DMAC提供。
        DMA操作的基本方法:①周期挪用(Cycle Stealing)

                                             ②周期扩散

                                             ③CPU停机方式(最常用,最简单的传送方式)

​​​​​​        DMA的传送方式:

        ①单字节传送方式:每次DMA传送只传送一个字节就立即释放总线。

        ②成组传送方式:  DMAC在申请到总线后,将一组数据传送完后才释放总线,而不管中                                      间DREQ是否有效。

        ③请求传送方式(查询传送方式):

           成组传送,但每传送一个字节后,DMAC查DREQ,有效传,无效挂起。

        DMAC(DMA控制器)的基本功能:

        ①能接收外设的请求,向CPU发出DMA请求信号。

        ②当接到CPU发出DMA响应信号后,DMAC接管对总线的控制,进入DMA方式。

        ③能寻址存储器,即能输出地址信息和修改地址。

        ④能向存储器和外设发相应的读/写控制信号。

        ⑤能控制传送的字节数,判断DMA是否结束。

        ⑥在DMA传送结束后,能结束DMA请求信号,释放总线,使CPU恢复正常工作。

        DMA过程:
        首先DMAC通过HOLD引脚向CPU发出DMA请求信号,若CPU允许DMA传送,通过

        HLDA引脚发出允许命令;此时CPU总线交权,有关的所有引脚变为高阻态,总线的

        控制权交由DMAC来处理。当DMA传送结束后,DMAC取消向CPU发出的HOLD信号,

        CPU重新取回总线控制权。

 2. 中断

概述

中断——外设随机地(指主程序运行到任何一条指令时)或程序预先安排产生中断请求信号,暂停CPU正在运行的程序,转入执行称为中断服务的子程序,中断服务完毕后,返回到主程序被中断处继续执行的过程。 

中断源——引起中断的事件

通常中断源有以下几种:

(1) 输入、输出设备: 如键盘、显示器和打印机等;

(2) 数据通道: 如磁带等;

(3) 实时控制过程中的各种参数;

(4) 故障源: 如掉电保护等;

(5) 控制系统的现场测试信号以及软件中断。

中断系统应具有以下功能:

(1) 能实现中断响应、中断服务和中断返回

(2) 能实现中断优先级排队

(3) 能实现中断嵌套     


1. 中断过程

     一个完整的中断基本过程包括:中断请求、中断判优、中断响应、中断处理中断返回

     等五个基本过程。

     (1)中断请求

         当某一外部中断源要求CPU中断时,首先要向CPU发出中断请求,该请求信号被存

         放在中断源接口电路的中断请求触发器中暂存,并通过INTR(可屏蔽中断请求引脚)

         或NMI(不可屏蔽中断请求引脚)信号线引入CPU 。

     (2)中断判优(优先级)

          由于中断请求是随机的,在某一瞬间有可能出现两个或两个以上中断源同时提出请求

          的情况。这时必须根据中断源的轻重缓急,给每个中断源确定一个中断级别—— 中

          断优先权 。

          另一个作用能实现中断嵌套 。

     (3)中断响应

          CPU每执行完一条指令后,查询是否有中断请求。当查询到有中断请求且此时CPU

          允许中断(即IF=1,开中断),CPU响应中断。

          响应中断后系统做的工作:

          ①自动关中断;通过使IF清零来实现

          ②保存FR和断点

          ③形成中断入口地址。通过中断矢量,查询中断地址表实现。

      (4)中断处理

           执行中断服务程序

           ①中断服务开始要用压栈指令(PUSH)将要用到的寄存器内容压入堆栈,以便返

               回到主程序时能正确运行。——保护现场

           ②中断服务程序结束后,用POP指令把所保存的有关寄存器的内容从堆栈弹出,以

               便恢复到中断前的状态。——恢复现场

       (5) 中断返回

            通常在中断返回前,要用指令开中断,以便再次响应中断,然后执行中断返回指

            令IRET。IRET指令具有弹出断点地址送IP和CS及恢复标志寄存器FR内容的功能。

2. 中断优先权

    (1) 软件查询方式 

    (2)硬件优先权排队电路。

①简单硬件方式——菊花链法或链式优先权排队电路。

②专用硬件方式——可编程的中断控制器 

3. 8086/8088的中断系统  

1. 中断分类:   

    硬件中断——由外部硬件产生的,也称外部中断

        非屏蔽中断:通过CPU的NMI引入,它不受内部中断允许标志位IF的屏蔽,一般在一个                                系统中只允许有一个非屏蔽中断。 

        可屏蔽中断:通过CPU的INTR引入 ,它受IF的控制。只有在IF=1时,CPU才能响应中                                断源的请求。当IF=0时,中断请求被屏蔽。

    软件中断——CPU根据软件的某些指令或者软件对标志寄存器某个标志位的设置而产生                                的,由于它与外部中断电路完全无关,故称为内部中断。 

2. 中断向量表

    存放中段服务器程序的入口地址的,

    每个中断服务程序的入口地址都是由段地址:偏移地址

    所以每个中断占用4字节

    8086中断向量表的地址为00000H-003FFH   共1KB

    所以8086支持1KB/4B=256个中断

    存放中断地址的一段内存空间称中断向量表。

    存放各类中断的中断服务程序的入口地址  
    表的地址位于内存的0000∶0000~0000∶03FFH(即0段的0000~03FFH)大小为1KB,
    共256个入口
    每个入口占用4个单元,依次为IP:CS, 低字为段内偏移,高字为段基址
    第N号地址占用的是4N到4N+3的四个地址
    中断向量表:

3.  内部中断——软中断

     在8086/8088系统中,通过执行中断指令或由CPU本身启动的中断称为内部中断

   (也称软件中断)。

     除单步中断外,内部中断无法用软件禁止,即不受IF的影响。

     (1)内部中断的类型

         ①0型中断——除法出错中断

         ②1型中断——单步中断

         ③3型中断——断点中断

         ④4型中断——溢出中断

         ⑤INT n指令中断

     (2)内部中断的处理过程

          如何获取相应的中断类型码

          专用中断:中断类型码是自动形成的。

          几种类型码为:类型0、1、3、4。

          对于INT n指令,其类型码为指令中给定的n。

          取得了类型码后的处理过程:

              ①类型码*4 —> 向量表指针。

              ②标志寄存器FR入栈,保护各个标志。

              ③清除IF和TF标志,屏蔽新的INTR中断和单步中断。

              ④保存断点(断点处IP和CS压栈,先压CS后压IP)。

              ⑤从中断向量表中取出中断服务程序入口地址分别送入IP和CS中。

              ⑥按新的地址执行中断服务程序。

4.  外部中断——硬中断

     非屏蔽中断——NMI引脚产生的中断,不受IF控制,类型号为2。

     可屏蔽中断——由CPU的INTR端接收可屏蔽中断。受IF控制,只有当IF=1, 在一条指令

     执行结束后,CPU才能响应可屏蔽中断的请求。

     (1)外部中断的响应:

         CPU采样到非屏蔽中断请求时,自动提供中断类型号2,然后根据中断类型号,查找

         中断向量表指针,其后的处理与内部中断一样。

         当INTR信号有效,如IF=1,则CPU执行完一条指令后,进入可屏蔽中断响应周期。

         在中断响应周期中CPU从数据线中获取外部设备的中断类型码。

    (2)外部中断处理过程

        在外部中断响应周期中,CPU获取了外部中断类型码之后的中断处理过程,与前述的

        软中断过程顺序是一样的,不再赘述。

        如果把CPU中断响应周期的动作和前面讲到的中断响应过程结合起来,当一个可屏蔽

        中断被响应时,CPU实际执行了7个总线周期,即(内部中断和NMI中断没有前两步):

        ①执行第一个INTA周期(发出应答信号)。

        ②执行第二个INTA周期,被响应的外设通过D0~D7的8位数据线提供中断类型码n

         (由8259A提供),CPU接到类型码后,将它左移两位,形成向量表指针存入暂存器。

        ③执行一个总线写周期,把FR压栈。同时IF和TF为0,以禁止中断响应过程中其他可

            屏蔽中断的进入,同时也禁止了中断过程中出现单步中断。

        ④ 执行一个总线写周期,CS压栈。

        ⑤执行一个总线写周期,IP压栈。(保护断点 

        ⑥执行一个总线读周期,从中断向量表中取出中断服务程序入口地址的偏移量送IP中。

        ⑦执行一个总线周期,从中断向量表中取出中断服务程序入口地址的段值送CS。

  对于非屏蔽与软中断跳过第⑴、⑵步,从第⑶步开始执行到第⑺步。

        简写: ①INTA应答 ②INTA取中断类型码 ③压FR关IF TF  ④压CS  ⑤压IP

                    ⑥取新IP  ⑦取新CS

5. 各类中断的优先权及中断响应

    8086/8088系统中,中断优先权次序从高到低为:除法出错、INTn、INTO、NMI、INTR

    、单步中断。(内>外(NMI>INTR)>单步)

    除单步之外的内部优先权最高,其次是非屏蔽中断,再次是可屏蔽中断,而单步最低。

    软中断INT n的优先级排序一般原则是:n值越小级别越高

4.  8259A可编程中断控制器

1. 8259A的功能

    Intel 8259A 是与8086系列CPU兼容的可编程中断控制器,它的主要功能为:

  (1)具有8级优先权控制,级连可扩展至64级。

  (2)每一级中断都可以屏蔽或允许。

  (3)在中断响应周期,8259A可提供相应的中断向量号(中断类型号)。

  (4)8259A的工作方式,可通过编程来进行选择。  


2. 8259A的结构及工作原理

  (1)8259A的内部结构

  (2)8259A的引脚

  (3)8259A的工作原理

           当系统通电后,首先应对8259A初始化。(由CPU执行一段程序,向可编程芯片写

           入若干命令字,规定其工作状态,使其处于准备就绪的状态。

           8259A对外部中断请求处理过程如下:

              ①当有IR0~IR7变 高,则IRR的相应位置1。

              ②若中断请求线中至少有一条是中断允许的,则由 INT 引脚向CPU发出中断请求。 

              ③若CPU处于开中断状态,则在当前指令执行完后,用INTA信号作为响应。

              ④8259A接到INTA后,使最高优先权的ISR位置1,而相应的IRR位复位。在此周

    期中,8259A不向系统数据总线送任何内容。

              ⑤在中断响应周期的第二个信号期间8259A向数据总线输送一个8位指针(向量号

   或类型号),CPU读取此类型号,类型号*4作为地址就可从中断向量表中取出中

   断服务程序入口地址。

              ⑥若8259A工作在自动结束中断AEOI方式(Automatic End Of Interrupt),在第二

                  个INTA结束时,使中断源在ISR的相应位复位。否则,直至中断服务程序执行

                  到EOI命令,才使ISR的相应位复位。


3.  8259A的编程

     8259A的编程分两部分:

     初始化编程:由CPU向8259A送2~4字节的初始化命令字ICW

     工作方式编程:由CPU向8259A送三个字节的工作命令字OCW,以规定8259A的工作方

     式。该命令字可在8259A初始化命令字ICW后的任何时间写入。

   (1)8259A的初始化编程

            8259A的初始化命令字共4个(ICW1~ICW4)设置过程如图:

           ①写初始化命令字ICW1——芯片控制字

          ②写初始化命令字ICW2——中断类型控制字( 中断类型码 )

              用来定义中断类型码的高5位

         ③写初始化指令字ICW3—主/从片初始化(级连控制字)

         ④写初始化命令字ICW4——方式控制字

             对于8086/8088系统是必须设置的初始化命令字

(2)8259A的操作命令字 

         三个操作命令字OCW1~OCW3。

         在设置操作命令字时,顺序上没有严格的要求,但端口地址上有严格的规定。

         OCW1必须写入奇地址端口(A0=1)

         OCW2和OCW3必须写入偶地址端口(A0=0)

         ①操作命令字OCW1 —屏蔽操作命令字

             用来设置或清除对中断的屏蔽(设置IMR的值)

        ②操作命令字OCW2——中断方式命令字

            设置优先级循环和中断结束方式

       ③操作命令字OCW3——状态操作命令字

          设置和撤销特殊屏蔽方式、设置中断查询方式、

          设置对8259A内部寄存器的读出命令


4. 8259A的工作方式 

    (1)中断嵌套方式

       ①全嵌套方式

           当工作在全嵌套方式时,8259A写入初始化命令字后,中断优先权是固定的,即IR0

           优先权最高,IR7优先权最低。当CPU响应中断时,申请中断的优先权最高的中断源

           在ISR中相应位置位,而且把它的中断向量号(类型码)送到数据总线,在此中断源

           的中断服务程序完成前,与它同级或优先权更低的中断源申请被屏蔽,只有优先权比

           它高的中断源的申请才允许。

       ②特殊全嵌套方式——级连情况

          与全嵌套方式不同之处:

          当某一从片中断请求被响应后,主片不封锁从片的INT输入端,使该从片优先级更高

          的中断源的请求能得到响应。

          当从片中断处理快要结束时,用软件检查从片中断服务寄存器ISR的内容是否为0,若

          为0,则这个从片的中断请求是唯一的,此时连发两个中断结束命令EOI,使主片、从

          片都结束中断。若只发一个EOI命令则只结束从片,不结束主片中断。

   (2)中断优先级循环方式

        8259A中有两种改变优先权的办法

        ①自动循环方式

当某一个中断源服务完以后,它的优先级变成最低的 。

        ②特殊循环方式

            如果中断源的优先权需要任意改变,就必须工作在特殊循环方式下。此时,可用程

            序通过写OCW2来改变优先权。

            例如:  设置IR5为最低优先权,则IR6的优先权就变为最高。这时OCW2最高三位为

            110,而最低三位L2~L0应为101(最低优先权编码)。 

            OCW2:   1 1 0 0 0 1 0 1

    (3)中断屏蔽

        8259A的8条中断请求线的每一条都可根据需要单独屏蔽,可通过写入OCW1的命令

        字来实现。

        8259A有两种屏蔽方式:

       ①普通屏蔽方式

           特点:当执行某一级中断服务程序时,只允许比该级优先级高的中断源申请中断,

                      不允许同级或低级的中断源申请中断。          

           方法:用OCW1将IMR寄存器某一位或几位置1,即可将相应的中断请求屏蔽掉。

           使用情况:当CPU执行主程序时,可将不希望响应的中断源屏蔽;当CPU执行某中

                             断服务程序时,可将不希望响应的比此优先级高的中断源屏蔽。

       ②特殊屏蔽方式

           特点:CPU正在处理某一级中断时,只可对本级中断进行屏蔽,允许级别比它高的

                      或比它低的中断源申请中断。        

           方法:在某级中断服务程序中首先用OCW3设置该方式(即D6D5=11),然后设置

                      OCW1使该级的中断申请被屏蔽,只有写入这两个控制字之后,才能使中断

                      屏蔽寄存器IMR中该级中断位被屏蔽(=1),不允许发生同级中断,同时使

                      中断服务寄存器ISR相应位置0,允许比该级低级别的中断源申请中断。若想

                      退出此方式,通过设置OCW3的D6D5=10,再执行输出指令即可。

           使用情况:在中断处理过程中,需要动态改变系统的优先级结构时。

   (4)程序查询方式

       CPU利用查询命令(OCW3中D2=1)获得当前请求服务的优先级。此时8259A内部仍

       进行8级中断请求的判优和屏蔽管理。查询命令发出后,执行一条输入指令,可得到查

       询字。

   (5) 中断结束命令

         根据不同的工作方式8259A可以有几种不同的结束方法。

         ①自动中断结束方式(AEOI)

            特点:中断服务寄存器ISR的相应位清零是由硬件自动完成的。当某一级中断被CPU

                       响应后,CPU送回第一个INTA中断响应信号,使ISR的相应位置1,当第二个

                       INTA负脉冲结束时,自动将ISR的相应位置0。

            实现方法:通过将ICW4的D1位设置为1实现。

            使用环境:适用不要求中断嵌套的情况。

        ②非自动中断结束方式(EOI)

           特点:中断返回前,必须用指令向8259A发中断结束命令,即使ICW4的D1=0。若

                      级连,发2个。

           方法:首先将ICW4的D1=0,定为正常中断结束方式,然后用OUT向8259A的偶地

                      址端口输出OCW2操作控制字(OCW2的D7D6D5=001),实现自动结束命

                      令。

           使用环境:一般的中断结束方式只能应用于全嵌套方式下,不能用于优先级自动循环                              方式和优先级特殊循环方式。因为一般中断结束方式结束的中断是尚未处

                            理完的级别最高的中断。若中断级别改变,会使整个中断过程混乱。

        ③特殊中断结束方式

           特点:通过用指令发一中断结束命令,同时给出结束中断的中断源是哪一级,使该中

                       断源的中断服务寄存器ISR的相应位置0。

           使用环境:可应用在任何情况下,但要在中断处理中给出中断结束命令。

           使用方法:首先将ICW4的D1=0,定为正常中断结束方式,然后通过将OCW2的                                       D7D6D5=011或111,D2D1D0位指出结束中断处理的中断源号,使该

                             中断源在中断服务寄存器ISR中的相应位清零。

    (6)读8259A 的状态

        8259A的IRR、ISR、IMR的状态,可通过读命令读入CPU,供用户了解8259A的工作

        情况。

        ①在读命令之前,输出一个OCW3,令其RR=1,RIS=0(D1D0=10),可利用读命令

            读入中断请求寄存器IRR的状态。若RR=1,RIS=1(D1D0=11),可利用读命令读

            入中断服务寄存器ISR的状态。 

        ②对奇地址端口(A0=1)进行读操作,可读得中断屏蔽寄存器IMR的值。


5. 由多片8259A组成的主从式中断系统

    在一个系统中若中断源多于8个,必须采用多片8259A进行级连。其中有一片主8259A,

    若干片从8259A,可把中断源扩展到64个。


6.  8259A的编程实例

     (1)初始化编程

         例:对IBM PC/XT机中使用的8259A初始化编程。硬件连接如图。  

 第六章:常用接口技术

1. 8255

两个频率的比值=其周期比值的倒数

1s=10的三次方毫秒=10的六次方微妙=10的九次方纳秒

1KB=2的十次方B       1KHZ=10三次方HZ

周期T与频率F:S分之一=HZ  1S=1HZ  1ms=1000HZ=1KHZ   1纳秒=1000000HZ=1MHZ

二极管:单向导电性(只能从阳极往阴极流),想导通只能在阳极接高电平,在阴极接低电平

发光二极管:导通就亮

二极管图标
普通二极管
发光二极管
同反向驱动器

一. 并行通信和并行接口芯片

     1. 并行通信——就是把一个字符的全 部n个数据位用n条线同时进行传输。

         特点:传输速度快,效率高,用电缆多

         适用场合:数据传输率要求较高,而传输距离较短的场合。     

     2. 并行接口——实现并行通信的接口

         典型的并行接口和外设连接的示意图 : 

二. 可编程并行通信接口芯片8255A的应用

     1. 8255A的内部结构

         端口A:输入输出均锁存,数据不易丢失

         端口B:输入不锁存,输出锁存

         端口C:输入不锁存,输出锁存

         通常使用方法:

            (1)  端口A、B作为独立的输入或者输出端口

            (2)  端口C配合端口A、B 。通过方式控制命令分成2个4位端口,传送控制和状态信

                  息。

         (2) CPU接口部分

              ① 读/写控制逻辑电路

                   功能:管理数据传输过程。

              ② 数据总线缓冲器(双向三态的8位数据缓冲器 )

                   功能:通过它与系统数据总线相连。

     2. 8255A的引脚及功能

        ⑴ 与外设相连的引脚   24个

             PA7~PA0——端口A数据线

             PB7~PB0——端口B数据线

             PC7~PC0——端口C数据线

         注意:因为低8位和偶地址端口相连,所以在8086系统中,将8255A的A1、A0引脚分

                    别接向系统总线A2、A1,并且CPU对8255A的端口进行访问时,应将其地址

                    最低位A0设置为0。

     3. 8255A的控制字

         根据D7位的状态来决定控制字分两类。

         两类 :①各端口的方式选择控制字   ②C端口按位置1/置0控制字

⑴方式选择控制字

       (2)端口C置位/复位控制字(D7=0)  

            此控制字必须写入8255A的控制口

     4. 8255A的工作方式

        (1)方式0——基本输入/输出方式

             特点:①端口A、端口B、端口C上、下均可作为输入或输出口,且各端口均是独立

                         的。

       ②四个端口的输入或输出,可以有16种不同的组合。   

       ③各端口输入时无锁存,输出时锁存。  

             使用场合:①同步传送 (无条件传送方式)          ②查询式传送

        ⑵方式1——选通的输入/输出方式

            必须利用端口C提供的选通信号和应答信号

            特点:①端口A和B要在端口C 的配合下工作。

                       ②端口C中有三位用于端口A的I/O控制,另有三位用于端口B的I/0控制,并

                          且提供中断逻辑。

                       ③若只有一个数据端口工作在方式1,则另一个数据端口及端口C余下的五位

                           可工作于方式0;若两个数据端口都工作于方式1,那么端口C余下的两位

                           可作I/O位,也可进行置位/复位操作。

         注意:①方式2的I/O均为锁存

                    ②端口A工作于方式2时,  端口B可工作于方式0或方式1

                    ③端口C用5个数位提供控制和状态信号

    5. 8255A应用举例

     (1)8255A工作方式0

           某接口设计采用一片8255A实现。其端口A连接并行打印机, 端口B连接纸带读入机。

           8255A工作于方式0,以查询方式传送数据。对8255A初始化并编写相关的程序

           各控制信号的意义为:

              DATA STROBE ──数据选通信号。打印机要有一个宽度为0.5μs的脉冲,作为数

               据选通信号。由PC4位输出。

              BUSY──当其有效时为高电平,此时表示打印机“忙”,不能接收新的输出数据。

              这是打印机的状态信号。由PC2位读入。

              DRIVE RIGHT──此信号驱动纸带前进一步,并读一个字符。它是8255A给外设的

              启动信号。由PC5位输出。

              DATA READY──纸带读入器的状态信号。其为高电平表示纸带读入器已将数据准

              备好。由PC3位读入。

     ⑵ 8255A工作于方式1应用举例

         8255A工作于方式1,可以支持CPU以中断方式和外设进行通信。下图是一个使

         用8255A的接口电路,其中字符打印机以中断方式工作。

2. 可编程定时/计数器8253

如何实现定时?

   1. 软件方法:用一段程序实现延时:利用程序循环延迟指定的时间

       缺点:CPU占用率高,延时精度低, 兼容性低 

   2. 硬件方法:定时/计数器电路:利用脉冲计数在设定的时间输出定时信号 

   3. 8253是一种硬件定时/计数器芯片

注意:定时器的本质是计数器,定时器是基准为时间的计数器


一. 外部引线及内部结构

      8253概貌:

          3个16位的定时/计数器(通道)

          24引脚双列直插式

          最高计数频率2.6MHz

          TTL电平兼容

          单电源+5V供电

      计数通道的主要引线(每通道均相同):

           CLKn     时钟脉冲输入,计数器的计时基准。
           GATEn   门控信号输入,控制计数器的启停。
           OUTn     计数器输出信号,不同工作方式下产生不同波形。

         (n = 0~2)           

二. 计数启动方式

     编程结构:

        计数器(3个)—— 包括:16位初值寄存器,16位计数寄存器(减法计数器) 

        控制寄存器—— 存放控制命令字(只写)

        占用4个地址— 3个计数器,1个控制寄存器

     控制字:

        用于确定各计数器的工作方式。

8253必须先 初始化才能正常工作。
每个计数器都必须初始化一次。
CPU通过OUT指令把控制字写入控制寄存器。

     8253的控制字格式:

     关于的控制字说明:

 1. 8253只有一个工作方式控制字,但是对每个计数器而言,它们的工作方式控制字
     内容一定各不相同(前两位不同),所用各计数器的控制字需要分别设置,先后
     不计。   
 2. 8253的工作方式控制字的特殊形式可用于对计数器的当前计数值进行锁存。
 3. 在工作方式控制字被设置之后,随后必须紧接着给计数器预设置计数初值,计数
     器方可开始工作。

     定时/计数的工作过程

         1. 设置8253的工作方式(写入控制字)

         2. 设置计数初值到初值寄存器

         3. 第一个CLK信号使初值寄存器的内容置入计数寄存器

         4. 以后每来一个CLK信号,计数寄存器减1 

         5. 减到0时,OUT端输出一特殊波形的信号

         注:以上计数过程中还受到GATE信号的控制

        在8253中

            对于二进制置数   初值范围(0-65535)  计数范围(1-65536)

            对于十进制置数   初值范围(0-9999) 计数范围(1-10000)

            所以最大初值是0

        初值= 输入频率/输出频率 或 输出周期/输入周期

三. 工作方式

      1. 方式0——计数结束中断

          软件启动,不自动重复计数。

          装入控制字后OUT端变低电平,计数结束OUT输出高电平。

          计数过程中,GATE端应保持高电平。每写入一次初值计数一个周期,然后停止计

          数。OUT端输出是一个约(N+1)TCLK宽度的负脉冲。计数过程中可随时修改初值重

          新开始计数。

      2. 方式1——可重复触发的单稳态触发器

          硬件启动,不自动重复计数。装入控制字后OUT端变高电平。计数开始OUT端变为

          低电平,计数结束后又变高。 

          门控信号GATE端的跳变触发计数,可重复触发。若下一次GATE上升沿提前到达,

          则OUT端负脉冲拉宽为两次计数过程之和。

          计数过程中写入新初值不影响本次计数。

     3. 方式2——频率发生器

         软、硬件启动,自动重复计数

         装入控制字后OUT端变高电平,计数到最后一个CLK时OUT输出负脉冲,并连续重

         复此过程。 

         GATE为计数的控制信号:GATE变低计数停止,再变高时的下一个CLK下降沿,从

         初值开始重新计数。

         每个计数周期结束时(减到1时),OUT端输出一个TCLK宽度的负脉冲。

         计数过程自动重复进行。

         计数过程中修改初值不影响本轮计数过程。

    4. 方式3——方波发生器

        软、硬件启动,自动重复计数

        装入控制字后OUT端变高电平,然后OUT连续输出对称方波:

            前 N/2或(N+1)/2 个CLK,OUT为高,

            后N/2或(N-1)/2 个CLK,  OUT为低。

        OUT输出方波,前半周期为高,后半周期为低。

        计数过程中修改初值不影响本半周期计数过程。

        GATE可以作为计数的控制信号:GATE变低计数停止,再变高时的下一个CLK下降

         沿,从初值开始重新计数。

    5. 方式4——软件触发选通

        软件启动,不自动重复计数。

        装入控制字后输出端变高电平,计数结束输出一个CLK宽度的负脉冲

        计数过程中,GATE端应保持高电平

        每写入一次初值,计数一个周期,然后停止计数。 

        每个计数周期结束时(减到0时),OUT端输出一个TCLK宽度的负脉冲。

        计数过程中修改初值不影响本轮计数过程。

    6. 方式5——硬件触发选通

        硬件启动,不自动重复计数。

        OUT端波形与方式4相同

        写入初值时,GATE端应保持低电平。 

        GATE每出现一次正脉冲,计数一个周期,然后停止计数。

        每个计数周期结束时(减到0时),OUT端输出一个TCLK宽度的负脉冲。

        计数过程中修改初值不影响本轮计数过程。

   8253的6种工作方式的输出波形:

       由软件触发计数 (送新的计数值)—— 方式0、方式4
       由硬件触发计数 (由GATE触发) —— 方式1、方式5
       分频计数器输出(产生序列脉冲) —— 方式2、方式3

  与系统的连接示意图:

  初始化程序流程:

  扩展定时/计数范围(级联):

      当定时长度不够时,可把2个或3个计数通道串联起来使用,甚至可把多个8253串联起

      来使用。

      例如:CLK频率为1MHz,要求在OUT1端产生频率1Hz的脉冲。

      这时可将计数器0、1串联,工作方式都均为方式3,计数初值均为1000。

      如何读出当前计数值:

第1种方法——在计数过程中读计数值
锁存当前计数值,再用两条输入指令将16位计数值读出。
第2种方法——停止计数器再读
GATE信号使计数器停止,再规定RL1和RL0的读写格式,然后读出。

  • 28
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值