《微机原理与控制技术》辅导资料一.docx
《《微机原理与控制技术》辅导资料一.docx》由会员分享,可在线阅读,更多相关《《微机原理与控制技术》辅导资料一.docx(37页珍藏版)》请在冰点文库上搜索。
《微机原理与控制技术》辅导资料一
《微机原理与控制技术》辅导资料九
主题:
第三章8086微处理器的指令系统(第3节后半部分)
学习时间:
2014年11月24日-11月30日
内容:
我们这周主要学习逻辑运算指令,串操作指令,控制转移指令和处理器控制
指令的相关知识。
希望通过下面的内容能使同学们加深微机原理与控制技术相关知识的理解。
第三节8086指令系统(续)
三、逻辑运算及移位类指令
这部分指令可分为三种类型,见下表。
指寺格式
就克tt■志荷
OF
SF
ZF
AF
?
F
CF
AJJDdi§
fl
1
t
耳
Q
'或(字节焯)
Ok册s
0
t
t
2
t
a
净我’停节帝
XORLG
0
I
t
5
t
D
KOT4
TE^r1.3
0
1
A
E
t
0
(干节/孚)
sal也
t
t
t
X
t
t
章木百釀(Tf;字)
SARdpc&unt
t
t
3t
t
(罕节呼)
SHL右匚电阳ii
t
t
£
t
t
住卷石碟(字节J宇)
SHRdpc^unt
1
t
Z
t
務环左移(早节J宇)
KOL4^“uni
t
*
V
嵐
由
r
憎环右够(宇节丁宇〉
FOR日,ccuft
t
4
*
N
*
t
节迴柱为环左林〔爭节『芋)
RCLdicovat
r
fe
•
JC
t
苇迟儘韻环右移(宇节/宇)
KCRdrme
t
4
*
JE
*
t
1.逻辑运算指令
逻辑运算指令共有五条。
(1)AND(logicalAND):
逻辑与”指令
格式:
ANDd,s
操作:
(d)J(d)A(s)
其中,符号’入”表示逻辑与”操作。
源操作数s可以是8/16位通用寄存器、存储器操作数或立即数,而目标操作数d只允许是通用寄存器或存储器操作数。
AND指令可将两个操作数的内容按位相与”并将结果保存在目标操作数
中。
指令执行后,将使CF=0,OF=0,AF位无定义,并影响SF,ZF和PF标志位。
AND指令常用于将操作数的某些位清0(也称为屏蔽某些位),而其余位维持不变。
需要清0的位和0相与”需要维持不变的位和1相与”
【例3.40】要求将AL寄存器中的D1位、D5位清0,其余位保持不变。
ANDAL,0DDH;将D1位、D5位和0与”,其他位和1与”指令执行前,AL=7AH。
01111010AL
A)11〔111101DDH
01011000AL
指令执行:
指令执行后,AL=58H。
(2)OR(logicalOR):
逻辑或”指令
格式:
ORd,s
操作:
(d)J(d)V(s)
其中,符号V”表示逻辑或”操作。
源操作数和目标操作数的约定同AND
指令。
OR指令可将两个操作数的内容按位相或”并将结果保存在目标操作数中。
对标志位的影响同AND指令。
利用OR指令可将操作数的某些位置1,而其余位不变。
需要置1的位和1相或”需要维持不变的位和0相或”利用或”运算,也可对两个操作数进行组合(称为拼字)。
【例3.41】ORAL,80H
上述指令可以使AL寄存器中的最高位置1,其余位不变。
指令执行前,AL=3AH。
指令执行:
□Oil1010AL
V)1000LIOCO30H
10111010AL-
指令执行后,AL=BAH。
(3)XOR(logicalexclusiveOR):
逻辑异或”指令
格式:
XORd,s
操作:
(d)J(d)士(s)
其中,符号”表示逻辑”异或”操作。
源操作数和目标操作数的约定同AND指令。
XOR指令可将两个操作数按位相异或”并将结果保存在目标操作数中。
对标志位的影响同AND指令。
利用XOR指令,可将操作数的某些位求反,某些位不变。
维持不变的位与
0相异或”需要求反的位与1相异或”
[例3.42】XORBL,0FH
该指令可使BL寄存器的高4位维持不变,而将低4位求反。
指令执行前,BL=55H。
指令执行:
01010101BL金)皿叩里0FH
010110100L
指令执行后,BL=5AH。
[例3.43】XORAL,AL
指令执行前,AL=78H。
指令执行:
指令执行后,AL=00H,CF=0,ZF=1。
可见,XOR指令可用于将操作数清0,并使CF=0。
(4)NOT(logicalNOT):
逻辑非”指令
格式:
NOTd
操作:
(d)-(〔•)
其中,操作数d上面的“”表示求反运算,有关操作数的约定同AND指令
NOT指令可将操作数的内容按位求反,并将结果保存在源操作数中,其执
行结果不影响任何标志位。
[例3.44】NOTAL
指令执行前,
AL=33H。
指令执行后,
AL=CCH
(5)TEST(testbits):
测试指令
格式:
TESTd,s
操作:
(d)A(s)
TEST指令完成的操作、操作数的约定,以及对标志位的影响同AND指令,只是TEST指令不回送结果到目标操作数。
使用TEST指令,通常是在不希望改变原有操作数的情况下,检测某一位或某几位的状态。
所以常被用于条件转移指令之前,根据测试的结果令程序发生跳转。
【例3.45】检测DL中的最高位是否为1,若为1则转移到标号L0P1去执行,否则顺序执行,可用下列程序实现:
TESTDL,80H
JNZLOP1
■
LOP1:
MOVAL,BL
■
2.移位与循环移位指令
移位与循环移位指令共有八条,其功能如下图所示
指令中的操作数d可以是8/16位的通用寄存器和任何寻址方式的存储器操作数,而不允许使用立即数和段寄存器。
移位次数由count决定。
count可取1
或CL寄存器操作数,count为1时每执行一条指令,可将操作数的内容移一位,若需要移位的次数大于1时,则可在移位指令前面,将移位次数置于CL中,而在移位指令中将count写为CL,当移位结束后,CL=0。
(1)移位指令
移位指令共有四条。
1SHL(shiftleft):
逻辑左移指令
格式:
SHLd,count
操作:
SHL指令可将操作数的内容向左移位,移位的次数由count给定,每左
移一位,操作数最高位的状态移入CF标志位,低位补0。
【例3.46】
MOVCL,4
SHLAL,CL
SHL指令执行后,可使AL中的内容左移4位,即AL中的低4位的状态移入高4位,并将低4位清0。
2SHR(shiftright):
逻辑右移指令
格式:
SHRd,count
操作:
SHR指令的操作和SHL指令相反,可将操作数的内容向右移位,每右移一位,操作数最末位移入CF标志,高位补0。
3SAL(shiftarithmeticleft):
算术左移指令
格式:
SALd,count
操作:
与SHL指令完全相同。
4SAR(shiftarithmeticright):
算术右移指令
格式:
SARd,count
操作:
将操作数的内容向右移位,每右移一位,操作数最末位移入CF标志
位,最高位移入次高位的同时其值不变,这样移位后最高位和次高位的值相同,符号位始终保持不变。
由上述讨论可知,移位指令分为算术移位和逻辑移位。
算术移位只对带符号数进行移位,在移位过程中必须保持符号位不变。
而逻辑移位是对无符号数移位,移位时,总是用0来填补已空出的数位。
每左移一位,相当于将原数据乘以2,
每右移一位,相当于将原数据除以2。
根据移位操作的结果置标志寄存器中的状态标志(AF位除外)。
若移位的次数是1,移位的结果又使最高位(符号位)发生变化,则将溢出标志OF置1,若移多位时,OF标志无效。
这样,对于有符号数而言,可由此判断移位后的符号位和移位前的符号位是否相同。
(2)循环移位指令
循环移位指令共有四条。
1ROL(rotateleft):
循环左移指令
格式:
ROLd,count
操作:
每左移一位,操作数最高位的状态移出,该状态除送入标志位CF外,
还循环传递到由于左移一位而空出的操作数最末位。
2ROR(rotateright):
循环右移指令
格式:
RORd,count
操作:
ROR指令的操作正好和ROL指令相反,每右移一位,将操作数最末位的状态移出,并传递到CF标志和操作数的最高位。
3RCL(rotateleftthroughcarry):
带进位循环左移指令
格式:
RCLd,count
操作:
每左移一位,将操作数最高位的状态移入CF标志位,而CF标志原先的状态移入操作数最末位。
4RCR(rotaterightthroughcarry):
带进位循环右移指令
格式:
RCRd,count
操作:
RCR指令完成的操作和RCL指令正好相反。
每右移一位,将操作数最末位的状态移入CF标志,而CF标志原先的状态移入操作数最高位。
由上述讨论可知,循环移位指令也有两类。
ROL和ROR指令在执行时,没有把CF套在循环中,常称为小循环移位。
而RCL和RCR指令在执行时,连同CF一起进行循环移位,称为大循环移位。
以上四条指令仅影响标志位CF和OF。
对OF的影响是,ROL和RCL指令在执行一次左移后,如果操作数的最高位与CF(原先的符号位)不等,说明新的符号位与原来的符号位不同了,则使OF
=1,表明左移循环操作造成了溢出。
同样,ROR和RCR指令在执行一次右移
后,如果操作数的最高位和次高位不等,也表明移位后新的数据符号与原来的符号不同了,此时也会使OF=1,产生溢出。
【例3.47】若某字数据X已存放于寄存器AX中,现要求将该数乘以10。
在80486指令系统中有乘法指令,但从指令手册中可知,执行乘法指令所花的时间为10〜11个时钟周期。
而用移位指令实现乘2操作所需要的时间为1〜3个时钟周期,从而可提高计算速度3〜10倍。
我们知道,XX10=X&+X$。
某数乘2即左移一位,某数乘8即左移三位。
所以,XX10的程序如下:
SALAX,1;XX2
MOVBX,AX;XX2的乘积存入BX
SALAX,1;XX4
SALAX,1;XX8
ADDAX,BX;XX8+XX2=XXO
执行上述程序段所需要的时间为五个时钟周期,若改用乘法指令实现乘10
操作,所需时间为11个时钟周期。
四、串操作类指令
80486指令系统中提供了一组强有力的串操作指令。
串操作指令可对一系列含有字母、数字的字节(也称字符串)进行操作和处理。
例如传送、比较、查找、插入、删除等。
串操作指令是指令系统中惟一可在存储器内的源操作数与目标操作数之间进行操作的指令,所有串操作指令均可以处理字或字节。
基本字符串(数据块)指令及可使用的重复前缀见下表。
伏态坏克乜
OF
SF
ZF
AF
PF
CF
宇节用「宇串嘩谗
*
4
4-
■
*
*
*
字节序■■字串:
丹€
CMP5dP£
t
t
t
t
1
t
CM?
哉二血注7
t
t
1
1
t
字节母学皐專东
5CA5d
t
t
1
1
t
ECASB^CASW
t
t
t
1
1
t
LODSf
■
■-
4
V
*
LODSB/LOPSW
*
电
*
马乍节紬吟书
STOSA
■
■
■
s
STO*』STO汎「
■
*
■a
*
*
为缩短指令长度,串操作指令均采用隐含寻址方式,源串一般存放在当前数
据段中,即由DS段寄存器提供段基址,其偏移地址必须由源变址寄存器SI提
供。
目标串必须存放在附加段中,即由ES段寄存器提供段基址,其偏移地址必须由目标变址寄存器DI提供。
如果要在同一段内进行串操作,必须使DS和ES指向同一段。
字符串长度必须存放在CX寄存器中。
所以,在串指令执行之前,必须对SI,DI和CX预置初值,即将源串和目标串的首元素或末元素的偏移地址分别置入SI和DI中,将字符串长度置入CX中。
这样,在CPU每处理完一个字符串元素时,就自动修改SI和DI寄存器的内容,使之指向下一个元素。
为加快串操作的执行速度,可在串操作指令前加上重复前缀,共有五种重复前缀。
带有重复前缀的串操作指令,每处理完一个字符串元素后自动修改CX的内容(按字节/字处理,减1或减2),以完成计数功能。
当CX老时,继续串操作,直到CX=0时才结束操作。
串操作指令对SI和DI寄存器的修改与两个因素有关。
一是和被处理的字符串是字节串还是字串有关,二是和当前的方向标志DF的状态有关。
当DF=0
时,表示串操作由低地址向高地址进行,SI和DI内容应递增,其初始值应该是源串和目标串的首地址。
当DF=1时,则情况正好相反。
1.字符串操作指令
80486指令系统中共有五种基本的串操作指令,下面分别予以介绍。
(1)MOVS(movedatafromstringtostring):
串传送指令
格式:
有三种形式
MOVSd,s
MOVSB;字节串传送
MOVSW;字串传送
操作:
①(DI)・(SI)
2若为字节操作:
SIJSI±,DIJDI±,当方向标志DF=0时,用牛”;当方向标志DF=1时,用•”。
3若为字操作:
SIJSI±,DIJDI吃,当方向标志DF=0时,用牛”;当方向标志DF=1时,用•”。
MOVS指令可把一个字节或字从源串(由SI寻址)传送到目标串(由DI寻址),并自动修改SI和DI的内容,使之指向下一个字符串元素。
MOVSB/MOVSW是MOVS的替代符,由于指令助记符中已明确是字节串还是字串传送,因此没有操作数。
通常,指令前要加上重复前缀REP,此时,要传
送的字符个数在CX中,每传送完一个元素,CPU自动修改CX的内容(按字节/字处理,减1或减2),直到CX=0为止,从而完成从存储器到存储器的字符串成块传送。
串传送指令的结果不影响标志位。
例如:
设变量ADDR1和ADDR2为字类型时,下面两条指令是等效的。
MOVSADDR1,ADDR2
MOVSW
上述第一条指令中的操作数仅指出了指令为字操作类型,实际目标操作数与
源操作数的逻辑地址由ES:
DI和DS:
SI指出。
【例3.48】将源数据串的256个字节数据传送到目标串的单元中去。
源数据串的段首地址的偏移地址为2000H,目标串首地址的偏移地址为5000H,则完成数据串传送的程序段如下:
CLD;DF=0,地址自动递增
MOVCX,256;设置计数器,初始值为数据串的长度
MOVSI,2000H;源数据串首元素的偏移地址
MOVDI,5000H;目标数据串首元素的偏移地址
REPMOVSB;重复串操作,直到CX=0为止
(2)CMPS(comparestringoperands):
串比较指令
格式:
有三种形式
CMPSs,d
CMPSB
CMPSW
字节操作:
(SI)-(DI),SI—SI±,DI—DI±
字操作:
(SI)-(DI),SI—SI±2,DI—DI±
串比较指令将由SI作为指针的源串中的一个元素减去由DI作为指针的目标串中相对应的一个元素,不回送结果,只根据结果特征置标志位,并相应地修改SI和DI的内容,使之指向下一个元素。
指令的其他特性与MOVS指令的规定
相同。
通常,在CMPS指令前加重复前缀REPE/REPZ,两者的定义完全相同,只是书写的形式不一样而已。
此时,可重复进行两数的比较。
仅当ZF二1(两数
相等)且CX和(元素未比较结束)时,才可继续比较,一旦发现ZF=0(两数不相等或元素比较结束)时,则终止指令的执行。
注意:
串比较指令的源串操作数(由SI寻址)是写在逗号左边的,而目标串操作数(用DI寻址)写在右边。
这是指令系统中惟一例外的指令句法结构,编程时要特别注意。
CMPSB和CMPSW同样作为CMPS指令的替代符,不带操作数。
(3)SCAS(scanbyteorwordstring):
搜索指令
格式:
有三种形式
SCASd
SCASB;字节串搜索
SCASW;字串搜索
字节操作:
AL-(DI),DIJDI±1
字操作:
AX-(DI),DIJDI±2
搜索指令用来从目标串中查找某个关键字,要求将待查找的关键字预先置入
AX(字)或AL(字节)中。
指令执行时,将AX或AL中的关键字减去由DI的内容指向的目标串中的一个元素,不传送结果,只根据结果置标志位,然后修改DI的内容使之指向下一个元素。
通常,在SCAS前加重复前缀REPNE/REPNZ,可重复进行在目标串中寻找关键字的操作,一直进行到ZF=1(查到了某关键字)或CX=0(终未查找到)为止。
同样,SCASB和SCASW为SCAS指令的替代符,不带操作数。
【例3.49】要求从段首元素的偏移地址为0100H的一个字符串(字符个数为256)中找出指定的字符(如$)。
可用REPNZSCASB指令实现。
程序如下:
CLD;DF=0,地址自动递增
MOVAL,$';设关键字
(4)
):
读字符串指令
LODS(loadbyteorwordstring
格式:
有三种形式
LODSs
LODSB;读取字节串
LODSW;读取字串
字节操作:
AL—(SI),SI—SI±
字操作:
AX—(SI),SI—SI±
读字符串指令把由SI指定的数据段中字节或字单元的内容送入AL或AX中,并根据方向标志DF及数据类型来修改SI的内容。
指令执行之前,要取出的数据必须在存储器中预先定义(用DB或DW),
SI必须预置初始值。
读字符串指令一般不加重复前缀,常用来和其他指令相结合完成复杂的串操作功能。
而LODSB和LODSW同样为LODS的替代符,不带操作数。
读字符串指令的执行结果不影响标志位。
(5)STOS(storebyteorwordstring):
写字符串指令
格式:
有三种形式
STOSd
STOSB;写入字节串
STOSW;写入字串
字节操作:
(DI)—AL,DI—DI±
字操作:
(DI)—AX,DI—DI±
写字符串指令将AL或AX中的内容存入由DI指定的附加段中的字节或字单元中,并根据DF的值及数据类型来修改DI的内容。
指令执行之前,必须把要存放的数据预先存入AX或AL中,并对DI预置初始值。
写字符串指令的执行结果也不影响标志位。
STOSB和STOSW同样为
STOS的替代符,不带操作数。
如加上前缀指令REP后,用STOSB和STOSW可使一串内存单元填满相同的数。
【例3.50】将字符$送入附加段中偏移地址为0100H的连续五个单元中。
程序如下:
CLD;DF=0,地址自动递增
MOVCX,5;设置计数器
MOVDI,0100H;目标串首元素的偏移地址
MOVAL,$'设置关键字
REPSTOSB;连续将$'写入相应存储单元中
2.重复前缀
在大多数应用中,必须重复执行基本串操作来处理一个数据阵列时,需要在
重复的指令前加上一个重复前缀。
常用的重复前缀见表3.5。
(1)前缀REP(repeat)
REP导致重复基本操作一直到CX寄存器的值变为零。
每次执行指令时都要测试CX是否为零。
如果CX和,则将CX减1,重复基本操作。
当CX=0时,重复串操作结束,执行下一条指令。
在执行重复串指令前必须先将重复次数装入CX中。
宓用
型龍
MOV;,
ChiPS,SCAS
当用是串尾旦串相零世重坦帥且ZF二1
当卞寒f不为苇可至爲
^.EPT^EjlREFHZ
SCAS
当不是串尾巨申不寻旺車昊口叱&曰匸
(2)前缀REPE/REPZ(repeatwhileequal/repeatwhilezero)
REPE和REPZ的功能相同。
它们与CMPS,SCAS指令一起使用。
带前缀
的CMPS/SCAS指令,只要CX和且ZF=1,基本比较或扫描操作就能够一直重复执行。
CX用表示还没有到达串尾,ZF=1表示所比较的兀素相等。
(3)前缀REPNE/REPNZ(repeatwhilenotequal/repeatwhilenotzero)REPNE和REPNZ的工作方式类似于REPE/REPZ,只不过重复条件变为
CX旳且ZF=0。
这就是说,只要串元素不等且未到达串尾,那么就重复执行比较或扫描。
五、程序控制类指令
一般情况下,CPU执行程序是按照指令的顺序逐条执行的,但实际上程序
不可能总是顺序执行,而经常需要改变程序的执行流程,转移到所要求的目标地址去执行,这就必须安排一条程序转移类指令。
在80486指令系统中,程序控制类指令就是专用来控制程序流向的,包括无条件转移、条件转移、循环控制及中断控制四种类型。
1.无条件转移指令
无条件转移指令的功能是使程序无条件地转移到指令指定的地址去执行。
分
为无条件转移、调用过程及从过程返回三种指令格式,见下表。
拒寺名評
9国盍
且杠頁号
CALL
4L&T
(1)JMP(unconditionaljump):
无条件转移指令
格式:
JMP目标标号
操作:
JMP指令可以使程序无条件地转移到目标标号指定的地址去执行。
目标单元可以在当前代码段内(段内转移),也可在其他代码段中(段间转移)
根据目标地址的位置与寻址方式的不同,有五种基本指令格式。
1段内直接短程转移
格式:
JMPSHORT目标标号
操作:
IP—IP+D8
其中,SHORT为属性操作符,表明指令代码中的操作数是一个以字节二进制补码形式表示的偏移量,它只能在—128〜+127范围内取值。
SHORT在指令中可以省略。
指令执行时,转移的目标地址由当前的IP值(即跳转指令的下
一条指令的首地址)与指令代码中8位偏移量之和决定。
【例3.51】在当前代码段中有一条无条件转移指令如下:
■
JMPSHORTLOP1
■
LOP1:
MOVAL,55H
I
I
■
上述指令的执行过程及转