微机原理教案准备.docx
- 文档编号:30746472
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:135
- 大小:593.32KB
微机原理教案准备.docx
《微机原理教案准备.docx》由会员分享,可在线阅读,更多相关《微机原理教案准备.docx(135页珍藏版)》请在冰豆网上搜索。
微机原理教案准备
3.1指令系统概述
指令系统是微处理器所能执行的各种指令的集合,定义了一个微处理器所能完成的基本操作。
不同的微处理器具有不同的指令系统,本章以Intel公司的8086为例来介绍微处理器的指令系统。
采用8086CPU的指令系统作为范例的原因有以下几点:
(1)应用的广泛性。
几乎所有的微机系统使用的都是x86系列的CPU(主要生产厂家有Intel公司和AMD公司)。
(2)指令的兼容性。
8086的指令系统是所有x86系列CPU的指令系统的基础,编写的程序可以直接在80286、80386乃至Pentium、Core2Duo上执行。
(3)资料的丰富性。
x86系列CPU普及程度极广,其相关技术资料很容易找到,给应用开发带来很大方便。
(4)与课程内容配合。
【几个概念】
指令——控制CPU完成指定操作的命令。
机器指令——指令的二进制代码形式。
例如:
1100110100100001(或表示成十六进制形式为:
CD21H)。
汇编指令——助记符形式的指令。
例如:
INT21H。
指令系统——CPU的所有指令及其使用规则的集合。
8086指令按功能分为六大类(92种),下表列出了最常用的一些指令。
8086CPU常用指令一览表
指令类型
助记符
数
据
传
送
一般数据传送
MOV,PUSH,POP,XCHG,XLAT
输入输出指令
IN,OUT
地址传送指令
LEA,LDS,LES
标志传送指令
PUSHF,POPF
算
术
运
算
加法指令
ADD,ADC,INC
减法指令
SUB,SBB,DEC,CMP
乘、除法指令
MUL,DIV
十进制调整指令
DAA,AAA,DAS,AAS,AAM,AAD
逻辑运算和移位
AND,OR,NOT,XOR,TEST
SHL,SAL,SHR,SAR,ROL,ROR,RCL,RCR
串操作
MOVS,CMPS,SCAS,LODS,STOS
控制转移
JMP,条件转移指令(Jxx),LOOP/LOOPE/LOOPNE
INT/IRET,CALL/RET
处理器控制
CLC,STC,CLD,STD,HLT
3.1.1指令的基本组成
指令分为操作码(也称为指令码)和操作数两个部分,操作码表示这条指令所要进行的是什么样的操作,操作数指示所要操作的对象。
大多数8086指令的长度在1~4个字节之间,其长度与操作码和指令中操作数的多少以及操作数的类型有关。
操作数越多,指令就越长。
8086指令系统规定,一条指令的操作数最多只能有两个。
1.指令格式
8086CPU的指令格式如下:
操作码[目的操作数][,源操作数]
其中:
操作码用便于记忆的助记符来表示(一般是英文单词的缩写)。
操作数可以是双操作数(源操作数和目的操作数),也可以是单操作数,有的指令甚至可以不给出操作数(隐含操作数)。
【例1】
双操作数的指令:
MOVAX,BX;MOV是操作码,AX是目的操作数,BX是源操作数
单操作数的指令:
CALLproc1;CALL是操作码,proc1是目的操作数
无操作数的指令:
STC;STC是操作码
2.操作数类型
8086指令系统中的操作数主要分为三类:
立即数操作数、寄存器操作数和存储器操作数。
1)立即数操作数
所谓立即数是指具有固定数值的操作数,即常数。
它可以是字节(8位)或字(16位),当它们分别代表无符号数和带符号数时,其各自的取值范围如下表所示。
立即数操作数的取值范围
8位数
16位数
无符号数
00H-0FFH(0~255)
0000H-0FFFFH(0~65535)
有符号数
80H-7FH(-128~+127)
8000H-7FFFH(-32768~+32767)
立即数的取值超出了规定的范围,就会发生错误。
在指令中,立即数操作数只能用作源操作数,而不能用作目的操作数。
【例2】
MOVAX,1200H;正确,立即数可以用做源操作数
MOV1200H,AX;错误,立即数不能用做目的操作数
2)寄存器操作数
寄存器操作数存放在8086CPU的8个通用寄存器或段寄存器中,既可以作为源操作数,也可以用作目的操作数。
通用寄存器中的AX、BX、CX、DX既可以作为四个16位寄存器,用来存放字操作数,也可以当作八个8位寄存器(AH、AL、BH、BL、CH、CL、DH、DL),用来存放字节操作数。
SI、DI、BP、SP只能存放字操作数。
段寄存器用来存放当前操作数的段基地址。
在与通用寄存器或存储器传送数据时,段寄存器可作为源操作数或目的操作数。
注意:
1.不允许用一条指令把立即数传送到段寄存器。
如果需要这样做,可用某个通用寄存器作为中间桥梁,用两条传送指令实现。
2.不允许用传送指令把某个值传送给CS。
3.仅有个别指令将标志寄存器FLAGS作为操作数。
【例3】
MOVDS,1200H;错误,不允许把立即数传送到段寄存器
改为:
MOVAX,1200H;正确,使用AX作为中介把立即数1200H送到DS寄存器
MOVDS,AX
【例4】
MOVCS,AX;错误,不允许用显式指令把值传送给CS寄存器
MOVFLAGS,AX;错误,不允许用数据传送指令给标志寄存器赋值
POPF;正确,可以把堆栈栈顶的内容弹出到标志寄存器
3)存储器操作数
存储器操作数可以是字节(8位)、字(16位)或双字(32位),分别要占据一个、两个或四个存储单元。
存储器操作数在指令中既可作为源操作数,也可作为目标操作数。
但对大多数指令,不允许源操作数和目标操作数同时为存储器操作数。
若确实要对两个存储器操作数进行操作,可以使用任一通用寄存器作为中间桥梁来实现。
在汇编语言中,存储器单元是用逻辑地址来制定的,而逻辑地址是由段基地址和偏移地址两部分构成。
所以,要访问存储器操作数必须首先确定操作数所在的段基地址。
如上所说,段基地址是放在段寄存器中的,所以,访问存储器操作数前,应先确定对应的段寄存器是否已经初始化为所需要的段基地址。
那么,访问存储器操作数要使用四个段寄存器中的哪一个呢?
8086CPU规定,若指令中没有指明使用哪一个段寄存器的内容作为段基地址来访问存储器操作数,则根据操作数的特征来确定所使用的默认段寄存器。
各种存储器操作所约定的默认段寄存器、段超越(即显式地指明段寄存器)所允许的段寄存器、以及相应的偏移地址来源见下表。
段寄存器使用的一些基本约定
存储器操作类型
默认的段寄存器
允许超越的段寄存器
段内偏移地址来源
取指令
CS
无
IP
堆栈操作
SS
无
SP
通用数据传送
DS
CS,ES,SS
按寻址方式取得
串操作源串地址
DS
CS,ES,SS
SI
串操作目的串地址
ES
无
DI
BP作为基址寄存器
SS
CS,DS,ES
按寻址方式取得
【例5】
MOVAL,[2A00H];通用数据传送,用DS的内容作为段基地址,偏移地址为2A00H
PUSHAX;堆栈操作,用SS的内容作为段基地址,偏移地址在SP中
LODSW;串操作,用DS的内容作为源串地址的段基地址,偏移地址在SI中
ADDAL,[BP+DI];BP作为基址寄存器,用SS的内容作为段基地址,偏移地址为BP和DI之和
3.1.2指令的执行时间
了解指令的执行时间,对编写时间敏感的程序是很重要的。
例如:
在用软件产生定时或延时时或工业控制领域中对某些实时性要求较严的诚和,都需要估算出一段程序的运行时间。
一条指令的执行时间以时钟周期数为单位。
不同指令的执行时间有较大的差别,这里列出了部分常用指令的执行时间及其访问存储器的次数。
常用指令执行时间
指令
所需时钟周期数
访问内存次数
MOV
累加器到内存
内存到累加器
寄存器到寄存器
内存到寄存器
寄存器到内存
10(14)
10(14)
2
8(12)+EA
9(13)+EA
1
1
0
1
1
MOV
立即数到寄存器
立即数到内存
寄存器到段寄存器
内存到段寄存器
段寄存器到寄存器
段寄存器到内存
4
10(14)+EA
2
8(12)+EA
2
9(13)+EA
0
1
0
1
0
1
ADD
或
SUB
寄存器到寄存器
内存到寄存器
寄存器到内存
立即数到寄存器
立即数到内存
3
9(13)+EA
16(24)+EA
4
17(25)+EA
0
1
2
0
2
MUL
累加器乘8位寄存器
累加器乘16位寄存器
累加器和内存字节乘
累加器和内存字乘
70~77
118~133
(76~83)+EA
[124(128)~139(143)]+EA
0
0
1
1
IMUL
累加器乘8位寄存器
累加器乘16位寄存器
累加器和内存字节乘
累加器和内存字乘
80~98
128~154
(86~104)+EA
[134(138)~160(164)]+EA
0
0
1
1
DIV
除数在8位寄存器中
除数在16位寄存器中
除数为8位内存数
除数为16位内存数
80~90
144~162
(86~96)+EA
[150(154)~168(172)]+EA
0
0
1
1
IDIV
除数在8位寄存器中
除数在16位寄存器中
除数为8位内存数
除数为16位内存数
101~112
165~184
(107~118)+EA
[171(175)~190(194)]+EA
0
0
1
1
循环和移位
在寄存器中移1位
在寄存器中移若干位
内存数据移1位
内存数据移若干位
2
8+4*位数
15(23)+EA
20(28)+EA+4*位数
JMP
段内/段间直接转移
段内间接转移
段间间接转移
15
8(12)+EA
24(32)+EA
条件
转移
JCXZ
6(不转移)
18(转移)
其它条件转移指令Jxx
4(不转移)
16(转移)
注:
(1)表中EA表示偏移地址。
小括号内的数为8088进行字操作的时钟数。
因为8088的数据线只有8位,每个总线周期只能传送一个字节,所以对字操作要再加上4个时钟周期。
(2)对条件转移指令,若条件满足,执行的时间比较长。
因为要产生转移,就要包括取下一条指令所需的时间。
若条件不满足,执行时间就较短。
因为此时不产生转移,而是执行下一条指令。
存取操作数的时间与采用的寻址方式有关。
寄存器寻址执行的时间最短,而对存储器操作数则还需考虑计算偏移地址所花的时间。
这里列出了不同寻址方式下,计算偏移地址所需要的时间。
计算偏移地址EA所需时间
寻址方式
计算EA所需时钟数
直接寻址
6
寄存器间接寻址
5
寄存器相对寻址
9
基址、变址寻址
[BX+SI],[BX+DI]
7
[BP+SI],[BP+DI]
8
基址、变址加相对寻址
[BX+SI+位移量],[BP+DI+位移量]
11
[BX+DI+位移量],[BP+SI+位移量]
12
注:
若有段超越,则需再加上两个时钟周期。
可以看出,对同一种指令,如果寻址方式不同,其指令执行时间可能相差很大。
寄存器操作数的指令执行速度最快,立即数操作数次之,存储器操作数指令的执行速度最慢。
这是由于寄存器位于CPU的内部,执行寄存器操作数指令时,8086的执行单元(EU)可以直接从CPU内部寄存器中取得操作数,不需要访问内存,因此执行速度很快。
立即数操作数作为指令的一部分,在取指时已经被8086总线接口单元(BIU)取出后存放在指令队列中,执行指令时也不需要访问内存,因而执行速度也比较快。
而存储器操作数先要由总线接口单元计算出其所在单元的20位物理地址,然后再执行存储器的读写操作。
所以相对前述两种操作数来说,指令的执行速度最慢。
【例】当通用数据传送指令(MOV)的操作数分别为:
寄存器、立即数和存储器时,分别计算指令的执行时间,已知CPU的时钟频率为5MHz。
CPU的时钟频率为5MHz,即一个时钟周期为0.2μs。
则
从寄存器到寄存器之间的传送指令的执行时间为:
t=2×0.2=0.4μs
立即数传送到寄存器的指令执行时间为:
t=4×0.2=0.8μs
而存储器到寄存器的字节传送,设存储器采用基址、变址寻址方式,则指令执行时间为:
t=(8+EA)×0.2=(8+8)×0.2=3.2μs
从上例可以看出,不同类型的寻址方式或不同类型的操作数可以导致指令执行时间相差一个数量级,因此,我们在编写程序时:
1)尽量使用寄存器作为操作数;
2)尽量使用简单的寻址方式。
3.28086的寻址方式
寻址方式,主要是指获得操作数所在的地址的方法。
在8086系统中,一般将寻址方式分为两大类,一类是寻找操作数的地址,另一类是寻找要执行的下一条指令的地址,即程序的地址。
后者主要在程序转移或过程调用时用来寻找目的地址或入口地址,这将在调用指令(CALL)和程序转移指令(JMP)中介绍。
本节我们主要讨论针对操作数地址的寻址方式。
在8086指令系统中,基本的寻址方式有7种,另外通常也把隐含寻址也当作是一种不同的寻址方式:
①立即寻址
②直接寻址
③寄存器寻址
④寄存器间接寻址
⑤寄存器相对寻址
⑥基址变址寻址
⑦基址变址相对寻址
⑧隐含寻址
8086寻址方式一览表
寻址方式名称
源操作数的例子
源操作数的允许形式
立即操作数
立即寻址
MOVAX,1200H
指令中的常数
寄存器操作数
寄存器寻址
MOVAX,BX
通用寄存器或段寄存器
存储器操作数
直接寻址
MOVAX,[1200H]
“[常数]”或“[变量]”或“变量”
寄存器间接寻址
MOVAX,[DI]
[BX、BP、SI、DI之一]
寄存器相对寻址
MOVAX,[BX+1200H]
[BX、BP、SI、DI之一+位移量]
基址变址寻址
MOVAX,[BX+DI]
[BX或BP+SI或DI]
基址变址相对寻址
MOVAX,[BX+DI+1200H]
[BX或BP+SI或DI+位移量]
3.2.1立即寻址(ImmediateAddressing)
要点:
▪操作数直接在指令中给出
▪只适用于源操作数
立即寻址方式中,操作数是一个常数(也称为立即数)。
操作数作为指令的一部分,紧跟在指令的操作码之后(见例2图(a)),存放于内存的代码段中。
并在CPU取指令时随指令码一起取出。
立即数可以是8位或16位的整数。
注意:
立即寻址方式只适用于源操作数。
【例1】
MOVAX,1C8FH;正确,把16位二进制数1C8FH送到AX寄存器中
ADDBYTEPTR[2A00H],8FH;正确,把8位二进制数8FH累加到2A00H内存单元中
MOV2A00H,AX;错误,立即数不能作为目的操作数
【例2】
指令“MOVAX,3102H”将16位的立即数3102H送入累加器AX。
指令执行后,AH=31H,AL=02H。
这是一条三字节指令,指令在存储器中的存放形式及其执行情况如下图(b)所示。
3.2.2直接寻址(DirectAddressing)
要点:
▪指令中直接给出操作数的偏移地址(形式上为一个16位二进制数)
直接寻址指令是在指令的操作码后面中直接给出操作数的16位偏移地址,偏移地址也称为有效地址(EA,EffectiveAddress),该地址与指令的操作码一起存放在内存的代码段,按低8位-高8位的顺序存放,取指令时与指令操作码一起被送入CPU。
直接寻址指令中,默认使用DS寄存器作为操作数的段基址寄存器。
当然也可以显式地指定使用其他段寄存器——称为段超越前缀,如下例中第二条指令中的“ES:
”。
【例1】
MOVAX,[2A00H];将内存中从DS:
2A00H开始的连续两个字节的内容传送到AX寄存器
MOVDX,ES:
[8000H];将内存中从ES:
8000H开始的连续两个字节的内容传送到AX寄存器
MOVSI,BUFFER;将内存中从DS:
BUFFER开始的连续两个字节的内容传送到SI寄存器
上述第三条指令中的BUFFER这种形式的地址称为符号地址——用符号来表示一个具体的偏移地址。
注意:
请仔细区别直接寻址指令与立即寻址指令二者的不同。
直接寻址指令中的数值是操作数的16位偏移地址,而不是操作数本身。
为了区分二者,指令系统规定偏移地址是一个数字时要加上方括号(符号地址可省略方括号)。
【例2】指令“MOVAX,[3102H]”将数据段中偏移地址为3102H和3103H两个单元中的内容送到AX。
如果(DS)=2000H,则所访问的操作数的物理地址为:
20000H+3102H=23102H
指令执行后:
AX=1122H。
指令的执行情况如下图所示。
另外,若操作数不是存放在DS段,则在指令中要使用段超越前缀加以声明。
【例3】指令“MOVBX,ES:
[1200H]”用ES寄存器中的内容作为段基地址,将偏移地址为1200H和1201H两单元的内容送到BX寄存器中。
3.2.3寄存器寻址(RegisterAddressing)
要点:
▪操作数放在某个寄存器中
寄存器寻址方式中,操作数放在CPU的某个寄存器中,它可以是通用寄存器(8位或16位),也可以是基址寄存器(BX,BP)、变址寄存器(SI,DI)或段寄存器。
注意:
寄存器寻址指令在取操作数时不需要访问存储器,因此与段地址无关,故指令中不可以使用段超越前缀。
【例1】
MOVAX,BX;将BX寄存器的内容传送到AX寄存器
MOV[3F00H],AX;将AX寄存器的内容传送到从DS:
3F00H开始的连续两个内存单元
MOVCL,AL;将AL寄存器的内容传送到CL寄存器
MOVAX,BL;错误,源操作数和目的操作数的字长不同
MOVES:
AX,DX;错误,寄存器寻址不能使用段超越前缀
【例2】
指令“MOVSI,AX”将AX的内容送到寄存器SI中。
若指令执行前AX=2233H,SI=4455H,则指令执行后SI=2233H,而AX中的内容保持不变,仍为2233H。
采用寄存器寻址时,操作数在CPU的寄存器中,指令在执行时不必通过访问内存就可取得操作数,故执行速度较快。
3.2.4寄存器间接寻址(RegisterIndirectAddressing)
要点:
▪操作数的偏移地址放在寄存器中
▪只有SI、DI、BX和BP可作间址寄存器
寄存器间接寻址与寄存器寻址方式不同,指令中指定的寄存器的内容不是操作数,而是操作数的偏移地址。
也就是说操作数的偏移地址放在寄存器中,操作数本身则在存储器中。
用来做间接寻址的寄存器有时也称为指针寄存器,或简称指针(试比较C语言中的指针)。
寄存器间接寻址方式可用的寄存器只允许是SI、DI、BX和BP,统称为间址寄存器。
选择不同的间址寄存器,涉及的段寄存器将有所不同。
在默认情况下,用SI、DI、BX作间址寄存器时,操作数在数据段,段基地址由DS决定;用BP作间址寄存器,则操作数在堆栈段,段基地址由SS决定。
但无论选择哪一个间址寄存器,都允许段超越,即可在指令中用段超越前缀指明当前操作数在哪一个段。
注意:
因为间址寄存器中放的是操作数地址,所以用作间址的寄存器必须加上方括弧,以避免与寄存器寻址混淆。
【例1】
MOVAX,[BX];以BX的内容为偏移地址,DS的内容为段地址,取出一个字到AX寄存器
MOVSI,[BP];以BP的内容为偏移地址,SS的内容为段地址,取出一个字到SI寄存器
MOVCL,CS:
[DI];使用段超越前缀,所要访问的数据在代码段中
MOVAX,[DX];错误,DX不能用作间址寄存器
MOVCL,[AX];错误,AX不能用作间址寄存器
【例2】指令“MOVAX,[SI]”的寻址过程示例。
已知DS=6000H,SI=1200H,(61200H)=44H,(61201H)=33H,则指令执行后,AX=3344H。
指令的执行情况如下图所示。
因为指令中没有指定段超越,所以寻址时使用默认的段寄存器DS。
若操作数所在段的段地址在ES中,则本例中的指令应写成:
MOVAX,ES:
[SI]。
3.2.5相对的寄存器间接寻址(RelativeRegisterIndirectAddressing)
要点:
▪操作数的偏移地址=间址寄存器的内容加上8/16位的位移量
▪只有SI、DI、BX和BP可作间址寄存器
相对的寄存器间接寻址简称为寄存器相对寻址,在这种寻址方式中,操作数存放在存储器中,而其偏移地址等于指令中给出的间址寄存器的内容与给出的8/16位的位移量之和。
操作数的段由哪个段寄存器指定,仍由所使用的间址寄存器决定。
位移量也可看作相对值,故把这种带位移量的寄存器间接寻址方式称为寄存器相对寻址。
有时,寻址方式中的基本偏移量也称为基地址。
至于位移量和基地址哪个放在间址寄存器中,哪个作为位移量可任意,因为最终总是由二者相加得到偏移地址。
点击观看相对寄存器寻址的动画演示。
【例1】
MOVAX,[BX+8];操作数的偏移地址为BX的内容加上8,段地址在DS中
MOVCX,TABLE[SI];TABLE是用符号表示的基地址,位移量在SI中
MOVAX,[BP+1000H];操作数的偏移地址为BP的内容加上1000H,段地址在SS中
注意:
以上指令中的地址表达式有两种不同的写法,它们都是正确的。
【例2】指令MOVAX,BUFF[BX]的操作。
假定DS=6000H,BX=1000H,BUFF=2A00H,(63A00H)=66H,(63A01H)=55H。
物理地址=60000H+1000H+2A00H=63A00H
指令执行后:
AX=5566H
寄存器相对寻址常用于存取表格或一维数组中的元素——把表格的起始地址作为基地址,用元素的下标计算出位移量,即可存取表格中的任意一个元素。
位移量的计算方法是:
位移量=下标×每个元素的字节数
注:
经常也会把表格的起始地址作为位移量,把元素的下标计算出来的值作为基地址。
【例3】某数据表的首地址(偏移地址)为TABLE,要取出该表中的第10个元素(均为8位二进制数)传送到AL寄存器中,可用如下指令段实现
MOVSI,9;第10个数的下标为9(位移量是从0开始的)
MOVAL,TABLE[SI];第10个数的偏移地址为TABLE+9
如果该表中的每个元素占用两个字节(16位),则上述指令段应改为
MOVSI,9;第10个数的下标为9
ADDSI,SI;每个元素占两个字节,所以用元素的下标乘2得到位移量(18)
MOVAL,TABLE[SI];第10个数的偏
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 教案 准备