微机控制课件 4.docx
《微机控制课件 4.docx》由会员分享,可在线阅读,更多相关《微机控制课件 4.docx(27页珍藏版)》请在冰豆网上搜索。
![微机控制课件 4.docx](https://file1.bdocx.com/fileroot1/2023-1/10/8227e756-a95e-477c-b1da-f480427c616c/8227e756-a95e-477c-b1da-f480427c616c1.gif)
微机控制课件4
2011-10-27
第二章微机原理及其工艺过程控制应用
第1节86系列微处理器结构
第2节86系列微型计算机的指令系统
指令是让计算机完成某种操作的命令,指令的集合称作指令系统,
2.186系列汇编语言指令语句格式
86系列汇编语言指令语句格式如图2—7所示。
图中由前向后的箭头表示是可选项,由后向前的箭头表示是重复项,回头方框表示是语句中的关键字。
图2-786系列汇编语言指令语句格式
例如:
AA:
MOVAX,BX;将寄存器BX内容送到寄存器AX之中
标号助记符操作数注释
图2-886系列的操作数寻址方式
[例2.1]设BX=0158H,DI=10A5H,位移量=1B57H,DS=2100H,假定没有使用段前缀,即把DS作为操作数对应的段寄存器。
在各种寻址方式下,这些寄存器和位移量所产生的有效地址和物理地址为:
(1)直接寻址:
有效地址=1B57H
物理地址=21000H十1B57H=22B57H
(2)寄存器间接寻址(寄存器为BX):
有效地址=0158H
物理地址=21000H十0158H=21158H
(3)BX寄存器相对间接寻址:
有效地址=0158H十1B57H=1CAFH
物理地址=21000H十1CAFH=22CAFH
(4)变址寻址(寄存器为DI):
有效地址=l0A5H
物理地址=21000H十10A5H=220A5H
(5)DI寄存器相对变址寻址:
有效地址=10A5H十lB57H=2BFCH
物理地址=21000H十2BFCH=23BFCH
(6)基址加变址的寻址(BX为基址寄存器,DI为变址寄存器):
有效地址=0158H十10A5H=11FDH
物理地址=21000H十llFDH=221FDH
(7)相对的基址加变址的寻址(BX为基址寄存器,DI为变址寄存器)
有效地址=0158H十l0A5H十1B57H=2D54H
物理地址=21000H十2D54H=23D54H
****************************************************************************
指令系统:
传送类指令、
算术运算类指令、
逻辑运算和移位指令、
串操作指令、
控制指令
2.3传送类指令
传送类指令是指令系统中最活跃的一类指令,也是条数最多的一类指令,主要用于数据的保存及交换等场合。
此处我们把这类指令分为4种,并把各种指令操作码助记符和对应的操作数列表所示。
表2-3传送类指令
指令
类型
指令
格式
指令
功能
状态标志位
备注
OSZAPC
通用
数据
传送
MOV目标,源
PUSH源
POP目标
XCHG目标,源
XLAT
传送字节或字
字压入堆栈
字弹出堆栈
交换字节或字
字节翻译
------
------
------
······
------
源:
寄存器、存储器、立即数
目标:
寄存器、存储器
源:
寄存器、存储器
目标:
寄存器(CS除外)、存储器
源:
通用寄存器、存储器
目标:
通用寄存器、存储器
目标
地址
传送
LEA目标,源
LDS目标,源
LES目标,源
装入有效地址
装入数据段指针到DS
装入附加段指针到ES
------
------
------
源:
内存操作数
目标:
16位通用寄存器
标志
位传
送
LAHF
SAHF
PUSHF
POPF
把FR低字节装入AH
把AH内容装入FR低字节
把FR内容压入堆栈
从堆栈弹出FR内容
------
-·····
------
······
I/O
数据
传送
IN累加器,端口
OUT端口,累加器
输入字节或字
输出字节或字
------
------
累加器:
AL或AX
端口:
地址0~255或间址寄存器DX
说明:
·运算结果影响标志位,-运算结果不影响标志位。
1.传送类指令
(1)通用数据传送指令
通用传送指令中包括最基本的传送指令MOV,堆栈指令PUSH和POP,数据交换指令XCHG。
MOV指令是形式最简单、用的最多的指令。
它可以实现CPU内部寄存器之间的数据传送、寄存器和内存之间的数据传送,还可以把一个立即数送给CPU的内部寄存器或者内存单元。
例如:
MOVAL,BL;BL中的8位数据送AL
MOVES,DX;DX中16位数据送ES
MOVAX,[BX];BX和BX十1所指的两个内存单元的内容送AX
MOV[DI],AX;累加器的内容送DI和Dl十1所指的两个单元
MOVCX,[1000];将1000和1001两单元的内容送CX
MOVBL,40;立即数40送BL
MOVDX,5040;立即数5040送DX
MOVWORDPTR[SI],6070;立即数6070送到SI和SI十1所指的两个单元
;这里的PTR是一个汇编操作符,与前面的WORD
;一起,标明往SI地址中写一个字,而不是一个节
*********************************************
(2)堆栈操作指令
在子程序调用和中断处理过程时,分别要保存返回地址和断点地址,在进入子程序和中断处理后,还需要保留通用寄存器的值;
子程序返回和中断处理返回时,则要恢复通用寄存器的值,并分别将返回的地址或断点地址恢复到指令指针寄存器中。
这些操作都要通过堆栈来操作,其中寄存器的保存和恢复需要有堆栈指令来完成。
8086/8088的堆栈操作遵循“先进后出”原则。
例:
保存和恢复DS,ES内容的指令如下
PUSHDS
PUSHES
┇
POPES
POPDS
与上比较:
PUSHDS
PUSHES
┇
POPDS
POPES
结果有何不同?
*********************************************
(3)交换指令
交换指令XCHG可以实现字节交换,也可以实现字交换。
交换过程可以在CPU的内部寄存器之间进行,也可以在内部寄存器和存储单元之间进行,但不能在两个存储之间执行数据交换过程。
例如:
XCHGAL,BL;AL和BL之间进行字节交换
XCHGBX,CX;BX和CX之间进行字节交换
XCHG[2503],CX;CX中的内容和2530,2531两单元的内容交换
*******************************************
(4)换码指令
XLAT是一条完成字节翻译功能的指令,称为换码指令。
它可以使累加器中的一个值变换为内存表格中的某一个值,一般用来实现编码制的转换。
使用换码指令时,要求BX寄存器指向表的首地址,AL中为表中某一项与表格首地址之间的偏移量,指令执行时,会将BX和AL中的值相加,把得到的值作为地址,然后将此地址所对应的单元中的值取到AL中去。
XLAT指令是通过查表方式来完成翻译功能的,因此,在执行该指令之前,必须建立好一张翻译表,该表的最大容量为256字节。
例如,将十进制数字(0—9)翻译成7段显示码的译码表顺序存放在内存中,假设这段数据存放的偏移地址首址为2000H,取出“6”所对应的7段码,该过程可用如下几条程序实现:
MOVBX,2000H
MOVAL,3
XLAT
*********************************************
2.目标地址传送指令
这是一类专用于传送地址码的指令,可用来传送操作数的段地址或偏移地址,共包含以下3条指令:
(1)取有效地址指令
取有效地址指令LEA的功能是将存储器地址送到一个寄存器。
LEA指令要求源操作数必须为内存单元地址,目的操作数必须为一个16位的通用寄存器。
这条指令常用来使一个寄存器作为地址指针。
例如:
LEAAX,[2728];将2728单元的偏移量送AX,指令执行后,AX中为2728
LEABX,[BP+SI];指令执行后,BX中的内容为BP+SI的值
LEASP,[0482];使堆栈指针SP为482
**********************************************
(2)将地址指针装到DS和另一个寄存器的指令
LDS指令的功能是把4个字节的地址指针(其中包括一个段地址和一个偏移量)传送到两个目的寄存器,其中,地址指针的后两个字节即段地址一定送到DS中。
比如,设2l30H一2133H这4个单元中存放着一个地址,2130H和2131H中为地址的偏移量,2132H和2133H中为地址的段值,执行指令:
LDSDI,[2130H]
该指令功能是:
2130H和2131H中的偏移量送到DI,2132H和2133H中的段值送到DS。
****************************************88
(3)将地址指针装到ES和另一个寄存器的指令
LES指令与LDS指令的操作基本相同,所不同仅在于将源操作数所指向地址指针中的段基址(后两个字节)传送到ES段寄存器,而不是DS段寄存器。
3.标志位传送指令
可完成标志位传送的指令共有4条:
(1)读取标志指令
读取标志指令LAHF被执行时,将标志寄存器中的低8位传送到AH中,如图2-9所示。
图2-9LAHF指令的功能
(2)设置标志指令
设置标志指令SAHF被执行时,将AH寄存器的相应位传送到标志寄存器的低8位。
用图表示,就是将图2-9的5个箭头方向反过来。
(3)对标志寄存器的压入堆栈指令和弹出堆栈指令
PUSHF指令将标志寄存器的值压入堆栈顶部,同时,堆栈指针SP的值减2。
此指令在执行时标志寄存器的值不变。
POPF指令的功能正好相反,此指令在执行时从堆栈中弹出一个字送到标志寄存器中,同时堆栈指针SP的值加2。
PUSHF和POPF指令一般用在子程序和中断处理程序的首尾,起保存主程序标志和恢复主程序标志的作用。
4.输入/输出数据传送指令
输入/输出指令用来完成累加器(AX/AL)与I/O端口之间的数据传送功能。
执行输入指令时,CPU可以从一个8位端口读入一个字节到AL中,也可以从两个连续的8位端口读一个字到AX中。
执行输出指令时,CPU可以将AL中的—个字节写到一个8位端口中,或者将AX中的一个字写到两个连续的8位端口中。
例如:
INAL,50H;将50H端口的字节读入AL
INAX,70H;将70、71端口的值读入AX,将70H端口的内容读入AL,71H端口的内容读入AH
INAL,DX;从DX所指的端口中读取一个字节
OUT44H,AL;将AL中的一个字节输出到44H端口。
OUT80H,AX;将AL中的内容输出到80H,AH中的内容输出到81H
OUTDX,AL;将AL中的内容输出到DX所指的端口中
OUTDX,AX;将AL中的内容输出到DX所指的端口中;AH中的内容输出到DX+1所指的端口中
*********************************************************
2.2.4算术运算类指令
86系列CPU指令系统中,具有完备的加,减,乘,除算术运算指令,可处理不带符号或带符号的8/16位二进制整数,以及不带符号的装配型/拆开型十进制整数。
表2-4给出了86系列指令系统中算术运算类指令。
表2-4算术运算类指令
指令
类型
指令
格式
指令
功能
状态标志位
备注
OSZAPC
加
法
ADD目标,源
ADC目标,源
INC目标
加法(字节/字)
带进位加法(字节/字)
加1(字节/字)
······
······
·····-
源:
通用寄存器、存储器、立即数
目标:
通用寄存器、存储器
源:
通用寄存器、存储器、立即数
目标:
通用寄存器、存储器
目标:
通用寄存器、存储器
减
法
SUB目标,源
SBB目标,源
DEC目标
NEG目标
CMP目标,源
减法(字节/字)
带借位减法(字节/字)
减1(字节/字)
取补
比较
······
······
·····-
·····1
······
源:
通用寄存器、存储器、立即数
目标:
通用寄存器、存储器
源:
通用寄存器、存储器、立即数
目标:
通用寄存器、存储器
目标:
通用寄存器、存储器
目标:
通用寄存器、存储器
源:
通用寄存器、存储器、立即数
目标:
通用寄存器、存储器
乘
法
MUL源
IMUL源
无符号乘法(字节/字)
有符号乘法(字节/字)
·****·
·****·
源:
通用寄存器、存储器
源:
通用寄存器、存储器
除
法
DIV源
IDIV源
CBW
CWD
无符号除法(字节/字)
有符号除法(字节/字)
字节转换成字
字转换成双字
******
******
------
------
源:
通用寄存器、存储器
源:
通用寄存器、存储器
十
进
制
调
整
AAA
DAA
AAS
DAS
AAM
AAD
加法的ASCII码调整
加法的十进制调整
减法的ASCII码调整
减法的十进制调整
乘法的ASCII码调整
除法的ASCII码调整
***·*1
*·····
***·*1
*·····
*··*·*
*··-·*
说明:
·运算结果影响标志位,-运算结果不影响标志位,*标志位为任意值,“1”将标志位置1
1.加法指令
(1)不带进位位的加法指令
ADD用来执行两个字或两个字节的相加操作,结果放在原来存放目的操作数的地方。
例如:
ADDAL,50H;AL和50H相加,结果放在AL中
ADDCX,l000H;CX中的内容和1000H相加,结果放在CX中
ADDDI,SI;DI和SI的内容相加,结果放在DI中
ADD[BX+DI],AX;BX十DI和BX十DI十1两个存储单元的内容和AX中的内容相加,
;结果放在BX+DI和BX+DI+1所指的存储单元中
ADDAX,[BX+2000H];BX+2000H和BX+2001H所指的两单元的内容和AX的内容相加,
;结果放在AX中
(2)带进位位的加法指令
ADC在形式上和功能上都和ADD指令类似,只有一点区别,就是ADC指令被执行时,将进位标志CF的值加在和中。
例如:
ADCAX,SI;AX和SI中的内容以及CF的值相加,结果放在AX中
ADC指令为实现多字节的加法运算提供了方便。
【例子】有两个4字节的无符号数相加,这两个数分别放在2000H和3000H开始的存储单元中,低位在前,高位在后,要求进行运算后,得到的和放在2000H开始的内存单元中。
可以用如下程序段实现这种多字节的加法:
CLC;清进位位CF
MOVSI,2000H;取第一个数的首地址
MOVAX,[SI];将第一个数的低16位取到AX
MOVDI,3000H;取第二个数的首地址
ADDAX,[DI];第一个数和第二个数的低16位相加
MOV[SI],AX;低16位相加的结果送到2000H,200lH单元
MOVAX,[SI+2];取第一个数的高16位送到AX中
ADCAX,[DI+2];两个数的高16位连同进位位相加
MOV[SI+2],AX;高16位相加的结果送到2002H、2003H单元
(3)增量指令
INC只有1个操作数,指令在执行时,将操作救的内容加1,再送回该操作数。
这条指令一般用在循环程序中修改指针和循环次数。
例如:
INCAL;将AL中的内容加1
INCCX;将CX中的内容加I
INCBYTEPTR[BX+DI+500];将BX十DI十500所指的存储单元的内容加1
在编程中要注意,INC指令不影响进位标志CF的状态。
2.减法指令
(1)不带借位的减法指令
SUB完成两个字节或两个字的相减。
例如:
SUBBX,CX;将BX中的内容减去CX中的内容。
结果放在BX中
SUB[BP+2],CL;将SS段的BP+2所指的单元中的值减去CL中的值。
;结果放在BP+2所指的堆栈单元中
SUBAL,20;AL中的数减去20,结果放在AL中
SUBSI,5010H;SI中的数减去50l0H,结果放在SI中
(2)带借位的减法指令
SBB在形式上和功能上都和SUB指令类似,只是SBB指令在执行减法运算时,还要减去CF的值。
在减法运算中,CF的值就是两数相减时,向高位产生的借位,所以,SBB在执行减法运算时,是用被减数减去减数,并减去低位字节相减时产生的借位。
和带进位位的加法指令类似,SBB主要用在多字节减法运算中。
例如:
SBBAX,2030H;将AX的内容减去立即数2030H,并减去进位位CF的值
SBBWORDPTR[DI],1000H;DI和DI+1所指的单元中的数减去1000H及CF,;结果
;放在DI和DI+1所指的单元中
(3)减量指令
DEC只有1个操作数,执行时,将操作数的值减1,再将结果送回操作数。
例如:
DECAX;将AX的内容减1,再送回AX中
DECBL;将BL的内容减1,结果送回BL中
DECBYTEPTR[DI+2];将DI+2所指的单元中的内容减1,结果送回此单元
(3)取补指令
NEG对指令中给出的操作数取补码,再将结果送回。
因为对一个操作数取补码相当于用0减去此操作数,所以NEG指令执行的也是减法操作。
例如:
NEGAL;将AL中的数取补码,送回AL
NEGCX;将CX中的内容取补码,送回CX
(4)比较指令
CMP也是执行两个数的相减操作,但不送回相减的结果,只是使结果影响标志位。
例如:
CMPAX,2000H;将AX的内容和2000H相比较,结果影响标志位
CMPAX,[BX+DI+100];将累加器和两个存储单元的数相比较,结果影响标志
;位,地址由BX+DI+100和BX+DI+101指出
CMPDX,DI;将DX和DI的内容相比,结果影响标志位
一般情况下,CMP指令后面经常会有一条条件转移指令,用来检查标志位的状态是否满足了某种关系。
CMP指令对标志位的影响如表2-5所示。
表2-5CMP指令执行后标志位的状态
数据类型
目的操作数与源操作数的关系
CFZFSFOF
带符号位
的操作数
0100
-010
-001
-000
-011
不带符号位
的操作数
0100
10--
00--
3.乘法指令
乘法运算是双操作数运算,但是,在指令中却只指定了—个操作数,另一个操作数是隐含规定的,乘法运算的隐含规则如图2—10所示。
其中的操作数可以是寄存器操作数或存储器操作数,而隐含的为AL或AX。
从图2—10中可以看出,两个8位数相乘,其结果是16位数;两个16位数相乘,其结果是32位数。
图2-10乘法运算规则
4.除法指令
除法运算也是双操作数运算,它的隐含规则如图2—11所示,其中的操作数与乘法指令相同。
在除法运算中,如果除数是8位的,则要求被除数是16位的;如果除数是16位的,则要求被除数是32位的。
如果被除数的位数不够,则应在进行除法以前,预先将被除数扩展到所需要的位数。
对于带符号数,这种扩展应该保持被扩展数的值(包括符号位)不变,因此应该是带符导位的扩展。
例如,0111000B应扩展成0000000001110000B,11110000应扩展成1111111111110000B。
CBW和CWD指令就是分别用于这两种扩展的。
对于带符号数的除法,86系列是按表2-6所示的方式来处理商和余数的。
图2-11除法运算规则
表2-6带符号数除法的商和余数
被除数
除数
商
余数
9
9
-9
-9
2
-2
2
-2
4
-4
-4
4
1
1
-1
-1
从表2-6可以看出.余数始终与被除数同号,也就是说,商是往0靠拢的。
********************************************************************************
2.2.5逻辑运算和移位指令
8086指令系统提供了对8位数和16位数的逻辑操作指令。
这些指令分为两类:
一类是逻辑运算指令,另一类是移位指令。
表2-7给出了86系列指令系统中逻辑运算和移位类指令。
表2-7逻辑运算和移位指令
指令
类型
指令
格式
指令
功能
状态标志位
备注
OSZAPC
逻
辑
运
算
NOT目标
AND目标,源
OR目标,源
XOR目标,源
TEST目标,源
非(字节/字)
与(字节/字)
或(字节/字)
异或(字节/字)
测试(字节/字)
------
0··*·0
··*·0
··*·0
0··*·0
目标:
通用寄存器、存储器
源:
通用寄存器、存储器、立即数
目标:
通用寄存器、存储器
源:
通用寄存器、存储器、立即数
目标:
通用寄存器、存储器
源:
通用寄存器、存储器、立即数
目标:
通用寄存器、存储器
源:
8位或16位立即数
目标:
通用寄存器、存储器
移
位
SHL目标,计数值
SAL目标,计数值
SHR目标,计数值
SAR目标,计数值
逻辑左移(字节/字)
算术左移(字节/字)
逻辑右移(字节/字)
算术右移(字节/字)
···*··
···*··
···*··
···*··
目标:
通用寄存器、存储器
计数值:
1或CL,移位次数
目标:
通用寄存器、存储器
计数值:
1或CL,移位次数
目标:
通用寄存器、存储器
计数值:
1或CL,移位次数
目标:
通用寄存器、存储器
计数值:
1或CL,移位次数
循
环
移
位
ROL目标,计数值
R0R目标,计数值
RCL目标,计数值
RCR目标,计数值
循环左移(字节/字)
循环右移(字节/字)
带进位循环左移(字节/字)
带进位循环右移(字节/字)
·--*-·
·--*-·
·--*-·
·--*-·
目标:
通用寄存器、存储器
计数值:
1或CL,移位次数
目标:
通用寄存器、存储器
计数值: