广工微机复习.docx
《广工微机复习.docx》由会员分享,可在线阅读,更多相关《广工微机复习.docx(32页珍藏版)》请在冰豆网上搜索。
广工微机复习
第1章
1.1微型计算机系统的组成
微型计算机(简称微机)系统由硬件系统和软件系统两大部分组成。
微机:
微处理器内存储器I/O接口电路系统总线
P4组成图
1.1.1微型计算机的典型结构及工作原理
数据总线DB(DataBus)
数据总线用于传送数据信息,其位数与处理器字长相等,例如8位微机的数据总线有8条,16位微机的数据总线有16条。
数据总线上所传送的可以是真正的数据,也可以是指令代码、某些状态信息等。
数据总线是双向的,它既可供处理器送出数据,也可供其他部件将数据送至微处理器内部。
8位微机的8根数据线分别表示为D7--Do,Do为最低位。
地址总线AB(AddressBus)
地址总线是传送地址信息的一组线,是微处理器用来寻址存储器单元或I/O接口用的总线。
其总线宽度(位数)将决定微处理器当前可寻址的内存储器容量范围,例如8位微处理器有16条地址线(分别用A15–A0表示,A0为最低位),可以寻找216=65536个不同地址,用十六进制数表示的地址范围为:
0000H–FFFFH。
控制总线CB(ControlBus)
控制总线是系统中控制信号的传输线,其中有微处理器送往存储器和外围设备的输出控制信号,如读、写、访问请求信号等,也有外设通过接口反馈给微处理器的输入控制信号,如中断信号、总线请求信号、等待信号等。
上述地址线、数据线和控制线是计算机系统内各功能模块(如CPU、内存、I/O接口等)之间相互连接的总线,称系统总线,又称板问总线或内总线。
1.2计算机中的数及其编码
1.1.2机器数和真值
用“+”、“—”号表示的数,称为数的真值。
如:
真值可以用二进制表示,也可用十进制表示。
真数:
N1=+1101001B=+105,N2=-1101001B=-105
对应的机器数为Nl:
01101001,N2:
11101001
1.1.3带符号数、无符号数
用0表示正数、用1表示负数的符号,这种表示数的方法,称为带符号数的表示方法。
把全部有效位都用以表示数的大小,这种表示数的方法,称为无符号数的表示方法。
机器数11001011若看作带符号数,则其真值为-75;若看作无符号数,则其真值为203。
1.1.4原码、反码和补码
原码:
就是数值部分不变,而用最高为“o”和“1”分别来表示数的符号“+”和“-”的机器数。
反码:
正数的反码就是它的原码,负数的反码就是它的原码除符号位外各位取反。
补码:
引入补码的目的是在于将加、减法运算简化为单纯的加法运算。
正数:
原码=反码=补码
负数:
原码不变
反码:
它的原码除符号位外各位取反。
补码:
在反码的基础上+1.
【注意】X1=+67=+1000011B[x1]原=01000011B
X2=-67=+1000011B[x1]原=11000011B
1.1.5二进制编码
计算机中采用的是二进制数。
二进制编码的十进制数(BCD码)
由于二进制具有很多优点,所以到目前为止在计算机内部多采用二进制运算。
但是,二进制数书写起来很长,读起来也不方便。
考虑到人们的习惯,通常,数在送人机器之前,仍采用十进制编码,运算结果也以十进制输出。
这就要求在输入时,将十进制转换成二进制,输出时,将二进制转换成十进制,这项工作一般由机器来完成。
因而,产生了一个适合于十进制的二进制代码的特殊形式,即二进制编码的十进制数,简称BCD码(BinaryCodedDecimal)。
BCD码有两种形式,即压缩BCD和非压缩BCD码。
压缩BCD码压缩BCD码的每一位用4位二进制位表示,一个字节表示两位十进制数。
例如,10010110BCD表示十进制数96D。
非压缩BCD码非压缩BCD码用1个字节来表示一个十进制数,高4位总是0000,低4位为0000-1001之间的数。
例如,00000111BCD表示十进制数7。
一般没指明的BCD码都是压缩BCD码。
详情看P14的顶头图片。
注意:
BCD码与真正的纯二进制数是不同的。
它貌似二进制,实为十进制。
通常用在计算机的输入/输出设备中,作为计算机用的二进制与人们日常用的十进制之间的一种过渡性编码。
ASCII表——P14
1.2计算机中数的运算方法
1.2.1定点加减法运算及溢出判断
补码加减法运算在微型计算机中,带符号数一般都以补码的形式在机器中存放和进行运算。
这主要是因为补码的加减法运算比原码的简单:
符号位与数值部分一起参加运算,并且自动获得结果(包括符号和数值部分)。
[X+Y]补=[X]补+[Y]补
[X-Y]补=[X]补+[-Y]补
补码运算时,参加运算的两个数均为补码,结果也是补码,欲得真值,还需转换。
例1-31-41-5
1.2.2溢出及判断
8位计算机中,由于最高位为符号位,剩下的数值位只有7位,因此表示数范围是-128-+127。
当两个正数相加其和大于127或两个负数相加其绝对值之和大于128,就是“溢出”,致使结果出错。
例1-5
判断原理:
无论是用带符号数和无符号数,只要数的绝对值超过机器所能表示的最大值,就会发生溢出。
在8086/8088中,两个带符号数相加/相减运算时,是否发生溢出由OF来判别,CPU根据运算结果自动对溢出标志OF置位。
实际上微处理器是根据C6(次高位向最高位的进位)与C7,(即最高位的进位CF)两个数的异或来置OF的,对于16位运算为Cl4、Cl5。
即
OF=C6⊕C7或者OF=C14⊕C15溢出OF=1,否则OF=0
异或运行
第2章
1.38086/8088CPU的编程结构
1.3.18086/8088CPU的内部结构
8086/8088CPU的内部结构基本相同,它们均由两个独立的工作部件组成,一个称为执行部件EU(ExecutionUnit),一个称为总线接口部件BIU(BusInterfaceUnit)。
8088和8086两种CPU的执行部件是完全相同的,但总线接口部件有些差别。
8086CPU的外部数据总线为16位,指令队列6个字节,而8088CPU的外部数据总线为8位,指令队列4个字节。
8088CPU因其外部数据总线8位而被称为准16位微处理器。
P19——结构框图
1.3.28086/8088CPU的寄存器结构
8086/8088CPU内部具有13个16位的寄存器和一个16位,但只用了9位的状态标志寄存器。
(看P20图2-2)
1.通用寄存器组
图2-2中8个16位的通用寄存器分为两组:
数据寄存器、指针寄存器和变址寄存器。
数据寄存器
包括AX、BX、CX和DX。
通常用来存放16位的数据和地址。
它们中的每一个又可以分为高字节H和低字节L寄存器,即AH、BH、CH、DH及AL、BL、CL、DL两组,用来存放8位数据,它们均可独立寻址,独立使用。
由于在某些指令中,它们被隐含地使用,所以习惯上把AX称为累加器;BX称为基址(Base)寄存器;CX称为计数(Count)寄存器;DX称为数据(Data)寄存器。
指针寄存器和变址寄存器
包括SP、BP、SI和DI。
它们都是16位寄存器,可以存放数据,但通常用来存放逻辑地址的偏移量,是形成20位物理地址码的其中一部分,在任何情况下,它们都不能独立地形成访问内存的地址码。
SP(StackPointer)堆栈指针
用于存放堆栈操作(压人或弹出)时,存储单元地址的段内偏移地址。
其段基址由段寄存器SS提供。
BP(BasePointer)基址指针
用于存放位于堆栈段中的一个数据区基址的偏移地址。
它与SP的区别在于SPP是存放堆栈栈顶的偏移量。
凡是含有BP的寻址方式中,都是对堆栈区的存储单元寻址的,因此其段地址由段寄存器SS提供。
SI(SourceIndex)和DI(DesinationIndex)称为变址寄存器
用来存放当前数据段的偏移地址。
源操作数地址的偏移量存放于SI中,所以又称SI为源变址寄存器。
目的操作数地址的偏移量存放于DI中,所以DI称为目的变址寄存器。
隐含使用(P21表2-1)
2.段寄存器组
8086/8088CPU可寻址1MB存储空间,但指令中给出的地址码仅有16位,指针寄存器和变址寄存器也只有16位长,不能直接寻址1MB空间。
为此采用一组段寄存器将这1MB存储空间分成若干逻辑段。
每个段长最大为64KB。
8086/8088CPU的BIU中有4个16位段寄存器,用来存放段起始地址(基址)的高16位。
8086/8088的指令能直接访问这4个段。
4个段寄存器是:
代码段寄存器CS(CodeSegment)存放当前执行程序所在段的段基址;
数据段寄存器DS(DataSegment)存放当前使用的数据段的段基址,通常数据段用来存放数据和变量;
堆栈段寄存器SS(StackSegment)存放当前堆栈段的段基址;堆栈是内存中的一个特别存储区,主要用于在调用子程序或中断时,保留返回主程序的地址和保存进入子程序将要改变其值的寄存器的内容。
附加段寄存器ES(ExtraSegment)存放附加数据段的段基址,附加段是在进行字符串操作时作为目的地址使用的。
DS和ES的初值都要由用户用程序设置,若DS和ES的初值相同,则数据段和附加段重合。
3.控制寄存器组
(1)指令指针lP(InstructionPointer)
它是一个16位的寄存器,总是存放着下一次要取出指令的偏移地址。
(2)标志寄存器
8086/8088CPU设立了一个16位寄存器,用了其中9位作标志位。
6个是反映前一次涉及ALU操作结果的状态标志,其余3个是控制CPU操作特征的控制标志。
主要状态标志如下:
(其他详情看P22)
CF(CarryFlag)进位标志:
加法时的最高位(字节操作是D7位,字操作是D15位)产生进位或减法时最高位产生借位,则CF=1,否则CF=0。
AF(AuxiliaryCarryFlag)辅助进位标志:
加法时D3位有进位或减法时D3位有借位,则AF=1,否则AF=0。
这个标志只供BCD码算术运算时使用。
OF(OverflowFlag)溢出标志:
带符号数在进行算术运算时,其结果超出8位或16位带符号数所能表示的数值范围,产生溢出,则OF=1,否则OF=0。
ZF(ZeroFlag)零标志:
运算结果各位都为零,则ZF=1,否则ZF=O。
1.48086/8088的存储器组织
1.4.1存储器组织
8086/8088系统中的存储器按字节组织,因CPU具有20条地址线,所以可寻址的存储空间为220(=1M)B。
每个字节对应有唯一的20位物理地址,因此,用十六进制数表示的存储地址范围为OOOOOH–FFFFFH。
(注意:
210=1024,220=1024*1024,于是1MB=1024KB=1024*1024B)
当存储器存放的数是一个字节时,将按顺序存放;当存放的数是一个字数时,其低位字节放在低地址中,高位字节放在高地址中,字的地址指向低字节地址。
存储器与CPU连接(次重点)
存储器与8086CPU相连接时,1MB的空间实际上被分成两个512KB的存储库。
低位库与8086CPU的低位字节数据线D7-D0连接,库中每个存储单元地址都为偶数地址;高位库与高位字节数据线D15—D8连接,库中每个存储单元都为奇地址。
地址线A19–A1可同时对两个库的存储单元寻址。
A0和
用于库的选择,分别接到库的选择端SEL上,如图2-4所示。
(书本P23)
当A0=0,
=1时,选中偶地址的低位库;当A0=1,
=0时,选中奇地址库的高位库;当A0=0,
=0时,则高低库同时被选中。
8088CPU因外部数据总线是8位,因此它所对应的1MB存储空间是单一的存储体。
这样A0与A19~A1,一样参加寻址。
8088与存储器的连接如图2-5所示。
(书本P23)
【拓展】8086CPU内部处理器16位外部芯片16位16条数据线
808816位外部芯片8位8条数据线
8086CPU数据总线16位,对规则字的存取,需要1个总线周期;对非规则字的存取,则需2个总线周期。
8088CPU数据总线8位,无论是对16位的字数据还是对8位的字节数据操作,也无论是对规则字,还是非规则字的操作,每一个总线周期只能完成一个字节的存取操作,对字数据所组织的连续两个总线周期是由CPU自动完成的。
1.4.2存储器的分段和物理地址的形成
1.存储器的分段
8086/8088CPU内部存放地址信息的地址寄存器BX、IP、SP、Sl和DI以及算术逻辑单元ALU都是16位,不能直接寻址1MB内存空间,为了扩大寻址范围,8086/8088CPU巧妙地采用地址分段方法,将寻址范围扩大到1MB。
8086/8088把1MB空间分成若干逻辑段,每段最多64KB长。
各逻辑段的起始地址叫基址,它是一个能被16整除的20位地址,即低4位二进制码必须是0,高16位地址由软件设置于段寄存器中。
段内任意一个存储单元的地址,可用相对于段起始地址(基址)的偏移量(或称位移量)来表示,这个偏移量称为段内偏移地址,通常存放于lP、SP、SI或DI中,偏移地址也是16位的,所以一个段最大可以包含一个64KB的存储空间。
段的基址由段寄存器CS、DS、SS和ES提供,程序可以从这四个段寄存器规定的逻辑段中存储指令代码和数据。
若已知当前有效的代码段、数据段、堆栈段和附加段的段基址分别是0600H、3000H、B000H和BC00H,当前可寻址段在存储器中的分布情况如图2-7所示。
(图见P24)
2.物理地址的形成
存储器中存储单元对应的实际地址又称为物理地址,对8086/8088系统来说,是由20位二进制数表示的代码。
逻辑地址是在程序中使用的地址,它由两部分组成:
段基址和偏移量。
它们都是无符号的16位二进制数。
逻辑地址的表示格式为:
段基址:
偏移地址。
物理地址由逻辑地址变换而来,当CPU需要访问存储器时,必须完成如下的运算:
物理地址=段基址X16+偏移地址
例如:
2000H:
3300H表示段基址为2000H,偏移地址为3300H,存储器的物理地址为23300H。
1.58086/8088的I/O组织
由于I/O设备的复杂性和多样性,尤其是工作速度远远低于CPU,所以I/O设备不能直接和CPU总线直接相连,而必须通过I/O接口芯片进行联系,它们之间才能相互交换信息。
每个I/O接口芯片上都有一个或几个端口,一个端口往往对应于芯片上的一个或一组寄存器,一个I/O端口有唯一的I/O地址与之对应,就像存储单元地址一样。
8086/8088采用独立编址方式,它设有输入指令IN和输出指令OUT用于访问I/O端口。
1.68086/8088CPU的引脚功能和工作方式
1.6.1引脚功能(略)
1.6.2工作方式
最小工作方式
当把8086/8088的MN/MX引脚接到+5V时,CPU就处于最小工作方式。
了解:
所谓最小工作方式,就是系统中只有一个微处理器8086或8088。
在这种系统中,所有的总线控制信号都直接由8086或8088产生,系统中总线控制逻辑电路被减小到最小,这种方式适合于较小规模的应用。
最大工作方式
当把8086/8088CPU的MN/MX引脚接地时,CPU就处于最大工作方式。
了解:
最大工作方式用在需要利用8086/8088CPU构成中等或较大(相对于最小方式)系统时。
在最大方式系统中,可以只有一个微处理器,也可以有两个或两个以上的微处理,其中8086或8088为主处理器,其他处理器称为后援处理器,用来协助主处理器处理某方面的工作。
第3章8086/8088指令系统
主要介绍8086/8088指令系统的指令格式、寻址方式和各类指令。
1.7指令格式与寻址方式
1.7.1指令格式
通常,一条指令应包含两个基本信息,即操作码和操作数。
操作码操作数
操作码指示计算机执行具体的操作,如加、减、移位、比较等;
操作数用来指出操作码所需操作数的来源和操作结果的去向,即给出操作数或操作数地址,并指出操作结果存放地址。
1.7.2寻址方式
通俗说:
寻址:
数据放在哪里,去哪里寻,绝大部分数据放在内存中,或已经放在CPU寄存器DX等中了,或是……
8086/8088的寻址方式包含操作数的寻址方式和指令的寻址方式。
由于指令通常是顺序存放的,因此,指令寻址只要通过对指令指针IP内容自动加1修改,便可形成下条指令地址。
只是当遇到转移指令或调用指令时,要按照转移目标去修改IP内容或CS内容。
本节主要讨论操作数的寻址方式
所谓操作数寻址就是寻找指令中所需操作数的方法。
操作数可有如下多种不同的来源:
1)操作数包含在指令中,紧跟在操作码之后,称为立即操作数。
2)操作数在CPU内的某个寄存器中。
3)操作数在内存的某单元中,这时指令中给出的或是操作数所在单元的地址,或是产生该地址的计算方法。
4)操作数在某I/O端口中。
操作数的来源多,其寻址方式就多。
8086/8088提供了8种寻址方式对操作数寻址,它们是:
隐含寻址、立即数寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址和相对基址变址寻址。
下面分别说明这些寻址方式。
1.隐含寻址
隐含寻址就是指令中不指明操作数,但隐含在操作码中。
如乘法指令,本来乘法是双操作数运算,指令应指明两个操作数(地址),但乘法指令的形式是单操作数指令形式(MULsrc),只指示了源操作数src;另一操作数未指明,它是隐含的,隐含为AL或AX。
同样乘积的存放地址也是隐含的,为AX或AX、DX。
又如进栈、出栈指令(PSUHsrc,POPdst),其中另一个操作数地址也是固定的,即堆栈栈顶。
隐含寻址的指令,不需要计算有效地址EA,执行速度快。
2.立即数寻址
立即数寻址就是操作数直接包含在指令中,紧跟在操作码之后,它作为指令的组成部分存放在代码段内,随着取指令一起被放入指令队列,执行时直接从指令队列中取出,不必执行总线周期访问存储器,故称之为立即数。
立即数可以是一个8位或16位数,如果是16位数,则其低字节存放在低地址单元,高字节存放在高地址单元。
例如:
MOVAL,2CH;将8位十六进制立即数2CH送入AL
MOVAX,2C40H;将16位的立即数2C40H送入AX,AH中为2CH,AL中为40H,;指令执行情况如图3-1所示(P52)
立即数寻址主要是用来对寄存器赋值,由于操作数可从指令中直接得到,不需要执行总线周期,所以,立即数寻址方式的显著特点就是执行速度快。
需注意的是,立即数寻址方式只能用于源操作数,不能用于目的操作数。
3.寄存器寻址
如果操作数包含在CPU内的某个寄存器中,指令中直接给出该寄存器名,这种寻址方式称为寄存器寻址。
对于16位的操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP和BP;
对于8位操作数,寄存器可以是AL、BL,CL,DL及AH.BH、CH、DH。
例如:
P52
INCCX
MOVA.X,BX
特点:
一条指令中,源操作数和目的操作数都可以使用寄存器寻址方式。
采用寄存器寻址方式的指令在执行时,操作就在CPU内进行,不需执行总线周期,所以,执行速度快。
说明:
立即数寻址和寄存器寻址,由于操作数可以从指令队列或CPU内部寄存器中直接获得,所以,执行速度最快。
但是,若操作数在存储器中,一般位于数据段、堆栈段或附加段中,这时指令中给出的是操作数所在单元的有效地址EA或产生EA的计算方式。
。
因此,用存储器寻址的指令,执行速度相对上述两种寻址方式来说就要慢得多。
留意:
P53表3-1
由表3-1可知,程序存放在代码段,堆栈操作只能在堆栈段,目的数据串存取在附加段,而其他情况是可以允许段超越的。
注意,8086/8088规定,在一条指令中,只能有一个操作数为存储器操作数,或源操作数,或目的操作数。
下面分别介绍5种存储器寻址方式:
4.直接寻址
操作数在存储器中,16位有效地址EA由指令中直接给出,即紧跟在指令的操作码之后,这种寻址方式称为直接寻址。
如果指令中没有用段超越前缀指明操作数在哪个段,则默认为操作数在数据段。
所以,直接寻址时,物理地址的计算公式为PA=(DSX16)+EA,即将DS中的内容左移4位再加上指令中给定的16位有效地址EA。
例如:
MOVAX,[1400H]
该指令中给出的有效地址EA=1400H,若DS=2000H,则操作数的物理地址PA=(DSX16)+EA=20000H+1400H=21400H。
直接寻址方式示意图如图3-2。
应注意的是
1.在直接寻址方式中,如果指令中的有效地址是一个16位数,为了不与立即数寻址相混淆,在书写汇编语言指令时,有效地址应用方括号[]括起来,如上例所示;如果有效地址是个符号地址,如MOVAX,DATA,则不用加方括号。
2.如果操作数不在数据段而在其他段(堆栈段或附加段),则可用段超越前缀在操作数地址前说明。
例如MOVAX,ES:
[2100H],该指令表明操作数不在数据段,而在附加段中,其物理地址计算时应用ES的内容,即PA=(ESx16)+2100H。
5.寄存器间接寻址
操作数的有效地址在指令中指定的某个寄存器中,这种寻址方式称为寄存器间接寻址,这个寄存器称为间址寄存器。
和上述寄存器寻址不同的是,指令中给出的寄存器中的内容不是操作数本身,而是操作数的有效地址。
寄存器间接寻址指令书写时,寄存器外面必须加方括号[],以便与上述的寄存器寻址相区别。
例如:
MOVAX,[BX];将以BX内容为有效地址的字存储单元中的数据送入AX中
;BX为间址寄存器,外面必须加[]
能够用做间址寄存器([])的寄存器有:
BX、BP、SI和DI。
由这四个间接寻址寄存器确定的操作数可位于数据段或堆栈段中。
出现下面两种情况:
(1)当指令中指定用BX、SI或DI为间址寄存器,则操作数在数据段中,这时以段寄存器DS的内容为段基址,操作数的物理地址为:
例如:
MOVAX,[DI]
若已知(DS)=2000H,(DI)=5000H,则源操作数的PA=(DS)X16+(DI)=25000H。
该指令把数据段中25000H和25001H所指示的两字节单元(因为16)的内容2C40H传送到AX中。
寄存器间接寻址方式示意图如图3-3所示。
(P54图)
2)若指令中指定BP为间址寄存器,则操作数放在堆栈段中。
这时,以段寄存器SS中的内容为段基址。
操作数的物理地址为PA=(SS)x16+(BP)
寄存器间接寻址中也可以用段超越前缀来从其他非默认段取得操作:
例如:
MOVBX,ES:
[BP];源操作数的物理地址PA=(ES)x16+(BP)
MOVAX,SS:
[SI];源操作数的物理地址PA=(SS)x16+(SI)
6.寄存器相对寻址
寄存器相对寻址和寄存器间接寻址类似,只是操作数的有效地址EA等于指令所指示的寄存器中的内容再加上指令中给定的8/16位的位移D,D是一个带符号数,用补码表示。
间址寄存器仍可为BX、BP、SI和DI。
同样,当