天津大学微机原理复习 电信版Word文档格式.docx
《天津大学微机原理复习 电信版Word文档格式.docx》由会员分享,可在线阅读,更多相关《天津大学微机原理复习 电信版Word文档格式.docx(59页珍藏版)》请在冰点文库上搜索。
![天津大学微机原理复习 电信版Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/2/e32aedd3-e1e6-47c1-89f5-2fb959b68b30/e32aedd3-e1e6-47c1-89f5-2fb959b68b301.gif)
SI:
指向源操作数
DI:
指向目的操作数
指令指针寄存器IP
是一个16位的专用寄存器。
当BIU从内存中取出一条指令,自动修改IP,始终指向下一条将要执行的指令在现行代码段中的偏移量。
8086/8088中的某些指令执行后会改变IP的内容,但用户不能编写指令直接改变IP的内容。
IP是指令地址在代码段内的偏移量(又称偏移地址),IP要与CS配合共同构成物理地址。
状态标志寄存器F
F是一个16位的专用寄存器,其中6位状态位用于存放运算结果的特征,3位控制位用于控制CPU的操作。
状态位
SF位:
符号位(SF=1负数;
SF=0正数)
ZF位:
零标志位(ZF=1运算结果为0;
ZF=0运算结果不为0)
CF位:
进位标志位(CF=1最高位有进位/借位;
CF=0最高位无进位/借位)
AF位:
辅助进位(AF=1有进位;
AF=0无进位;
辅助位表示低4位有无进位或借位)
PF位:
奇偶标志位(PF=1运算结果1的个数为偶数;
PF=0运算结果1的个数为奇数)
OF位:
溢出位(OF=1有溢出;
OF=0无溢出)主要对带符号数运算数值过大,侵占了符号位
三个控制位
DF:
方向标志-控制数据串操作指令的步进方向
DF=1减址方式(STD)
DF=0增址方式(CLD)
IF:
中断允许标志-对可屏蔽中断
IF=1开中断(STI)
IF=0关中断(CLI)
TF:
陷阱标志-程序调试
TF=1单步执行
TF=0连续正常执行
总线周期
CPU完成对存储器或I/O端口的一次访问所需的时间;
8086一个基本的总线周期一般由4个时钟周期组成。
读写周期时序
读周期:
T1:
输出地址;
T2:
总线浮空、缓冲;
T3-T4:
从总线输入数据传送数据
写周期:
T2-T4:
把输出数据送到总线上。
若存储器或外设速度慢,则向CPU发送READY无效信号,可在T3后插入一个或多个等待周期TW;
就绪后,发READY有效信号,CPU自动脱离TW而进入T4状态。
若一个总线周期后不执行下一个总线周期,即总线上无数据传输操作,系统总线处于空闲状态,此时执行空闲周期。
8086储存格式
规则字:
从偶地址开始存放的字
非规则字:
从奇地址开始存放的字
特点:
规则字的存取在一个总线周期内即可完成
非规则字的存取则需2个总线周期
I/O端口组织
8086系统和外部设备之间是通过I/O接口相互传输信息的。
端口:
I/O芯片上的一个或一组寄存器,一个I/O芯片上有若干个端口。
端口号(端口地址):
为每个I/O端口分配的地址,具有惟一性。
微机I/O端口有两种编址方式
(1)统一编址
(2)独立编址
统一编址
又称“存储器映射方式”。
在这种编址方式下,I/O端口地址置于存储器空间中,和存储单元统一编址。
优点:
无需专门的I/O指令,对端口操作的指令类型多,从而简化了指令系统的设计。
缺点:
端口占用存储器的地址空间,使存储器容量更加紧张,同时端口指令的长度增加,执行时间较长,端口地址译码器较复杂。
独立编址
又称“I/O映射方式”。
将端口单独编址构成一个I/O空间,不占用存储器地址空间。
这就需要设置专门的输入(IN)、输出指令(OUT)对I/O端口进行操作。
端口所需的地址线较少,地址译码器较简单,采用专用的I/O指令,端口操作指令执行时间少,指令长度短。
输入输出指令类别少,一般只能进行传送操作。
8086系统采用的是I/O独立编址方式。
端口地址说明
8086使用A15~A0这16根地址线作为I/O端口地址线,可访问端口最多可达64K个8位端口或32K个16位端口。
和存储器的字单元一样,对于奇地址的16位端口的访问,要进行两次操作才能完成。
16位的I/O端口地址无需经过地址加法器产生,因而不使用段寄存器。
从地址总线上发出的端口地址仍为20位,只不过最高四位A19~A16为0。
第三章
指令的基本格式
操作码说明计算机要执行哪种操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分
操作数是指令执行的参与者,即各种操作的对象
每种指令的操作码:
用一个助记符表示(指令功能的英文缩写)
对应着机器指令的一个或多个二进制编码
指令中的操作数:
可以是一个具体的数值
可以是存放数据的寄存器
或指明数据在主存位置的存储器地址
寻址方式
寻找指令中所需的操作数或操作数地址的方式称为寻址方式
系统设计了多种操作数的来源
直接给出所使用的操作数本身
给出操作数所在的寄存器、存储器或I/O端口的地址
给出操作数所在的寄存器、存储器或I/O端口的地址的计算方法。
立即数寻址
指令中的操作数直接存放在机器代码中,紧跟在操作码之后
立即数可以是8位、16位或32位数值
立即数寻址方式只允许源操作数为立即数,目标操作数必须是寄存器或存储器
不需要访问存储器,执行速度快
Eg:
MOVAX,0102H;
AX←0102H
固定寻址
指令中的操作数是CPU中某个固定寄存器,该寄存器被隐含于操作码中。
寄存器寻址
操作数存放在CPU的内部寄存器reg中:
8位寄存器r8:
AH、AL、BH、BL、CH、CL、DH、DL
16位寄存器r16:
AX、BX、CX、DX、SI、DI、BP、SP
4个段寄存器seg:
CS、DS、SS、ES
无需访问存储器,执行速度快
源操作数和目的操作数可同时使用寄存器寻址
MOVAX,BX;
AX←BX
储存器寻址
操作数在主存储器中,用主存地址表示
程序设计时,8086采用逻辑地址表示主存地址
段地址在默认的或用段超越前缀指定的段寄存器中
指令中只需给出操作数的偏移地址
8086设计了多种存储器寻址方式
1、直接寻址方式
直接寻址方式的有效地址在指令中直接给出
默认的段地址在DS段寄存器,可使用段超越前缀改变
用中括号包含有效地址,表示取该存储单元的内容
MOVAX,[2000H];
AX←DS:
[2000H]
MOVAX,ES:
[2000H];
AX←ES:
2、寄存器间接寻址方式
有效地址存放在基址寄存器BX或变址寄存器SI、DI中,默认的段地址在DS段寄存器,可使用段超越前缀改变
MOVAX,[BX];
[BX]
如果指令中指定的寄存器是BP,则操作数在堆栈段SS中:
MOV[BP],AX
假设(SS)=1000H,
(BP)=3000H,
(AX)=1234H
物理地址=(SS)*16+(BP)
3、寄存器相对寻址方式
有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以是BX、BP或SI、DI
段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;
可用段超越前缀改变
MOVAX,06H[SI]或MOVAX,[SI]06H
4、基址变址寻址方式
有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:
段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;
5、相对基址变址寻址方式
有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和
6、串寻址
串寻址方式仅在8086的串指令中使用
根据设定的方向标志(DF),SI和DI会自动调整。
I/O(输入/输出)端口寻址
(1)直接端口寻址
为双字节指令,可寻址的端口数为0~255
可有字和字节两种使用方式
(2)寄存器间接端口寻址
为单字节指令
端口地址放在DX中,地址为0000H~FFFFH
8086指令系统
包括6大类133条基本指令
(1)数据传送类指令
通用数据传送指令MOVPUSHPOPXCHG
传送指令MOV(move)
格式:
MOVDST,SRC
操作:
DST←(SRC)
即把源操作数的内容送入目的操作数
说明:
可以进行8位或16位数据的传送
源操作数可为立即数、寄存器、存储器操作数
目的操作数可为寄存器、存储器操作数
MOV指令——立即数传送
以字母开头的常数要有前导0
MOV指令——通用寄存器传送
寄存器具有明确的字节和字类型
MOV指令——段寄存器传送
对段寄存器的操作不灵活
非法指令
(1)——两个操作数类型不一致
在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令
非法指令
(2)——无法确定是字节量还是字量操作
当无法通过任一个操作数确定操作类型时,需要利用汇编语言的操作符显式指明
非法指令(3)——两个操作数都是存储器
非法指令(4)——违反对段寄存器操作的限制
不允许在段寄存器之间直接传送数据
MOVDS,ES;
非法指令
不允许向段寄存器送立即数
MOVDS,100H;
不允许用CS或IP作为目的操作数
MOVCS,[SI];
非法指令(5)——立即数作为目的操作数
交换指令XCHG(exchange)
功能:
把两个地方的数据进行互换
XCHGOPR1,OPR2
(OPR1)↔(OPR2)
寄存器与寄存器之间对换数据
寄存器与存储器之间对换数据
不能在存储器与存储器之间对换数据
堆栈操作指令
堆栈是一个“后进先出LIFO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;
SS段寄存器记录其段地址
堆栈只有一个出入口,即当前栈顶;
用堆栈指针寄存器SP指定
堆栈只有两种基本操作:
进栈和出栈,对应两条指令PUSH和POP
进栈指令PUSH
将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减2。
PUSH←SRC
SP←(SP)-2
((SP)+1,(SP))←(SRC)
出栈指令POP
将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)或存储器,堆栈指针加2。
POPDST
DST←((SP)+1,(SP))
SP←(SP)+2
堆栈操作的特点
字操作
低地址字节送低字节,高地址字节送高字节
先进后出,但可存储器寻址方式随机存取其中数据
堆栈段常用来保存临时数据
累加器专用传送指令
INOUTXLAT
累加器是数据传输的核心
IN输入指令
格式1:
INAL,Port或INAX,Port
格式2:
INAL,DX或INAX,DX
AL/AX←(Port)从外设读入数据
AL/AX←(DX)以DX内容为端口地址读入
用Port指明端口地址时,地址范围为00H~0FFH
以DX间接给出端口地址时,最大地址为0FFFFH
OUT输出指令
OUTPort,AL或OUTPort,AX
OUTDX,AL或OUTDX,AX
(Port)←(AL)/(AX)传送数据到Port端口
(DX)←(AL)/(AX)传送数据到DX指出的端口
用Port指明端口地址时,地址范围为00H-0FFH
注意:
(1)只能使用累加器做为I/O指令的取数或送数的寄存器
(2)使用INAL/AX,DX格式时必须先将端口地址赋给DX寄存器
(3)运行I/O程序时,必须确定端口地址
查表转换指令XLAT
将BX指定的区域中、AL指定的位移处的一个字节数据取出赋给AL
XLATOPR或XLAT
AL←((BX)+(AL))
地址-目标传送指令LEALDSLES
有效地址传送指令LEA
将存储器操作数的有效地址送至指定的16位通用寄存器
LEADST,SRC
DST←SRC的EA
注意以下两条指令差别:
LEABX,BUFFER
MOVBX,BUFFER
前者表示将符号地址为BUFFER的存储单元的偏侈地址取到BX中;
后者表示将BUFFER存储单元中的内容取到BX中.
装载数据段指针指令LDS
LDSDST,SRC
DS←(SRC+2)
装载附加段指针指令LES
LESDST,SRC
ES←(SRC+2)
源操作数必须是存储器操作数
目的操作数必须是寄存器
标志传送指令LAHFSAHFPUSHFPOPF
读标志指令LAHF
LAHF把标志寄存器低8位中的5个标志位传送到AH中的指定位
设置标志指令SAHF
SAHF的功能与LAHF的功能正好相反
标志进栈指令PUSHF
PUSHF
SP←(SP)-2
((SP)+1,(SP))←(FLAGS)
标志出栈指令POPF
POPF
FLAGS←((SP)+1,(SP))
SP←(SP)+2
小结
1、数据传送指令不影响标志位,除SAHF和POPF这两条指令外
2、除XCHG指令外,都是从源到目的的单向传送
(2)算术运算类指令
算术运算类指令用来执行二进制的算术运算:
加减乘除。
这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果。
有单操作数指令,也有双操作数指令
加法指令ADDADCINCAAADAA
减法指令SUBSBBDECNEGAASDASCMP
乘法指令MULIMULAAM
除法指令DIVIDIVAADCBWCWD
ADD常规加指令
ADDDST,SRC
DST←(DST)+(SRC)
ADC带进位加指令
ADCDST,SRC
DST←(DST)+(SRC)+(CF)
该指令除了多一个进位标志外,同ADD指令常用于多字节运算
双字加法规则:
1.先加低16位,如有进位的话,进位存入CF
2.然后加高16位,必须用ADC,以便能加上进位位
INC增1指令
INCDST
DST←(DST)+1
说明:
DST可以是寄存器或存储器操作数
DST不允许是立即数
此指令不影响CF标志
组合十进制加法调整指令DAA—压缩BCD码调整
非组合十进制加法调整指令AAA—非压缩BCD码调整
1.在AL中进行
2.自动完成加6调整
3.一般用于二进制加法指令ADD之后
SUB常规减指令
SUBDST,SRC
DST←(DST)-(SRC)
SBB带借位减指令
SBBDST,SRC
DST←(DST)-(SRC)-(CF)
该指令除了多一个进位/借位标志外,同SUB常用于多字节运算
DEC减1指令
DECDST
DST←(DST)-1
用法同INC指令
NEG求补指令
NEGDST
DST←-(DST)
说明-(DST)表示操作数按位求反后末位加1执行时,用零减去操作数
CMP比较指令
格式:
CMPDST,SRC
(DST)-(SRC)
1、两个操作数相减,但结果不回送
2、影响标志位的值,下一指令常是条件转移指令
3、必须区分无符号数比较与有符号数比较
MUL无符号数乘指令
MULSRC
字节乘,AX←(AL)*(SRC)byte
字乘,DX:
AX←(AX)*(SRC)word
约定一个乘数在累加器中
对标志位影响:
若乘积的高半部分(字节相乘时为AH,字相乘时为DX)不为零,则CF=1,OF=1;
否则CF=0,OF=0。
其它标志位为任意值
IMUL符号数乘指令
IMULSRC
字节数乘,AX←(AL)*(SRC)byte
字数据乘,DX:
AAM非压缩BCD码乘调整指令
AAM
将AX中的两个非压缩BCD码之积进行调整
调整过程:
将AL除以10,商送AH,余数送AL
8086指令系统没有提供对组合BCD码乘法的调整指令
DIV无符号数除指令
DIVSRC
AL(商),AH(余数)←(AX)/(SRC)byte
AX(商),DX(余数)←(DX:
AX)/(SRC)word
IDIV带符号数除指令
IDIVSRC
3.AAD非压缩BCD码除调整指令
AAD
在除法运算前,用该指令将AX中的非压缩BCD码形式的被除数调整为二进制数,然后做除法运算
(AL)+(AH)*10→AL
0→AH
(AX)/除数,商→AL,余数→AH
CBW符号扩展指令-字节扩展成字
CBW
扩展AL中的符号至AH中,将8位数扩展成等效的16位数
CWD符号扩展指令-字扩展成双字
CWD
扩展AX中的符号至DX中,将16位数扩展成等效的32位数
用于在有符号数除法之前,形成双倍长度的被除数
1、包括二进制运算及十进制运算调整指令
2、指令操作结果影响标志位
3、注意有符号数与无符号数的区别
4、乘、除法指令是单操作数指令,AX/DX
5、SUB与CMP指令异同
6、INC/DEC多用于修改地址指针和循环计数器
7、十进制运算调整指令分为压缩的和非压缩的二种,仅限于字节
(3)逻辑运算与移位类指令
以二进制位为基本单位进行数据的操作
当需要对字节或字数据中的各个二进制位操作时,可以考虑采用位操作类指令
注意这些指令对标志位的影响
1.逻辑运算指令
ANDORXORNOTTEST
NOT逻辑非指令
NOTOPR
OPR按位取反后送回原处
AND逻辑与指令
ANDDST,SRC
(DST)←(DST)&
(SRC)
OR逻辑或指令
ORDST,SRC
(DST)←(DST)|(SRC)
XOR异或指令
XORDST,SRC
(DST)←(DST)与(SRC)按位异或
TEST测试指令
TESTOPR1,OPR2
(OPR1)&
(OPR2)
不送回操作结果,仅影响标志位
逻辑运算指令对标志位的影响:
无进/借位,NOT指令不影响标志位
移位指令
将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作
第一操作数是指定的被移位的操作数,可以是寄存器或存储单元;
第二操作数表示移位位数
该操作数为1,表示移动一位
该操作数为CL,CL寄存器值表示移位位数(移位位数大于1只能CL表示)
影响标志位
2.移位指令
SHLSHRSALSAR
SALreg/mem,1/CL
;
reg/mem左移1或CL位
最低位补0,最高位进入CF
SARreg/mem,1/CL
reg/mem右移1/CL位
最高位不变,最低位进入CF
SHLreg/mem,1/CL
;
与SAL是同一条指令
SHRreg/mem,1/CL
最高位补0,最低位进入CF
逻辑移位指令用于无符号数的移位
算术移位指令用于带符号数的移位
移位类指令的特点
对寄存器或存储单元中8位或16位数的移位
影响C,P,S,Z,O标志。
结果未溢出时:
左移1位≡操作数*2
右移1位≡操作数/2
带符号数左移会出现溢出情况
最高位≠CFOF=1溢出
最高位=CFOF=0没有溢出
3.循环移位指令
ROLRORRCLRCR
循环移位指令类似移位指令,但要将从一端移出的位返回到另一端形成循环。
分为:
ROLreg/mem,1/CL;
不带进位循环左移
RORreg/mem,1/CL;
不带进位循环右移
RCLreg/mem,1/CL;
带进位循环左移
RCRreg/mem,1/CL;
带进位循环右移
循环移位指令的操作数形式与移位指令相同,
影响进位标志CF,但不影响SF、ZF、PF、AF标志
循环移位指令的主要用途:
检测寄存器或存储单元中含1或含0的个数
与移位指令联合使用,实现多倍精度的左移和右移
(4)串操作类指令
(5)控制转移类指令
1.无条件转移指令JMP
段内直接转移JMPDISP
指令中以符号数的形式直接直接给出一个相对于IP的位移量:
位移量转移范围汇编语言中格式
8位-128~+127JMPSHORTOPRD
16位