《微机系统与接口教学资料第三章(2)》由会员分享,可在线阅读,更多相关《微机系统与接口教学资料第三章(2)(201页珍藏版)》请在金锄头文库上搜索。
1、3.48088(8086)的指令系统的指令系统一、一、一、一、IBMPC(8086/8088)IBMPC(8086/8088)指令系统指令系统指令系统指令系统二、数据传送指令二、数据传送指令二、数据传送指令二、数据传送指令三、算术运算指令三、算术运算指令三、算术运算指令三、算术运算指令四、逻辑运算指令四、逻辑运算指令四、逻辑运算指令四、逻辑运算指令五、串操作指令五、串操作指令五、串操作指令五、串操作指令六、控制转移指令六、控制转移指令六、控制转移指令六、控制转移指令七、处理机控制指令七、处理机控制指令七、处理机控制指令七、处理机控制指令一、一、IBMPC(8086/8088)指令系统指令系统8
2、086/8088指令系统可分为六组:指令系统可分为六组:数据传送指令数据传送指令数据传送指令数据传送指令 (DataDatatransfartransfar);););); 算术指令算术指令算术指令算术指令 ( ArithmeticArithmetic);););); 逻辑指令逻辑指令逻辑指令逻辑指令 (LogicLogic);););); 串处理指令串处理指令串处理指令串处理指令 (StringmanipulationStringmanipulation);););); 控制转移指令控制转移指令控制转移指令控制转移指令 ( ControlControltransfartransfar););
3、);); 处理机控制指令处理机控制指令处理机控制指令处理机控制指令 ( ProcessorcontrolProcessorcontrol););););二、数据传送指令二、数据传送指令分类分类分类分类名称名称名称名称格式格式格式格式功能功能功能功能OSZAPCOSZAPC基本传送指令基本传送指令MOVDST,SRCMOVDST,SRC字、字节传送字、字节传送不影响不影响进栈指令进栈指令PUSHOPRDPUSHOPRD字字压入堆栈压入堆栈不影响不影响出栈指令出栈指令POPOPRDPOPOPRD字字弹出堆栈弹出堆栈不影响不影响交换指令交换指令XCHGDST,SRCXCHGDST,SRC字、字节交换
4、字、字节交换不影响不影响有效地址送寄存器指令有效地址送寄存器指令LEAREG,SRCLEAREG,SRC有效地址有效地址寄存器寄存器不影响不影响指针送寄存器及指针送寄存器及DS指令指令LDSREG,SRCLDSREG,SRC地址指针地址指针寄存器寄存器,DS不影响不影响指针送寄存器及指针送寄存器及ES指令指令LESREG,SRCLESREG,SRC地址指针地址指针寄存器寄存器,ES不影响不影响输入指令输入指令INAL,PORTINAL,PORT外设数据外设数据AL不影响不影响输出指令输出指令OUTPORT,ALOUTPORT,ALAL外设数据外设数据不影响不影响换码指令换码指令XLATXLAT
5、AL中数据转换中数据转换不影响不影响读取标志指令读取标志指令LAHFLAHFFlag低字节低字节AH不影响不影响设置标志指令设置标志指令SAHFSAHFAHFlag低字节低字节ZAPCZAPC标志寄存器入栈指令标志寄存器入栈指令PUSHFPUSHF把把Flag内容压入堆栈内容压入堆栈不影响不影响标志寄存器出栈指令标志寄存器出栈指令POPFPOPF把把Flag内容弹出堆栈内容弹出堆栈OSZAPCOSZAPC通用通用通用通用数据数据数据数据传送传送传送传送指令指令指令指令地址地址地址地址传送传送传送传送指令指令指令指令累加累加累加累加器专器专器专器专用指用指用指用指令令令令标志标志标志标志寄存寄存
6、寄存寄存器传器传器传器传送指送指送指送指令令令令1.1.通用数据传送指令通用数据传送指令通用数据传送指令通用数据传送指令 ( (1)1)基本传送指令基本传送指令基本传送指令基本传送指令MOVDST,SRCMOVDST,SRC源操作数源操作数寄存器、存储器、立即数寄存器、存储器、立即数目的操作数目的操作数寄存器、存储器寄存器、存储器执行的操作:执行的操作:DSTDST SRCSRCMOV指令最简单、最常用,用来赋初值,或传送数据,指令最简单、最常用,用来赋初值,或传送数据,或对数据进行暂存等。或对数据进行暂存等。rSSDIBPICPUINSTmCSr/segESAXDSImmr/rSPIMCXD
7、Xr/mSIseg/mmBX其中源操作数其中源操作数(src)和目的操作数和目的操作数(dst)均可采用多种均可采用多种寻址方式寻址方式,其传送关系如图所示:其传送关系如图所示:SRMIMCS:IP不能直接改变不能直接改变由图可知由图可知MOV指令有指令有6种格式:种格式:(1)CPU通用寄存器之间传送(通用寄存器之间传送(r/r)MOVCL,AL;将将AL中的中的8位数据传到位数据传到CL(2)通用寄存器和段寄存器之间(通用寄存器和段寄存器之间(r/SEG)MOVDS,AX;将将AX中的中的16位数据传到位数据传到DS(3)用寄存器和存储单元之间(用寄存器和存储单元之间(r/M)MOVAL,
8、BX;将将BX所指存储单元内容传到所指存储单元内容传到AL(4)段寄存器和存储单元之间(段寄存器和存储单元之间(seg/M)MOVDS,2000H;将将2000H和和2001H两存储单元内容传到两存储单元内容传到DS(5)立即数到通用寄存器(立即数到通用寄存器(r/Imm)MOVSP,2000H;将将2000H送送SP(6)立即数到存储单元(立即数到存储单元(M/Imm)MOVWORDPTRSI,4501H;将立即数将立即数4501H送送(SI)所指所指的字单元的字单元注意:注意:MOV指令可以传指令可以传8位或位或16位数据位数据例例:MOVES,AL;错错MOVCL,4321H;错错MOV
9、指令的操作数中必用一个寄存器,不允许两存储单元指令的操作数中必用一个寄存器,不允许两存储单元之间传送数据之间传送数据MOV2000H,3000H;错错例例:MOVAL,SIMOVDI,AL不能用不能用CS,IP作目的操作数作目的操作数不允许在段寄存器之间直接传送数据不允许在段寄存器之间直接传送数据例例:MOVDS,ES;错错不允许用立即数作目的操作数不允许用立即数作目的操作数MOV2000H,AL;错错不能向段寄存器送立即数不能向段寄存器送立即数MOVDS,3000H;错错例例:MOVAX,3000HMOVDS,AX*MOV指令不影响标志位。指令不影响标志位。例例1:把地址为把地址为AREA1
10、(段内偏移量)的存储单元的内容,传段内偏移量)的存储单元的内容,传送至同一送至同一段内的地址为段内的地址为AREA2的存储单元中。的存储单元中。AREA1AREA265F3020024E00500MovAREA2,AREA1MovAL,AREA1MovAREA2,AL例例2:若要传送的不是一个字节,而是一个数据块,(例如内:若要传送的不是一个字节,而是一个数据块,(例如内有有100个字节),如何实现?个字节),如何实现?movsi,offsetarea1movdi,offsetarea2movcx,100Again:moval,si;movdi,alincsiincdideccxjnzagai
11、nint3AREA1AREA265F3020500100= Lea si, area2 (2)(2)栈操作指令栈操作指令栈操作指令栈操作指令PUSHOPRDPUSHOPRDPOPOPRDPOPOPRD堆栈堆栈按照按照先进后出先进后出先进后出先进后出的原则组织的一段内存区域。的原则组织的一段内存区域。8088中规定堆栈设中规定堆栈设置在堆栈段(置在堆栈段(SS段)内,堆栈指针段)内,堆栈指针SP的初值决定了堆栈的大小。的初值决定了堆栈的大小。SP始终指向堆栈的顶部,即始终指向最后推入堆栈的信息所在始终指向堆栈的顶部,即始终指向最后推入堆栈的信息所在的单元。的单元。操作数:操作数:16位通用寄存器
12、;位通用寄存器;段寄存器;段寄存器;16位内存操作数(除立即数之外的位内存操作数(除立即数之外的任何寻址方式)。任何寻址方式)。00000SS:0000SS:SP堆堆栈栈段段方式:方式:(1)CPU通用寄存器入通用寄存器入/出栈,如:出栈,如:PUSHAXPOPBX(2)段寄存器入段寄存器入/出栈,出栈,如如PUSHCSPOPDS(3)存储单元入存储单元入/出栈出栈PUSHBX+DIPOP2000HPUSHAXPUSHAX指令分两步执行:指令分两步执行:1.SP-2SP2.将将AH内容送至内容送至SP+1所指单元;所指单元;3.再再将将AL内容送至内容送至SP所指单元;所指单元;例:例:MOV
13、AX,1234HPUSHAXPOPAXPOPAX指令分两步执行:指令分两步执行:1.先先将将SP所指单元内所指单元内容送至容送至AL,然后然后2.再再SP+1所指单元内所指单元内容送至容送至AH,然后然后3.SP+2SP4.例:例:MOVAX,5678HPOPAX入栈和出栈指令性用于程序保存和恢复数据,或用入栈和出栈指令性用于程序保存和恢复数据,或用于转子或中断时保护现场和恢复现场。其主要注意:于转子或中断时保护现场和恢复现场。其主要注意:(1)堆栈操作指令中,有一个操作数是隐含了的堆栈操作指令中,有一个操作数是隐含了的,这个操作数就是这个操作数就是(SP)指示的栈顶存储单元指示的栈顶存储单元
14、;(2)8086堆栈都是字操作堆栈都是字操作(3)每执行一条指令,(每执行一条指令,(SP)自动增减自动增减2(4)CS寄存器可以入栈,但不能随意弹出一个数寄存器可以入栈,但不能随意弹出一个数据到据到CS(5)在使用堆栈指令时,要按在使用堆栈指令时,要按“先进后出先进后出”原则原则来编写程序来编写程序(3)(3)交换指令交换指令交换指令交换指令XCHGOPRD1,OPRD2XCHGOPRD1,OPRD2在寄存器间或寄存器与存储器间交换信息(不允许在寄存器间或寄存器与存储器间交换信息(不允许使用段寄存器)。使用段寄存器)。源操作数:源操作数:寄存器、存储器寄存器、存储器目的操作数:寄存器、存储器
15、目的操作数:寄存器、存储器执行的操作:执行的操作:( (OPRD1)OPRD1)(OPRD2)(OPRD2)例:例:XCHGBX,BP+SI(BX)=6F30H(BP)=0200H(SI)=0046H(SS)=2F00H(2F246H)=1234H结果:结果:(BX)=1234H(2F246H)=6F30H例如:例如:XCHGAL,BL;(;(AL)与(与(BL)间进行字节交换间进行字节交换XCHG2200H,DX;(DX)与与(2200H)、(、(2201H)两两单元间的字交换单元间的字交换使用时注意:使用时注意:(1)OPR1和和OPR2不能同时为存储器操作数;不能同时为存储器操作数;(2
16、)任一个操作数都不能使用段寄存器,也不能使用立任一个操作数都不能使用段寄存器,也不能使用立即数。即数。用来对寻址机构进行控制的指令。指令传送到用来对寻址机构进行控制的指令。指令传送到16位目标寄存位目标寄存器中的是存储器操作数的地址,而不是它的内容。器中的是存储器操作数的地址,而不是它的内容。1. 1. 地址传送指令地址传送指令地址传送指令地址传送指令 LEA,LDS,LESLEA,LDS,LES把地址传送到指定寄存器。把地址传送到指定寄存器。(1)(1)LEALEA有效地址送寄存器。有效地址送寄存器。有效地址送寄存器。有效地址送寄存器。LEAREG,SRCLEAREG,SRC(REG)REG
17、)(SRC)(SRC)目的操作数目的操作数源操作数源操作数(16位通用寄存器)位通用寄存器)(内存操作数)(内存操作数)该地址常用来设置一个该地址常用来设置一个16位的寄存器作为地址指针;位的寄存器作为地址指针;该指令的执行效果与该指令的执行效果与movreg,offsetsrc相同。相同。(三)地址(三)地址目标传送指令目标传送指令例:例:LEABX,BP+SI;执行后,执行后,BX中为(中为(BP)+(SI)的值的值LEASP,0520H;执行后,使堆栈指针(执行后,使堆栈指针(SP)=0520H例:例:leabx,bxsi执行前执行前(bx)=1000h(si)=2000h执行后执行后b
18、x=1000h+2000h=3000h(2)(2)LDSLDS把源操作数指定的内存的把源操作数指定的内存的把源操作数指定的内存的把源操作数指定的内存的4 4个相继字节的内容送至指定寄存个相继字节的内容送至指定寄存个相继字节的内容送至指定寄存个相继字节的内容送至指定寄存器及器及器及器及DSDS中中中中LDSREG,SRCLDSREG,SRC(REG)(REG)(SRC)(SRC)(DS)(DS) (SRC+2)(SRC+2)目的操作数目的操作数源操作数源操作数(16位通用寄存器)(内存操作数)位通用寄存器)(内存操作数)(1)该指令完成一个该指令完成一个32位地址指针的传送;位地址指针的传送;(
19、2)该指令通常指定该指令通常指定SI作寄存器作寄存器REG。DS=1000h10100h000200200200h2000hSIDS例:例:ldsSI,100h(3)(3)LESLES把源操作数指定的内存的把源操作数指定的内存的把源操作数指定的内存的把源操作数指定的内存的4 4个相继字节的内容送至指定寄存器个相继字节的内容送至指定寄存器个相继字节的内容送至指定寄存器个相继字节的内容送至指定寄存器及及及及ESES中。中。中。中。LESREG,SRCLESREG,SRC(REG)(REG)(SRC)(SRC)(ES)(ES) (SRC+2)(SRC+2)目的操作数目的操作数源操作数源操作数(16位
20、通用寄存器)位通用寄存器)(内存操作数)(内存操作数)(1)该指令完成一个该指令完成一个32位地址指针的传送;位地址指针的传送;(2)该指令通常指定该指令通常指定DI作寄存器作寄存器REG。ES=1000h10100h000200200200h2000hDIES例:例:lesdi,100h3. 3. 累加器专用指令累加器专用指令累加器专用指令累加器专用指令 IN,OUT,XLATIN,OUT,XLAT 输入输出指令输入输出指令输入输出指令输入输出指令 PCPC机中,所有机中,所有机中,所有机中,所有I/OI/O端口与端口与端口与端口与CPUCPU之间的通信都有之间的通信都有之间的通信都有之间的
21、通信都有IN,OUTIN,OUT指令完指令完指令完指令完成。成。成。成。长格式长格式(直接方式直接方式):INAL,PORTOUTPORT,ALPORT端口地址端口地址短格式短格式(间接方式间接方式):INAX,DX;从(从(DX)和(和(DX)+1所所指的两个端口输一个字到指的两个端口输一个字到AX,低地址端低地址端口的值输口的值输入到入到AL,高地址端口的值输高地址端口的值输到到AH 1输入输入/输出(输出(I/O)指令指令输入指令输入指令长格式:长格式:INAL,PORT;将将PORT端口字节数据输入到端口字节数据输入到AL短格式:短格式:INAX,DX;从(从(DX)和(和(DX)+1
22、所指的两个端所指的两个端口输一个字到口输一个字到AX低地址端口的值输低地址端口的值输到到AL,高地址端口的值输高地址端口的值输到到AH输出指令:输出指令:长格式:长格式:OUTPORT,AL;将将AL中的中的1个字节数据输出个字节数据输出到到PORT端口端口短格式:短格式:OUTDX,AX;将将AL中低位字节输出到(中低位字节输出到(DX)所指端口,同时将所指端口,同时将AH中的高位中的高位字节输出到(字节输出到(DX)+1所指的端口所指的端口例例33:欲将:欲将12位位A/D变换器所得数字量输入。这时,变换器所得数字量输入。这时,A/D变换变换器应使用一个字端口,设为器应使用一个字端口,设为
23、20H。MOVDX,02F0HINAX,DX注意:注意:(1)指令只能用累加器指令只能用累加器AX/AL作作I/O过程机构,不能用过程机构,不能用其它寄存器;其它寄存器;(2)长格式的长格式的I/O指令端口范围为指令端口范围为0FFH。(3)运行有运行有I/O指令的程序时,若无硬件端口的支持,机指令的程序时,若无硬件端口的支持,机器将出现死锁器将出现死锁(4)在使用短格式在使用短格式I/O指令时,端口地址只能赋给指令时,端口地址只能赋给DX。(2)(2)换码指令换码指令换码指令换码指令XLATXLAT功能:功能: 将将AL指向的换码表中的一个字节的内容送到指向的换码表中的一个字节的内容送到AL
24、中。中。操作数:隐含的寄存器操作数:隐含的寄存器BX,AL操作:操作:(AL)(BX)+(AL)应先将表格的首地址送入应先将表格的首地址送入BX寄存器,将待查的值(码)放入寄存器,将待查的值(码)放入AL中,用它来表示表中某一项与表首址的距离。中,用它来表示表中某一项与表首址的距离。例例34:数字:数字0-9对应的格雷码为:对应的格雷码为:18H、34H、05H(见图)。见图)。依次放在内存以依次放在内存以TABLE开始的区域,当开始的区域,当#10端口输入一位十进制端口输入一位十进制数时,要求将其转换为相应的格雷码再输出给该端口。数时,要求将其转换为相应的格雷码再输出给该端口。MOVBX,T
25、ABLE;BX指向指向TABLE的首址的首址INAL,10;从端口从端口0AH输入待查值输入待查值XLATTABLE;查表转换查表转换OUT10,AL;查表结果输出到查表结果输出到0AH端口端口若若10端口输入值为端口输入值为7,则查表转换后输出值为,则查表转换后输出值为11H如图所示:如图所示:4.4.标志寄存器传送指令标志寄存器传送指令标志寄存器传送指令标志寄存器传送指令 (1)(1)读取标志指令读取标志指令读取标志指令读取标志指令 LAHFLAHF功能:功能:把把Flag的低字节内容装入寄存器的低字节内容装入寄存器AH中。中。操作数:隐含的操作数操作数:隐含的操作数标志寄存器标志寄存器F
26、lag,AH执行的操作:执行的操作:AHAHFlagFlag的低位字节。的低位字节。的低位字节。的低位字节。ODITSZAPCD7D6D4D2D0FlagAH(2)(2)设置标志指令设置标志指令设置标志指令设置标志指令 SAHFSAHF功能:功能:把把Ah的内容装入的内容装入Flag的低字节。的低字节。操作数:隐含的操作数标志寄存器操作数:隐含的操作数标志寄存器Flag,AH执行的操作:执行的操作:FlagFlag的低位字节的低位字节的低位字节的低位字节 AHAHODITSZAPCFlagAHD7D6D4D2D0注:该指令影响标志位注:该指令影响标志位Z、A、P、C、S(3)(3)标志寄存器入
27、栈指令标志寄存器入栈指令标志寄存器入栈指令标志寄存器入栈指令PUSHFPUSHF功能:将标志寄存器功能:将标志寄存器Flag的内容压入堆栈保存。的内容压入堆栈保存。(4)(4)标志寄存器出栈指令标志寄存器出栈指令标志寄存器出栈指令标志寄存器出栈指令POPFPOPF功能:把栈中内容弹出至标志寄存器功能:把栈中内容弹出至标志寄存器Flag。PUSHF指令将标志寄存器内容推入堆栈顶部,同时修改堆栈指指令将标志寄存器内容推入堆栈顶部,同时修改堆栈指针:针:(SP)(SP)-2。该指令执行后,标志寄存器内容不该指令执行后,标志寄存器内容不变。变。POPF指令功能正好相反。指令功能正好相反。注:该指令影响
28、标志位注:该指令影响标志位O、S、Z、A、P、C。三、算术运算指令三、算术运算指令分类分类分类分类名称名称名称名称格式格式格式格式功能功能功能功能OSZAPCOSZAPC加法指令加法指令ADDDST,SRCADDDST,SRC加法(字、字节)加法(字、字节)OSZAPCOSZAPC带进位加法指令带进位加法指令ADCDST,SRCADCDST,SRC带进位加法带进位加法(字、字节字、字节)OSZAPCOSZAPC加加1指令指令INCOPRDINCOPRD加加1(字、字节)(字、字节)OSZAPOSZAP 减法指令减法指令SUBDST,SRCSUBDST,SRC减法(字、字节)减法(字、字节)OS
29、ZAPCOSZAPC带借位减法指令带借位减法指令SBBDST,SRCSBBDST,SRC带借位减法带借位减法(字、字节字、字节)OSZAPCOSZAPC减减1指令指令DECOPRDDECOPRD减减1(字、字节)(字、字节)OSZAPOSZAP 比较指令比较指令CMPDST,SRCCMPDST,SRC比较(字、字节)比较(字、字节)OSZAPCOSZAPC求补指令求补指令NEGOPRDNEGOPRD求补码求补码OSZAPCOSZAPC无符号数乘法无符号数乘法MULSRCMULSRC不带符号数乘法不带符号数乘法(字字,字节字节)OOCC带符号数乘法带符号数乘法IMULSRCIMULSRC带符号数
30、乘法带符号数乘法(字字,字节字节)OOCC无符号数除法无符号数除法DIVSRCDIVSRC不带符号数除法不带符号数除法(字字,字节字节)带符号数乘法带符号数乘法IDIVSRCIDIVSRC带符号数除法带符号数除法(字字,字节字节)符号扩展指令符号扩展指令CBWCBW扩展扩展AL中的符号中的符号不影响不影响符号扩展指令符号扩展指令CWDCWD扩展扩展AX中的符号中的符号不影响不影响加法加法加法加法指令指令指令指令减法减法减法减法指令指令指令指令乘法乘法乘法乘法指令指令指令指令除法除法除法除法指令指令指令指令十进制调整指令十进制调整指令十进制调整指令十进制调整指令1. 1.加法指令加法指令加法指令
31、加法指令ADDDST,SRCADDDST,SRC 源操作数:通用寄存器、存储器、立即数源操作数:通用寄存器、存储器、立即数目的操作数:通用寄存器、存储器目的操作数:通用寄存器、存储器执行的操作:执行的操作:DSTDST DSTDST+SRCSRC注:该指令影响标志位注:该指令影响标志位注意:注意:注意:注意: 该指令适合有符号数和无符号数的运算。该指令适合有符号数和无符号数的运算。该指令适合有符号数和无符号数的运算。该指令适合有符号数和无符号数的运算。DST+SRCOSZAPC0010010001. 1.加法指令加法指令加法指令加法指令ADDDST,SRCADDDST,SRC 源操作数:通用寄
32、存器、存储器、立即数源操作数:通用寄存器、存储器、立即数目的操作数:通用寄存器、存储器目的操作数:通用寄存器、存储器执行的操作:执行的操作:DSTDST DSTDST+SRCSRC注:该指令影响标志位注:该指令影响标志位注意:注意:注意:注意: 该指令适合有符号数和无符号数的运算。该指令适合有符号数和无符号数的运算。该指令适合有符号数和无符号数的运算。该指令适合有符号数和无符号数的运算。DST+SRCOSZAPC001001000例例1:MOVDX,4652HADDDX,0f0f0h4652+f0f0374210100011001010010+1111000011110000001101110
33、10000111执行后:执行后:(DX)=3742Hz=0s=0c=1o=0对无符号数对无符号数溢出溢出结果错结果错对有符号数对有符号数不溢出不溢出结果正确结果正确问:问:问:问: 对带符号数和无符号数怎样判断是否溢出?对带符号数和无符号数怎样判断是否溢出?对带符号数和无符号数怎样判断是否溢出?对带符号数和无符号数怎样判断是否溢出? 有符号数的溢出用溢出标志有符号数的溢出用溢出标志o判断;判断;无符号数的溢出用进位标志无符号数的溢出用进位标志c判断。判断。 ADCDST,SRCADCDST,SRC 源操作数:通用寄存器、存储器、立即数源操作数:通用寄存器、存储器、立即数目的操作数:通用寄存器、
34、存储器目的操作数:通用寄存器、存储器执行的操作:执行的操作:DSTDST DST+SRC+CDST+SRC+C功能:功能:功能:功能: 主要用于多字节运算主要用于多字节运算主要用于多字节运算主要用于多字节运算注:该指令影响标志位注:该指令影响标志位注意:注意:注意:注意: 该指令适合有符号数和无符号数的运算。该指令适合有符号数和无符号数的运算。该指令适合有符号数和无符号数的运算。该指令适合有符号数和无符号数的运算。DST+SRC+COSZAPC001001000例例2:在内存的:在内存的First和和Secontd开始的区开始的区域中分存放着域中分存放着2F365H和和5E024H两个数,两个
35、数,要求求其和,并存入要求求其和,并存入Third中。中。2F365+5E0248D389FirstSecondThird65F3020024E00500MOVAX,FirstADDAX,SecondMOVThird,AXMOVAX,First+2ADCAX,Second+2MOVThird+2,AX2F365F365+5E024+E0248D389D38910002+0005000821FirstSecondThird65F3020024E0050089D30800 INCOPRDINCOPRD 操作数:通用寄存器、存储器操作数:通用寄存器、存储器(不能是段寄存器或立即数)不能是段寄存器或立
36、即数)执行的操作:执行的操作:OPRDOPRD OPRD+1OPRD+1 功能:功能:功能:功能: 用于在循环中修改地址指针及循环次数等。用于在循环中修改地址指针及循环次数等。用于在循环中修改地址指针及循环次数等。用于在循环中修改地址指针及循环次数等。注:该指令影响标志位注:该指令影响标志位例:例:INCCX;将将CX的内容加的内容加1后后再送回再送回CX中中注意注意注意注意: (1)(1)该指令将操作数视为无符号数;该指令将操作数视为无符号数;该指令将操作数视为无符号数;该指令将操作数视为无符号数;(2)INC指令只影响指令只影响OF、SF、ZF和和PF,而不影响而不影响进位标志进位标志进位
37、标志进位标志CF,因此不能因此不能用用INC指令进行循环计数来控制循环的结束。指令进行循环计数来控制循环的结束。OPRD+1OSZAP0010010002.2.减法指令减法指令减法指令减法指令SUBDST,SRCSUBDST,SRC 源操作数:通用寄存器、存储器、立即数源操作数:通用寄存器、存储器、立即数目的操作数:通用寄存器、存储器目的操作数:通用寄存器、存储器执行的操作执行的操作:DSTDST DST-SRCDST-SRC注:该指令影响标志位注:该指令影响标志位例如:例如:SUBAX,BX;AX内容减去内容减去BX中的内容,中的内容,结果结果放在放在AX中中注意:注意:注意:注意: 该指令
38、适合有符号数和无符号数的运算。该指令适合有符号数和无符号数的运算。该指令适合有符号数和无符号数的运算。该指令适合有符号数和无符号数的运算。DST-SRCOSZAPC001001000SBBDST,SRCSBBDST,SRC 源操作数:通用寄存器、存储器、立即数源操作数:通用寄存器、存储器、立即数目的操作数:通用寄存器、存储器目的操作数:通用寄存器、存储器执行的操作:执行的操作:DSTDST DST-SRCDST-SRCCC注:该指令影响标志位注:该指令影响标志位注意:注意:注意:注意: 该指令适合有符号数和无符号数的运算该指令适合有符号数和无符号数的运算该指令适合有符号数和无符号数的运算该指令
39、适合有符号数和无符号数的运算。同加法指令同加法指令同加法指令同加法指令有符号数的溢出用溢出标志有符号数的溢出用溢出标志有符号数的溢出用溢出标志有符号数的溢出用溢出标志 o o判断;判断;判断;判断;无符号数的溢出用进位标志无符号数的溢出用进位标志无符号数的溢出用进位标志无符号数的溢出用进位标志 c c判断判断判断判断。DSTSRC-COSZAPC001001000例:例:SUBDH,BP+4(DH)=41H(SS)=0000H(BP)=00E4H(00E8H)=5AH结果:结果:(DH)=0E7HS=1Z=0C=1O=0如果为有符号数则结果正确(无溢出)如果为有符号数则结果正确(无溢出)如果为
40、无符号数则结果错误(有溢出)如果为无符号数则结果错误(有溢出)41-5AE701000001-010110101110011111例例3:双精度数运算双精度数运算W=X+Y+24-ZXYZW65F3020024E0050089D30800MOVAX,XMOVDX,X+2ADDAX,YADCDX,Y+2;X+YADDAX,24ADCDX,0;X+Y+24SUBAX,ZSBBDX,Z+2;X+Y+24-ZMOVW,AXMOVW+2,DX;送入送入w DECOPRDDECOPRD 操作数:通用寄存器、存储器操作数:通用寄存器、存储器(不能是段寄存器或立即数)不能是段寄存器或立即数)执行的操作:执行的
41、操作:OPRDOPRD OPRD-1OPRD-1 功能:功能: 用于在循环中修改地址指针及循环次数等。用于在循环中修改地址指针及循环次数等。注:该指令影响标志位注:该指令影响标志位例:例:DECBX;将将BX的内容减的内容减1后后再送回再送回BX中中DECSI注意:注意:注意:注意:(1)(1)该指令将操作数视为无符号数;该指令将操作数视为无符号数;该指令将操作数视为无符号数;该指令将操作数视为无符号数;(2)(2)该指令不影响该指令不影响该指令不影响该指令不影响 进位标志进位标志进位标志进位标志 C COPRD-1OSZAP001001000 NEGOPRDNEGOPRD 操作数:通用寄存器
42、、存储器操作数:通用寄存器、存储器执行的操作:求补指令,将操作数按位执行的操作:求补指令,将操作数按位(连同符号位)取反后连同符号位)取反后加加1,再送回操作数。,再送回操作数。 注:该指令影响标志位注:该指令影响标志位OPRDOSZAPC001001000NEG将将src中的内容变反加中的内容变反加1。例如:若(例如:若(AL)=03H,执行执行NEGAL后,(后,(AL)=0FDH。0FDH的原码为的原码为10000011,即为,即为-3.CMPDST,SRCCMPDST,SRC源操作数:通用寄存器、存储器、立即数源操作数:通用寄存器、存储器、立即数目的操作数:通用寄存器、存储器目的操作数
43、:通用寄存器、存储器执行的操作执行的操作: DST-SRCDST-SRC注:该指令影响标志位注:该指令影响标志位注意注意注意注意:(1)(1)该指令同该指令同该指令同该指令同 SUB,SUB,但其不保存运算结果;但其不保存运算结果;但其不保存运算结果;但其不保存运算结果;(2)(2)该指令后面通常跟一条转移指令,根据标志位该指令后面通常跟一条转移指令,根据标志位该指令后面通常跟一条转移指令,根据标志位该指令后面通常跟一条转移指令,根据标志位产生不同的程序分支。产生不同的程序分支。产生不同的程序分支。产生不同的程序分支。DST-SRCOSZAPC001001000比较指令主要用于两个数之间的关系
44、:大、小、相等。比较指令主要用于两个数之间的关系:大、小、相等。比较指令主要用于两个数之间的关系:大、小、相等。比较指令主要用于两个数之间的关系:大、小、相等。如:如:A,B1.1. 比较相等。比较相等。比较相等。比较相等。只要只要看看Z标志。标志。Z=1相等相等Z=0不相等。不相等。2.2.比较大小。比较大小。比较大小。比较大小。分两种情况。分两种情况。 无符号数无符号数无符号数无符号数看进(借)位看进(借)位C标志。标志。C=1,有借位,则有借位,则ABA=A0H10100000A=53H01010011B=53H01010011B=A0H101000000100110100110011A
45、BABS=1ABS=0ABS=1ABOS=1AB(详细述述见(详细述述见P106)8088中有几条用于判断有符号数大小的转移指令,如:中有几条用于判断有符号数大小的转移指令,如:JG/JNLE大于则转移大于则转移条件为:条件为:OS=0且且Z=0JL/JNGE小于则转移小于则转移条件为:条件为:OS=1同样有几条用于判断无符号数大小的转移指令,如:同样有几条用于判断无符号数大小的转移指令,如:JA/JNBE高于则转移高于则转移条件为:条件为:C=0且且Z=0JBE/JNA低于或等于则转移低于或等于则转移条件为:条件为:C=1或或Z=1例例4:比较两个无符号数的大小,并将大数存:比较两个无符号数
46、的大小,并将大数存入入AL中。中。XY65F3020024E0050089D30800结果结果结果结果AL=F3MOVAL,XMOVBL,YCMPAL,BL;AL-BLJNCNEXT;当当CF=0,转移转移XCHGAL,BLNEXT:HLT例例5:比较两个带符号数的大小,并将大数存:比较两个带符号数的大小,并将大数存入入AL中。中。XY65F3020024E0050089D30800结果结果AL=65MOVAL,XMOVBL,YCMPAL,BLJGNEXT;大于则转移大于则转移XCHGAL,BLNEXT:HLT例例6:若自:若自Block开始的内存中有开始的内存中有100个带符号数,找出最大值
47、存个带符号数,找出最大值存入入Max单元。单元。Block65F3020024E00500MOVBX,OffsetBlockMOVAX,BXINCBXINCBXMOVCX,100Again:CMPAX,BXJGNEXTMOVAX,BXNext:INCBXINCBXDECCXJNZAgainMOVMAX,AXHLTMax例例7:在分别由:在分别由Data1和和Data2开始的两个开始的两个内存区域中,分别存放着内存区域中,分别存放着5个个1字节字节的无符号数,如果的无符号数,如果Data1中的第中的第N个个数大于数大于Data2中的第中的第N个数,则进行个数,则进行Data1NData2N运算,
48、否则运算,否则进行进行Data1N+Data2N运算,运算,运算结果存回运算结果存回Data1中中Data1Data265F3020024E0050089D3LEASI,Data1LEADI,Data2MOVCX,100Again:MOVAL,SICMPAL,DIJCAdddatSUBAL,DIJMPNextAdddat:ADDAL,DINext:MOVSI,ALINCSIINCDIDECCXJNZAgainHLTData1Data265F3020024E0050089D33.3.乘法指令乘法指令乘法指令乘法指令MULSRCMULSRC无符号数无符号数乘法乘法 源操作数:通用寄存器、存储器(不
49、能是立即数)源操作数:通用寄存器、存储器(不能是立即数)目的操作数:目的操作数:DX,AX(隐含)隐含)执行的操作:执行的操作:字节操作字节操作(AH,AL)(AL) (SRC)字操作字操作(DX,AX)(AX) (SRC)注:该指令影响标志位注:该指令影响标志位AL SRCOC001001000注意:若结果的高半部分(字节注意:若结果的高半部分(字节注意:若结果的高半部分(字节注意:若结果的高半部分(字节 相乘为相乘为相乘为相乘为AH,AH,字相乘为字相乘为字相乘为字相乘为DXDX)为为为为0 0则则则则 C=0C=0,O=0O=0为为为为1 1则则则则 C=1C=1,O=1O=1例如:例如
50、:MULBL;AL中和中和BL中的中的8位数相乘,乘积位数相乘,乘积在在AX中中MULWORDPTRSI;AX中和(中和(SI)所指所指的字单元中的的字单元中的16位数相乘,乘积在位数相乘,乘积在DX和和AX中中 IMULSRCIMULSRC带符号数乘法带符号数乘法 源操作数:通用寄存器、存储器(不能是立即数)源操作数:通用寄存器、存储器(不能是立即数)目的操作数:目的操作数:DX,AX(隐含)隐含)执行的操作:字节操作执行的操作:字节操作(AH,AL)(AL) (SRC)字操作字操作(DX,AX)(AX) (SRC)注:该指令影响标志位注:该指令影响标志位AL SRCOC001001000注
51、意:若结果的高半部分不是低半部分的符号扩展的话,则注意:若结果的高半部分不是低半部分的符号扩展的话,则注意:若结果的高半部分不是低半部分的符号扩展的话,则注意:若结果的高半部分不是低半部分的符号扩展的话,则 C=1C=1,O=1O=1否则否则否则否则 C=0C=0,O=0O=0符号扩展:符号扩展:从从8位扩展到位扩展到16位位 20H+20H0010,00000000,0000,0010,0000-20H1111,11101111,1111,1111,1110符号位符号位例:例:IMULCX;AX中和中和CX中的中的16位带符号数位带符号数相乘,乘积在相乘,乘积在DX和和AX中中IMULBYT
52、EPTRBX;AL中和(中和(BX)所指的存储单元中的所指的存储单元中的8位带符号数相乘,位带符号数相乘,结果在结果在AX中中4.4.除法指令除法指令除法指令除法指令 8086执行除法运算时,规定被除数必为除数的双倍执行除法运算时,规定被除数必为除数的双倍字长;除法有两个操作数,其中被除数固定在字长;除法有两个操作数,其中被除数固定在AX中或中或DX中。中。DIVSRCDIVSRC无符号数除法无符号数除法IDIVSRCIDIVSRC带符号数除法带符号数除法 源操作数:通用寄存器、存储器源操作数:通用寄存器、存储器(不能是立即数)(不能是立即数)目的操作数:目的操作数:DX,AX(隐含)隐含)执
53、行的操作:执行的操作:字节操作字节操作(AL)(AX)/(SRC)商商(AH)(AX)/(SRC)余数余数字操作字操作(AX)(DX,AX)/(SRC)商商(DX)(DX,AX)/(SRC)余数余数注:该指令对各标志位均无定义注:该指令对各标志位均无定义。注意:注意:注意:注意:SRCSRC的类型决定是字或字节相除。的类型决定是字或字节相除。的类型决定是字或字节相除。的类型决定是字或字节相除。使用除法指令,注意:使用除法指令,注意:(1)除法运算后,标志位)除法运算后,标志位AF、ZF、PF、SF、PF和和CF都是不确定的都是不确定的(2)用)用IDIV指令时,如果超出带符号数的表示范围,指令
54、时,如果超出带符号数的表示范围,则产生错误则产生错误(3)8086指令规定:余数的符号和被除数相同;指令规定:余数的符号和被除数相同;(4)如果被除数没有除数的双倍字长,则要进行符号)如果被除数没有除数的双倍字长,则要进行符号位的扩展。位的扩展。例如:例如:IDIVCX;将(将(DX)和(和(AX)中中32位数除以(位数除以(CX)中的中的16位数,商在位数,商在AX中,余数在中,余数在DX中中例如:例如:DIVBYTEPTRDI;将(将(AX)中的中的16位数除以位数除以(DI)所指的所指的8位数,商在位数,商在AL中,中,余数在余数在AH中中符号扩展指令:用于带符号数的扩展符号扩展指令:用
55、于带符号数的扩展符号扩展指令:用于带符号数的扩展符号扩展指令:用于带符号数的扩展 将将将将字节扩展成字的指令:字节扩展成字的指令:字节扩展成字的指令:字节扩展成字的指令:CBWCBW 扩展扩展AL寄存器中数据的符号,并将其存入寄存器中数据的符号,并将其存入AH寄存器中。寄存器中。若若AL=80H则则扩展后扩展后AH=FFH将字扩展成双字的指令:将字扩展成双字的指令:将字扩展成双字的指令:将字扩展成双字的指令:CWDCWD扩展扩展AX寄存器中数据的符号,并将其存入寄存器中数据的符号,并将其存入DX寄存器中。寄存器中。若若AX=8000H则则扩展后扩展后DX=FFFFH注:该指令不影响标志位注:该
56、指令不影响标志位。例例3-13:编写:编写45ABH2132H的程序段。设被的程序段。设被除数、除数分别按低字节在前除数、除数分别按低字节在前,高字节在后存高字节在后存放在数据段中放在数据段中,其起始地址为其起始地址为BUFFER,并在其并在其后保留后保留4个字节以存放商和余数。个字节以存放商和余数。MOVBX,OFFSETBUFFERMOVAX,BXCWD;对对被除数进行符号扩展被除数进行符号扩展IDIV2BXMOV4BX,AX;商放在商放在AX中中MOV6BX,DX;余数放在余数放在DX中中若若相除的相除的两数为无两数为无符号数,则被除数扩展应符号数,则被除数扩展应使用指令:使用指令:MO
57、VDX,0。BUFFERAB453221例例9:计算计算w=(v-(x y+z-540)/xx、y、z、v均为均为16位带符号数,位带符号数,分别存放在分别存放在X、Y、Z、V单元单元中,求结果并送入中,求结果并送入W单元中。单元中。XYZVW65F3020024E00500MOVAX,XIMULY;结果在结果在(DX,AX)中中MOVCX,AXMOVBX,DXMOVAX,ZCWD;CWD将将AX中的字扩展成双字,结果(中的字扩展成双字,结果(DX,AX)中中ADDCX,AXADCBX,DXSUBCX,540SBBBX,0MOVAX,VCWDSUBAX,CXSBBDX,BXIDIVXMOVW,
58、AXMOVW+2,DXw=(v-(x y+z-540)/x5.5.十进制调整指令十进制调整指令十进制调整指令十进制调整指令前面提到的所有运算指令都是二进制数的运算指令,怎样得前面提到的所有运算指令都是二进制数的运算指令,怎样得到十进制的运算结果呢?到十进制的运算结果呢?8088提供了一套十进制调整指令。提供了一套十进制调整指令。十进制数的表示:十进制数的表示:十进制数的表示:十进制数的表示:BCD码码用二进制编码的十进制数。用二进制编码的十进制数。压缩压缩00000001001000110100010101100111100010010123456789非压缩非压缩UUUU0000UUUU00
59、01UUUU0010UUUU10010129调整指令调整指令调整指令调整指令加法:加法: DAADAA压缩的压缩的BCD码加法十进制调整指令。码加法十进制调整指令。 AAAAAA非压缩的非压缩的BCD码加法十进制调整指令。码加法十进制调整指令。减法:减法:DASDAS压缩的压缩的BCD码码减法十进制调整指令。减法十进制调整指令。AASAAS非压缩的非压缩的BCD码减法十进制调整指令。码减法十进制调整指令。乘法:乘法:AAMAAM非压缩的非压缩的BCD码乘法十进制调整指令。码乘法十进制调整指令。除法:除法:AADAAD非压缩的非压缩的BCD码除法十进制调整指令。码除法十进制调整指令。(1)组合十
60、进制加法调整指令)组合十进制加法调整指令DAADAA指令用于对组合指令用于对组合BCD码相加的结果进行调整,使码相加的结果进行调整,使结果仍为组合的结果仍为组合的BCD码。码。DAA指令应紧跟在加法指令之后,执行时,先对相加指令应紧跟在加法指令之后,执行时,先对相加结果进行测试,结果进行测试,若结果的低若结果的低4位(或高位(或高4位)二进制大于位)二进制大于9(非法码)或大于(非法码)或大于15(即产生进位(即产生进位CF或辅助进位或辅助进位AF)时时,DAA自动对低自动对低4位(或高位(或高4位)结果进行加位)结果进行加6的调整。的调整。调整在调整在AL中进行,结果放在中进行,结果放在AL
61、中。中。例如:两个十进制数例如:两个十进制数89+75的正确结果应为的正确结果应为164,可是,相,可是,相加运算后的结果为加运算后的结果为FEH,要进行以下调整:要进行以下调整:89=1000100175=01110101+1111111001100110=FEH+= 164011001001例:例:MOVAX,06MOVBX,07ADDAX,BX;AX=0DHDAA;执行后执行后AX=13H(2)非组合十进制数加法调整指令)非组合十进制数加法调整指令AAAAAA指令用于对非组合指令用于对非组合BCD码相加结果进行调整,指令码相加结果进行调整,指令的操作如下:的操作如下:若(若(AL)&0F
62、H9,或或AF=1则则(AL)(AL)+6(AF)1(CF)(AF)(AH)(AH)+1(AX)(AL)&0FH例如:两个非组合的十进制数例如:两个非组合的十进制数06+07,结果应为非组合,结果应为非组合的十进制数的十进制数0103,其操作过程如下:,其操作过程如下:0000011000000111000011010001001100000000000000010000111100000011011011&00000001=AX0103+ALAFAH=+06070DH;非组合非组合BCD;不是非不是非组合组合BCD;调整调整;组合;组合BCD;再调整;再调整AF1;AHAH+1;AL&0FH
63、;结果送结果送AX中中程序为:程序为:MOVAX,06MOVBX,07ADDAX,BX;AX=0DHAAA;执行后执行后AX=0103H(3)组合十进制数减法调整指令)组合十进制数减法调整指令DASDAS指令对组合指令对组合BCD码相减结果进行调整,紧跟在减法指码相减结果进行调整,紧跟在减法指令之后,调整后的结果仍为组合令之后,调整后的结果仍为组合BCD码,码,DAS对结果是进对结果是进行行-6调整。调整。例:例:SUBAL,BHDAS执行指令前,执行指令前,AL=86H,BH=07H执行执行SUB指令后,指令后,AL=7FH,CF=0,AF=1执行执行DAS指令后指令后,因因AF=1,需进行
64、调整。需进行调整。AL=AL-6=7FH-6=79H。CF=0,AF=1。结果调整为结果调整为79的压缩的压缩BCD码。码。(4)非组合十进制数减法调整指令)非组合十进制数减法调整指令AASAAS与与AAA类似,但有两点不同:类似,但有两点不同:(1)AAA指令中的(指令中的(AL)(AL)+6操作对应操作对应AAS中则应改为(中则应改为(AL)(AL)-6;(2)AAA指令中的(指令中的(AH)(AH)+1操作对操作对应应AAS中则应改为(中则应改为(AH)(AH)-1;(5)非组合十进制数乘法调整指令)非组合十进制数乘法调整指令AAM调整后的结果仍为一个正确的非组合调整后的结果仍为一个正确
65、的非组合BCD码,放回码,放回AX中。中。例如:实现例如:实现0809=0702的程序为:的程序为:MOVAL,08MOVBL,09MULBL;(;(AL)(BL)(AX)AAM;结果结果(AX)=0702(6)非组合十进制除法调整指令)非组合十进制除法调整指令AAD除法调整指令除法调整指令AAD应放在除法指令之前,先将应放在除法指令之前,先将AX中的中的非组合非组合BCD码的被除数调整为二进制数,再进行相除。码的被除数调整为二进制数,再进行相除。例如:要实现例如:要实现010306=02余余01,程序如下:,程序如下:MOVAX,0103;取被除数取被除数MOVBL,06;取除数取除数AAD
66、DIVBL;相除,得(相除,得(AL)=02,(,(AH)=1四、逻辑运算指四、逻辑运算指令令分类分类分类分类名称名称名称名称格式格式格式格式功能功能功能功能OSZAPCOSZAPC逻辑与指令逻辑与指令ANDDST,SRCANDDST,SRC与(字、字节)与(字、字节)OSZOSZ PCPC逻辑或指令逻辑或指令ORDST,SRCORDST,SRC或(字、字节)或(字、字节)OSZOSZ PCPC逻辑非指令逻辑非指令NOTOPRDNOTOPRD非(字、字节)非(字、字节)不影响不影响逻辑异或指令逻辑异或指令XORDST,SRCXORDST,SRC异或(字、字节)异或(字、字节)OSZOSZ PC
67、PC测试指令测试指令TESTDST,SRCTESTDST,SRC测试(字、字节)测试(字、字节)OSZOSZ PCPC逻辑左移指令逻辑左移指令SHLOPRD,COUNTSHLOPRD,COUNT逻辑左移逻辑左移(字、字节)字、字节)OSZOSZ PCPC算术左移指令算术左移指令SALOPRD,COUNTSALOPRD,COUNT算术左移(字、字节)算术左移(字、字节)OSZOSZ PCPC逻辑右移指令逻辑右移指令SHROPRD,COUNTSHROPRD,COUNT逻辑右移(字、字节)逻辑右移(字、字节)OSZPCOSZPC算术右移移指令算术右移移指令SAROPRD,COUNTSAROPRD,C
68、OUNT算术右移(字、字节)算术右移(字、字节)OSZPCOSZPC循环左移指令循环左移指令ROLOPRD,COUNTROLOPRD,COUNT循环左移循环左移(字字,字节字节)OOCC循环右移指令循环右移指令ROROPRD,COUNTROROPRD,COUNT循环右移循环右移(字字,字节字节)OOCC带进位循环左移指令带进位循环左移指令RCLOPRD,COUNTRCLOPRD,COUNT带进位循环左移带进位循环左移(字字,字节字节)OOCC带进位循环右移指令带进位循环右移指令RCROPRD,COUNTRCROPRD,COUNT带进位循环右移带进位循环右移(字字,字节字节)OOCC逻辑逻辑逻辑
69、逻辑运算运算运算运算指令指令指令指令移位移位移位移位指令指令指令指令循环循环循环循环移位移位移位移位指令指令指令指令1.1.逻辑运算指令逻辑运算指令逻辑运算指令逻辑运算指令 ANDDST,SRCANDDST,SRC逻辑与逻辑与 源操作数:通用寄存器、存储器、立即数源操作数:通用寄存器、存储器、立即数目的操作数:通用寄存器、存储器目的操作数:通用寄存器、存储器执行的操作:执行的操作:DSTDST DSTandSRCDSTandSRC功能:功能:功能:功能: 实现两个操作数的按位与运算。实现两个操作数的按位与运算。实现两个操作数的按位与运算。实现两个操作数的按位与运算。注:该指令影响标志位注:该指
70、令影响标志位使使O=0,C=0,P,S,Z反映操作的结果。反映操作的结果。DSTSRCOSZPC001001000例例1:屏蔽:屏蔽AL寄存器的低四位。寄存器的低四位。MOVAL,FF11111111ANDAL,F01111000011110000例例2:屏蔽:屏蔽AL寄存器的高两位。寄存器的高两位。MOVAL,FF11111111ANDAL,3F0011111100111111使使一立一立即即数数的该位为的该位为0即可即可使使一一立立即即数的数的该位为该位为0即可即可ANDAND通常用于使某些位置通常用于使某些位置通常用于使某些位置通常用于使某些位置0 0,其它位不变的情况。,其它位不变的情
71、况。,其它位不变的情况。,其它位不变的情况。 ORDST,SRCORDST,SRC逻辑或逻辑或 源操作数:通用寄存器、存储器、立即数源操作数:通用寄存器、存储器、立即数目的操作数:通用寄存器、存储器目的操作数:通用寄存器、存储器执行的操作:执行的操作:DSTDST DSTorSRCDSTorSRC功能:功能:功能:功能: 实现两个操作数的按位或运算。实现两个操作数的按位或运算。实现两个操作数的按位或运算。实现两个操作数的按位或运算。注:该指令影响标志位注:该指令影响标志位使使O=0,C=0,P,S,Z反映操作的结果。反映操作的结果。DSTSRCOSZPC001001000例例3:使某数的第:使
72、某数的第4、5位置位置1。MOVAL,03H00000011ORAL,30H0011000000110011使使一立一立即即数数的该位为的该位为1即可即可OROR指令通常用于指令通常用于指令通常用于指令通常用于将某些位置将某些位置将某些位置将某些位置1 1XORDST,SRCXORDST,SRC异或异或 源操作数:通用寄存器、存储器、立即数源操作数:通用寄存器、存储器、立即数目的操作数:通用寄存器、存储器目的操作数:通用寄存器、存储器执行的操作:执行的操作:DSTDST DSTDSTxorxorSRCSRC功能:功能:功能:功能: 实现两个操作数的按位异或运算。实现两个操作数的按位异或运算。实
73、现两个操作数的按位异或运算。实现两个操作数的按位异或运算。注:该指令影响标志位注:该指令影响标志位使使O=0,C=0,P,S,Z反映操作的结果。反映操作的结果。DSTSRCOSZPC001001000例例6:使某数的:使某数的D1、D0位取反,其它位不变。位取反,其它位不变。MOVAL,11H00010001XORAL,03H 0000001100010010 例例7:测试:测试AX中的数与中的数与42H是否相同,相同则转移。是否相同,相同则转移。XORAX,0042HJZNextNext:MOVBX,30H例例8:给某寄存器清给某寄存器清0。XORAX,AXAX=0结果结果给寄存器给寄存器给
74、寄存器给寄存器 清清清清 0 0测试两操作数测试两操作数测试两操作数测试两操作数是否相等是否相等是否相等是否相等使一操作数使一操作数使一操作数使一操作数若干位维持不变,若干位维持不变,若干位维持不变,若干位维持不变,若干位取反若干位取反若干位取反若干位取反使使一立一立即即数数的相应位为的相应位为1即可即可 TESTDST,SRCTESTDST,SRC测试测试 源操作数:通用寄存器、存储器、立即数源操作数:通用寄存器、存储器、立即数目的操作数:通用寄存器、存储器目的操作数:通用寄存器、存储器执行的操作:执行的操作:DSTandSRCDSTandSRC功能:功能:功能:功能: 实现两个操作数的按位
75、与实现两个操作数的按位与实现两个操作数的按位与实现两个操作数的按位与 运算,结果不保存,只影运算,结果不保存,只影运算,结果不保存,只影运算,结果不保存,只影响标志位。响标志位。响标志位。响标志位。注:该指令影响标志位注:该指令影响标志位使使O=0,C=0,P,S,Z反映操作的结果。反映操作的结果。DSTSRCOSZPC001001000例例4:检测:检测AL中的最低位是否位中的最低位是否位1,若为,若为1则转移则转移。MOVAL,41H01000001TESTAL,01H00000001JNZNext00000001Next:MOVBL,0TESTTEST通常用于检测一些条件是否满通常用于检
76、测一些条件是否满通常用于检测一些条件是否满通常用于检测一些条件是否满足,但又不希望改变原来操作数的情况,足,但又不希望改变原来操作数的情况,足,但又不希望改变原来操作数的情况,足,但又不希望改变原来操作数的情况,该指令后通常带有条件转移指令。该指令后通常带有条件转移指令。该指令后通常带有条件转移指令。该指令后通常带有条件转移指令。例例5:检测:检测CX内容是否为内容是否为0,为,为0则转移。则转移。TESTCX,0FFFFHJZNextNext:MOVAX,1CMPCX,0JZNextNext:MOVAX,1NOTOPRDNOTOPRD 逻辑非逻辑非 操作数:通用寄存器、存储器操作数:通用寄存
77、器、存储器执行的操作:执行的操作:OPRDOPRDnotnotOPRDOPRD功能:功能:功能:功能: 实现操作数的按位取反运算。实现操作数的按位取反运算。实现操作数的按位取反运算。实现操作数的按位取反运算。注:该指令不影响标志位。注:该指令不影响标志位。例如:例如:NOTALNOTBX2.2.移位指令移位指令移位指令移位指令 SALOPRD,CNTSALOPRD,CNT 算术左移算术左移SHLOPRD,CNTSHLOPRD,CNT 逻辑左移逻辑左移 操作数:通用寄存器、存储器操作数:通用寄存器、存储器CNT:移位次数,当移位次数,当CNT1时,应将其赋给时,应将其赋给CL寄存器寄存器执行的操
78、作执行的操作:注:该指令影响标志位注:该指令影响标志位C,S,Z,P视结果而定;视结果而定;移位后当最高有效位发生变化时移位后当最高有效位发生变化时(如如1变变0)O=1,否则否则O=0。OPRDOSZPC001001000C COPRDOPRD0 0例例1:某数:某数10MOVAL,XMOVBL,10MULBLMOVAL,XSHLAL,1;X*2MOVBL,AL;BL=X*2SHLAL,1;X*4SHLAL,1;X*8ADDAL,BL;X*8+X*2=X*10时钟数时钟数447078时钟数时钟数42222315移位前移位前00000100=4H移位后移位后00001000=8H SHROPR
79、D,CNTSHROPRD,CNT逻辑右移逻辑右移 操作数:通用寄存器、存储器操作数:通用寄存器、存储器CNT:移位次数,当移位次数,当CNT1时,应将其赋给时,应将其赋给CL寄存器寄存器执行的操作:执行的操作:注:该指令影响标志位注:该指令影响标志位C,S,Z,P视结果而定;视结果而定;O只当只当CNT=1时时有效,有效,移位后当最高有效位发生变化时移位后当最高有效位发生变化时(如如1变变0)O=1,否则否则O=0。OPRDOSZPC001001000C COPRDOPRD0 0 SAROPRD,CNTSAROPRD,CNT 算术右移算术右移 操作数:通用寄存器、存储器操作数:通用寄存器、存储
80、器CNT:移位次数,当移位次数,当CNT1时,应将其赋给时,应将其赋给CL寄存器寄存器执行的操作:执行的操作:注:该指令影响标志位注:该指令影响标志位C,S,Z,P视结果而定;视结果而定;O只当只当CNT=1时时有效,有效,移位后当最高有效位发生变化时移位后当最高有效位发生变化时(如如1变变0)O=1,否则否则O=0。OPRDOSZPC001001000C COPRDOPRD例例2:将:将F0H除以除以2。MOVAL,F0H1111,0000F0H=(-10H)=-16DSARAL,11111,1000F8H=(-8H)=-8DMOVAL,F0H1111,0000F0H=240DSHRAL,1
81、0111,100078H=120D无符号无符号带符号带符号移位指令的作用:移位指令的作用:移位指令的作用:移位指令的作用:移位指令通常用来做移位指令通常用来做移位指令通常用来做移位指令通常用来做 乘乘乘乘2 2或或或或 除除除除2 2的操作:的操作:的操作:的操作:左移一位左移一位左移一位左移一位操作数操作数操作数操作数2;2;右移一位右移一位右移一位右移一位操作数操作数操作数操作数22 算术移位指令适用于带符号数的运算。算术移位指令适用于带符号数的运算。算术移位指令适用于带符号数的运算。算术移位指令适用于带符号数的运算。 逻辑移位指令适用于无符号数的运算。逻辑移位指令适用于无符号数的运算。逻
82、辑移位指令适用于无符号数的运算。逻辑移位指令适用于无符号数的运算。例例2-2:将:将带符号数带符号数89H乘以乘以2。MOVAL,89H1000,100189H=(-77H)=-119DSHLAL,10001,001012H=(12H)=18D例例2-3:将:将带符号数带符号数F0H乘以乘以2。MOVAL,F0H1111,0000F0H=(-10H)=-16DSHLAL,11110,0000E0H=(-20H)=-32D带符号带符号带符号带符号带符号数的运算结果的正确与否看溢出位,带符号数的运算结果的正确与否看溢出位,O=1溢出,结果错溢出,结果错;O=0不不溢出,结果正确。溢出,结果正确。无
83、符号数的运算结果的正确与否看进位位,无符号数的运算结果的正确与否看进位位,C=1有进位,结果错有进位,结果错;C=0无进位,结果正确。无进位,结果正确。例例3:请求出:请求出AL中中“1”的的个数,存在个数,存在AH中。中。MOVAH,0Again:SHLAL,1ADCAH,0CMPAL,0JNZAGAINHLTMOVAH,0MOVCL,8Again:SHLAL,1JNCNextINCAHNext:DECCLJNZAgainHLT3.3.循环移位指令循环移位指令循环移位指令循环移位指令ROLOPRD,CNTROLOPRD,CNT循环左移循环左移 操作数:通用寄存器、存储器操作数:通用寄存器、存
84、储器CNT:移位次数,当移位次数,当CNT1时,应将其赋给时,应将其赋给CL寄存器寄存器执行的操作:执行的操作:注:该指令影响标志位注:该指令影响标志位C视结果而定;视结果而定;O只当只当CNT=1时时有效,有效,移位后当最高有效位发生变化时移位后当最高有效位发生变化时(如如1变变0)O=1,否则否则O=0。OPRDOC001001000C COPRDOPRDROROPRD,CNTROROPRD,CNT循环右移循环右移 操作数:通用寄存器、存储器操作数:通用寄存器、存储器CNT:移位次数,当移位次数,当CNT1时,应将其赋给时,应将其赋给CL寄存器寄存器执行的操作:执行的操作:注:该指令影响标
85、志位注:该指令影响标志位C视结果而定;视结果而定;O只当只当CNT=1时时有效,有效,移位后当最高有效位发生变化时移位后当最高有效位发生变化时(如如1变变0)O=1,否则否则O=0。OPRDOC001001000C COPRDOPRDRCLOPRD,CNTRCLOPRD,CNT带进位的循环左移带进位的循环左移 操作数:通用寄存器、存储器操作数:通用寄存器、存储器CNT:移位次数,当移位次数,当CNT1时,应将其赋给时,应将其赋给CL寄存器寄存器执行的操作:执行的操作:注:该指令影响标志位注:该指令影响标志位C视结果而定;视结果而定;O只当只当CNT=1时时有效,有效,移位后当最高有效位发生变化
86、时移位后当最高有效位发生变化时(如如1变变0)O=1,否则否则O=0。OPRDOC001001000C COPRDOPRDRCROPRD,CNTRCROPRD,CNT带进位的循环右移带进位的循环右移 操作数:通用寄存器、存储器操作数:通用寄存器、存储器CNT:移位次数,当移位次数,当CNT1时,应将其赋给时,应将其赋给CL寄存器寄存器执行的操作:执行的操作:注:该指令影响标志位注:该指令影响标志位C视结果而定;视结果而定;O只当只当CNT=1时时有效,有效,移位后当最高有效位发生变化时移位后当最高有效位发生变化时(如如1变变0)O=1,否则否则O=0。OPRDOC001001000C COPR
87、DOPRDDXAXMOVCL,4SHLDX,CLMOVBL,AHSHLAX,CLSHRBL,CLORDL,BL00000000例例4:实现:实现32位数的移位,要求左移位数的移位,要求左移4位。位。DHDLAHALBL0000DXAXBL0000BL0000DLDL方法方法1MOVCL,4Again:SHLAX,1RCLDX,1DECCLJNZAgainAXDXCC方法方法2循环移位指令的作用:循环移位指令的作用:循环移位指令的作用:循环移位指令的作用:循环移位指令可以改变操作数循环移位指令可以改变操作数循环移位指令可以改变操作数循环移位指令可以改变操作数 中所有位的位置中所有位的位置中所有位
88、的位置中所有位的位置例例5:在内存某一缓冲区中,在内存某一缓冲区中,存放着若干用存放着若干用BCD码表码表示的十进制数,每一个示的十进制数,每一个单元中存放两位,要求单元中存放两位,要求将它们转换成将它们转换成ASC码,码,存放在缓冲区,高存放在缓冲区,高4位位的的BCD码转换的码转换的ASC码码放在地址较高的单元。放在地址较高的单元。BCDBUFASCBUF6523020024353633323230综合例题综合例题综合例题综合例题开始开始设地址设地址设转换个数设转换个数转换低转换低4位位取数取数存结果存结果转换高转换高4位位存结果存结果CX-1-CXCX=0?结束结束流程图流程图流程图流程
89、图MOVSI,OffsetBCDBUFMOVDI,OffsetASCBUFMOVCH,CountAgain:MOVAL,SIINCSIMOVBL,ALANDAL,0FHORAL,30HMOVDI,ALINCDIMOVAL,BL;0110,0101MOVCL,4SHRAL,CL;0000,0110ORAL,30H;0011,0110MOVDI,ALINCDIDECCHJNZAgainHLTBCDBUFASCBUF6523020024353633323230011001010000010100001111001100000000010100110101SIDI五、串操作指令五、串操作指令串传送指令
90、串传送指令串传送指令串传送指令串比较指令串比较指令串比较指令串比较指令串扫描指令串扫描指令串扫描指令串扫描指令从串取指令从串取指令从串取指令从串取指令存入串指令存入串指令存入串指令存入串指令重复前缀重复前缀重复前缀重复前缀MOVSBMOVSW字节传送字节传送字传送字传送控制标志控制标志控制标志控制标志D DCMPSBCMPSW字节串比较字节串比较字串比较字串比较SCASBSCASW字节串扫描字节串扫描字串扫描字串扫描STOSBSTOSW字节串存入字节串存入字串存入字串存入LODSBLODSW取字节串取字节串取字串取字串REPREPE/REPZREPNE/REPNZ无条件重复无条件重复当相等当相
91、等/为零重复为零重复当不相等当不相等/不为零重复不为零重复分类分类分类分类指令指令指令指令功能功能功能功能设置设置D设置设置D设置设置D设置设置D设置设置D1.1.串传送指令串传送指令串传送指令串传送指令名称名称格式格式功能功能状态标志状态标志控制标志控制标志OSZAPCDIT字节串传送指令字节串传送指令字串传送指令字串传送指令重复前缀重复前缀MOVSBMOVSWREP字节串传送字节串传送字串传送字串传送无条件重复无条件重复不影响不影响不影响不影响不影响不影响设置设置D设置设置DD为方向为方向标志(标志(DirectionFlag)D=1,串操作时地址自动减量串操作时地址自动减量,指令指令ST
92、DD=0,串操作时地址自动增量。串操作时地址自动增量。指令指令CLDMOVSBMOVSB执行的操作:执行的操作:DISI(SI)(SI) 1(DI)(DI) 1MOVSWMOVSW执行的操作:执行的操作:DISI(SI)(SI) 2(DI)(DI) 2作用:作用:将将SI指向的数据段中的一个字(字节)传送到指向的数据段中的一个字(字节)传送到DI指向的附加段,指向的附加段,并自动修改并自动修改SI、DI的内容,使其指向下一个单元。的内容,使其指向下一个单元。注意:注意:该指令指定用该指令指定用SI、DI,且规定且规定SI指向数据段,指向数据段,DI指向附加段。指向附加段。REPREP作用:作用
93、:与与与与MOVSBMOVSB、MOVSWMOVSW 配合使用,将数据段中的一串数据传送到配合使用,将数据段中的一串数据传送到配合使用,将数据段中的一串数据传送到配合使用,将数据段中的一串数据传送到附加段附加段附加段附加段。执行的操作:执行的操作:重复重复重复重复 MOVSBMOVSB或或或或 MOVSWMOVSW的操作,直到的操作,直到的操作,直到的操作,直到 CX=0CX=0。CX=0?CX-1CXMOVSREPMOVSREPMOVSY YN N例例1:将数据段中起始地址将数据段中起始地址为为Souce的的100个字节个字节的数据传送到附加段的数据传送到附加段的的Dest指向的单元中。指向
94、的单元中。LEASI,SouceLEADI,DestMOVCX,100CLDAgain:MOVSBDECCXJNZAgainHLT23D005AB92SouceDest增址传增址传送送23D005SIDISIDISI+1SIDI+1DIDSESLEASI,Souce+99LEADI,Dest+99MOVCX,50STDAgain:MOVSWDECCXJNZAgainHLT减址传送减址传送23D005AB92Souce+99Dest+99AB92例例1-1:字传送字传送SIDISIDISI-2SIDI-2DI例例2:与:与REP指令配合传送指令配合传送100个数个数。LEASI,SouceLEA
95、DI,DestMOVCX,100CLDAgain:MOVSWDECCXJNZAgainHLTLEASI,SouceLEADI,DestMOVCX,100CLDREPMOVSWHLTCX不为不为0时重复执行时重复执行判判CX=0?是,传送完毕;是,传送完毕;否,否,进行进行CX1CX执行执行REP后的串操作。后的串操作。重复重复23D005AB92SouceDest23D005ABSIDI2.2.串比较指令串比较指令串比较指令串比较指令名称名称格式格式功能功能状态标志状态标志控制标志控制标志OSZAPCDIT字节串比较指令字节串比较指令字串比较指令字串比较指令重复前缀重复前缀CMPSBCMPSW
96、REP*REPE/REPZREPNE/REPNZ字节串比较字节串比较字串比较字串比较无条件重复无条件重复当相等当相等/为零为零重复重复当不相等当不相等/不为零不为零重复重复不影响不影响不影响不影响不影响不影响设置设置D设置设置DREPE和和REPZ是是同一条指令的两种不同表示形式。同一条指令的两种不同表示形式。REPNE和和REPNZ是同一条指令的两种不同表示形式。是同一条指令的两种不同表示形式。OSZAPCOSZAPCOSZAPCOSZAPC*可以执行,可以执行,但无意义!但无意义!CMPSBCMPSB执行的操作:执行的操作:DI SI(Flag)(SI)(SI) 1(DI)(DI) 1CM
97、PSWCMPSW执行的操作:执行的操作:DI SI(Flag)(SI)(SI) 2(DI)(DI) 2作用:作用:将将SI指向的数据段中的一个字(字节)与指向的数据段中的一个字(字节)与DI指向的附指向的附加段中的一个字(字节)相减,不保存结果,只设置标志位,加段中的一个字(字节)相减,不保存结果,只设置标志位,并自动修改并自动修改SI、DI的内容,使其指向下一个单元。的内容,使其指向下一个单元。注意:该指令指定用注意:该指令指定用SI、DI,且规定且规定SI指向数据段,指向数据段,DI指向附加段。指向附加段。REPREP作用:作用:与与与与CMPSBCMPSB、CMPSWCMPSW配配配配合
98、使用合使用合使用合使用执行的操作:执行的操作:重复重复重复重复 CMPSBCMPSB或或或或 CMPSWCMPSW的的的的操作,直到操作,直到操作,直到操作,直到 CX=0CX=0。CX=0?CX-1CXCMPSREPCMPSREPCMPSY YN N重复前缀重复前缀REP/REPZ/REPE/REPNZ/REPNE它们不能单独使用,只能加在串操作指令之前,有它们不能单独使用,只能加在串操作指令之前,有来控制后面的基本字符串操作指令,使之重复执行。来控制后面的基本字符串操作指令,使之重复执行。REPE/REPZREPE/REPZ,REPNE/REPNZREPNE/REPNZ作用:作用:与与CM
99、PSB、CMPSW配合使用。配合使用。执行的操作:执行的操作:CX=0?orZ=0?CX-1CXCMPSREPECMPSREPECMPSREPE/REPZREPE/REPZ重复重复CMPSB或或CMPSW的的操作,直到操作,直到CX=0或或Z=0。CX不为不为0或两数相等时循环或两数相等时循环Y YN NREPNE/REPNZREPNE/REPNZ重复重复CMPSB或或CMPSW的操作,直到的操作,直到CX=0或或Z=1CX=0?orZ=1?CX-1CXCMPSREPNECMPSREPNECMPSCX不为不为0或两数不相等时循环或两数不相等时循环Y YN N例例3:在内存的:在内存的DS和和E
100、S段中,各有长度为段中,各有长度为50字节的字符串,试比较它们字节的字符串,试比较它们是否相同。是否相同。Leasi,souceLeadi,destMovcx,50CldAgain:CmpsbJnzFoundDeccxJnzAgainmovax,0jmpexitFound:decsimovax,siExit:hltsi-diODSZAPC00100100023D005AB92SouceDest23D005A192SIDI例例3-1:字比较。:字比较。Leasi,souceLeadi,destMovcx,25CldAgain:CmpswJnzFoundDeccxJnzAgainmovax,0jm
101、pexitFound:decsidecsimovax,siExit:hltsi-diODSZAPC00100100023D005AB92SouceDest23D005A192SIDI例例3-2:在内存的:在内存的DS和和ES段中,各有长度为段中,各有长度为50字节的字符串,字节的字符串,试比较它们是否相同。试比较它们是否相同。(与与Repe/Repz配合使用)配合使用)Leasi,souceLeadi,destMovcx,50CldRepeCmpsbJnzFoundmovax,0jmpexitFound:decsimovax,siExit:hltCX不为不为0且且si与与di相等相等(ZF=1
102、)时重复时重复检测检测CX=0?或或ZF=0?是,退出是,退出否,否,进行进行CX1CX执行执行REPNE后的串操作。后的串操作。重复重复23D005AB92SouceDest23D005A192SIDI例例3-2:在内存的:在内存的DS和和ES段中,各有长度为段中,各有长度为50字节的字符串,字节的字符串,试比较它们是否相同。试比较它们是否相同。(与与Repne/Repnz配合使用)配合使用)Leasi,souceLeadi,destMovcx,50CldRepneCmpsbJzFoundmovax,0jmpexitFound:decsimovax,siExit:hltCX不为不为0且且si
103、与与di不相等不相等(ZF=0)时重复时重复检测检测CX=0?或或ZF=1?是,退出是,退出否,否,进行进行CX1CX执行执行REPNE后的串操作。后的串操作。重复重复538005A372SouceDest23D005A192SIDI3.3.串扫描指令串扫描指令串扫描指令串扫描指令名称名称格式格式功能功能状态标志状态标志控制标志控制标志OSZAPCDIT字节串扫描指令字节串扫描指令字串扫描指令字串扫描指令重复前缀重复前缀SCASBSCASWREPE/REPZ*REPNE/REPNZ字节串扫描字节串扫描字串扫描字串扫描当相等当相等/为零为零重复重复当不相等当不相等/不为零不为零重复重复不影响不影
104、响不影响不影响设置设置D设置设置DOSZAPCOSZAPCOSZAPCOSZAPC*可以执行,可以执行,但无意义!但无意义!SCASBSCASB执行的操作:执行的操作:(AL) DI(Flag)(DI)(DI) 1SCASWSCASW执行的操作:(执行的操作:(AX) DI(Flag)(DI)(DI) 2作用:作用:将将AL(AX)的内容减去的内容减去DI指向的附加段中的一个字(字节)指向的附加段中的一个字(字节),结果,结果不保存,只影响标志位。不保存,只影响标志位。并自动修改并自动修改DI的内容,使其的内容,使其指向下一个单元。指向下一个单元。注意:注意:该指令指定用该指令指定用DI,且规
105、定且规定DI指向附加段。指向附加段。REPE/REPEREPE/REPE,REPNE/REPNZREPNE/REPNZ作用:作用:与与SCASB、SCASW配合使用,将数据段中的一串数据传配合使用,将数据段中的一串数据传送到附加段。送到附加段。执行的操作:执行的操作:CX=0?或或Z=0?CX-1CXSCASREPESCASREPESCASREPE/REPEREPE/REPE重复重复SCASB或或SCASW的操作,直到的操作,直到CX=0或或Z=0。CX不为不为0或两数相等时循环或两数相等时循环Y YN NREPNE/REPNZREPNE/REPNZ重复重复SCASB或或SCASW的操作,直到
106、的操作,直到CX=0或或Z=1CX=0?OrZ=1?CX-1CXSCASREPNESCASREPNESCASCX不为不为0或两数不相等时循环或两数不相等时循环Y YN N例例4:寻找字符串中是否有字符:寻找字符串中是否有字符A。Leadi,souceMovcx,30Moval,Aagain:ScasbJzfindDeccxJnzagainMovbx,0Jmpexitfind:DecdiMovbx,diexit:Hltal-diODSZAPC0010010005371414968SouceDI例例4-1:寻找字符串中是否有字符:寻找字符串中是否有字符A。al-diODSZAPC001001000
107、53007100410049006800SouceDILeadi,souceMovcx,30Movax,Aagain:ScaswJzfindDeccxJnzagainMovbx,0Jmpexitfind:DecdiDecdiMovbx,diexit:Hlt例例4-2:寻找字符串中是否有字符:寻找字符串中是否有字符A。与与Repe/Repz,Repne/Repnz配合使用。配合使用。Leadi,souceMovcx,30Moval,ARepneScasbJzfindMovbx,0Jmpexitfind:DecdiMovbx,diexit:Hlt5371414968SouceDICX不为不为0且且
108、AL与与di不不相等相等(ZF=0)时重复时重复检测检测CX=0?或或ZF=1?是,退出是,退出否,否,进行进行CX1CX执行执行REPNE后的串操作。后的串操作。重复重复4.4.存入串指令存入串指令存入串指令存入串指令名称名称格式格式功能功能状态标志状态标志控制标志控制标志OSZAPCDIT字节串存入指令字节串存入指令字串存入指令字串存入指令重复前缀重复前缀STOSBSTOSWREP字节串存入字节串存入字串存入字串存入无条件重复无条件重复不影响不影响不影响不影响不影响不影响设置设置D设置设置DSTOSBSTOSB执行的操作:执行的操作:DI(AL)(DI)(DI) 1STOSWSTOSW执行
109、的操作:执行的操作:DI(AX)(DI)(DI) 2作用:作用:将将AL或或AX寄存器中的数送入寄存器中的数送入DI指向的附加段的某单指向的附加段的某单元中,并自动修改元中,并自动修改DI的内容,使其指向下一个单元。的内容,使其指向下一个单元。注意:注意:该指令指定用该指令指定用DI,且规定且规定DI指向附加段。指向附加段。REPREP作用:作用:与与与与STOSBSTOSB、STOSWSTOSW配合使用配合使用配合使用配合使用执行的操作:执行的操作:重复重复重复重复 STOSBSTOSB或或或或 STOSWSTOSW的操作,直到的操作,直到的操作,直到的操作,直到 CX=0CX=0。CX=0
110、?CX-1CXSTOSREPSTOSREPSTOSY YN N常用于初始化常用于初始化常用于初始化常用于初始化某一内存缓冲区某一内存缓冲区某一内存缓冲区某一内存缓冲区例例5:初始化内存,使其内容全部位:初始化内存,使其内容全部位0。Leadi,destmoval,0Movcx,30Cldagain:StosbDeccxJnzagainHlt23D005AB92Dest00000000DI(AL)DI(DI)+1DI例例5-1:初始化内存,使其内容全部位:初始化内存,使其内容全部位0。Leadi,destmoval,0Movcx,15Cldagain:StoswDeccxJnzagainHlt2
111、3D005AB92Dest00000000DI(AL)DI(DI)+2DI例例5-2:初始化内存,使其内容全部为:初始化内存,使其内容全部为0。与与Rep指令指令配合使用。配合使用。Leadi,destmoval,0Movcx,30CldRepStosbHlt23D005AB92Dest00000000DI5.5.取字符串指令取字符串指令取字符串指令取字符串指令名称名称格式格式功能功能状态标志状态标志控制标志控制标志OSZAPCDIT字节从串取指令字节从串取指令字从串取指令字从串取指令LODSBLODSW取字节串取字节串取字串取字串不影响不影响不影响不影响设置设置D设置设置D本指令一般不与本指
112、令一般不与REP联用。联用。LODSBLODSB执行的操作:执行的操作:(AL)SI(SI)(SI) 1LODSWLODSW执行的操作:执行的操作:(AX)SI(SI)(SI) 2作用:作用:将将SI指向的数据段的某单元的内容送入指向的数据段的某单元的内容送入AL或或AX寄存寄存器中,并自动修改器中,并自动修改SI的内容,使其指向下一个单元。的内容,使其指向下一个单元。注意:该指令指定用注意:该指令指定用SI,且规定且规定SI指向数据段。指向数据段。适用于将内存中的一串字符适用于将内存中的一串字符适用于将内存中的一串字符适用于将内存中的一串字符逐一取出测试用。逐一取出测试用。逐一取出测试用。逐
113、一取出测试用。例例6:在数据段:在数据段DS中有一字符串,试将其中有一字符串,试将其每一个字符加每一个字符加1后送入附加段后送入附加段ES中。中。Leasi,souceLeadi,destMovcx,30Cldagain:LodsbIncalMoves:di,alIncdiDeccxJnzagainHlt23D005AB92SouceDest24D106ACSIDISIALSI+1SI例例6-1:在数据段:在数据段DS中有一字符串,试将中有一字符串,试将其每一个字加一后送入附加段其每一个字加一后送入附加段ES中。中。Leasi,souceLeadi,destMovcx,20Cldagain:L
114、odswIncaxMoves:di,axIncdiIncdiDeccxJnzagainHlt23D005AB92SouceDest24D006ABSIDISIAXSI+2SILods指令一般不与指令一般不与Rep指令配合使用指令配合使用例例7:在数据段:在数据段DS中有一字符串,试将其中有一字符串,试将其每一个字符加一后送入附加段每一个字符加一后送入附加段ES中。中。Leasi,souceLeadi,destMovcx,30Cldagain:LodsbIncalStosbDeccxJnzagainHlt23D005AB92SouceDest24D106ACSIDI例例8:在起始地址为:在起始地
115、址为Block的内存中有一数据块,其中有正数,的内存中有一数据块,其中有正数,也有负数,要求将正负数分开,分别送至同一段的两个区域也有负数,要求将正负数分开,分别送至同一段的两个区域p_data和和M_data中中Leasi,blockStosbLeadi,P_dataxchgbx,diLeabx,M_dataagain:deccxMovax,segblockjnzgoonMovds,axhltMoves,axGoon:LodsbTestal,80hJnzminuStosbJmpagainminu:Xchgbx,di538205blockM_data82DIDSP_dataBXSI5305五、
116、控制转移指令五、控制转移指令分类分类分类分类指令指令指令指令功能功能功能功能无条件转移指令无条件转移指令无条件转移指令无条件转移指令条件转移指令条件转移指令条件转移指令条件转移指令循环指令循环指令循环指令循环指令子程序调用及子程序调用及子程序调用及子程序调用及返回指令返回指令返回指令返回指令中断指令中断指令中断指令中断指令JMPOPRDJNZOPRD(等)等)LOOPOPEDLOOPE/LOOPZOPRDLOOPNE/LOOPNZOPRDCALLOPRDRETINTNINTOIRET无条件转移无条件转移根据上一条指令设置的根据上一条指令设置的标志位的情况转移标志位的情况转移计数非零循环计数非零
117、循环计数非零循环且结果为计数非零循环且结果为0循环循环计数非零循环且结果不为计数非零循环且结果不为0循环循环调用子程序调用子程序从子程序返回从子程序返回软中断软中断溢出时中断溢出时中断中断返回中断返回1.无条件转移调用和返回类指令无条件转移调用和返回类指令JMP和和CALL指令都是通过改变指令都是通过改变CS和和IP值改变程序执值改变程序执行的,但不同的是,行的,但不同的是,CALL指令要先将指令要先将IP和和CS的当前的当前值入栈保存,以务返回时使用;值入栈保存,以务返回时使用;RET指令则将指令则将CALL指令入栈保存的值弹回到指令入栈保存的值弹回到CS和和IP中,实现正确的返回。中,实现
118、正确的返回。8086的转移、调用和返回指令根据转移地址在段内或的转移、调用和返回指令根据转移地址在段内或段外,又分为段内转移和段间转移即近转移段外,又分为段内转移和段间转移即近转移(NEAR)和远转移(和远转移(FAR)段内和段间的段内和段间的转移指令寻址方法又有两种,即:转移指令寻址方法又有两种,即:直接寻址和间接寻址直接寻址和间接寻址段内转移段内转移段间转移段间转移段内直接短转移段内直接短转移段内直接近转移段内直接近转移段内间接转移段内间接转移段间直接转移段间直接转移段间间接转移段间间接转移JMPSHORTOPRDJMPSHORTOPRDJMPNEARPTROPRDJMPNEARPTROP
119、RDJMPWORDPTROPRDJMPWORDPTROPRDJMPFARPTROPRDJMPFARPTROPRDJMPDWORDPTROPRDJMPDWORDPTROPRD(1 1) 无条件转移指令无条件转移指令无条件转移指令无条件转移指令JMPJMP 分类分类名称名称指令指令-128127-3276832767-3276832767转移范围转移范围段间段间段间段间JMPSHORTOPRDJMPSHORTOPRD 段内直接短转移段内直接短转移操作数:操作数:短短-标号标号执行的操作执行的操作:(IP)(IP)+8位位移量位位移量转移范围:转移范围:-128+127JMPNEAROPRDJMPN
120、EAROPRD段内直接近转移段内直接近转移操作数操作数:NEAR-标号标号执行的操作执行的操作:(IP)(IP)+16位位移量位位移量转移范围:转移范围:-32768+32767段内直接转移段内直接转移JMP标号标号05A20010EB03A20020F4Short当前当前IP+8位移量位移量Near当前当前IP+16位移量位移量moval,blcmpal,0jnSpdatamov1000,aljmpnextpdata:mov2000,alnext:hltJMPnext+127-128-32768+3276710510610710810910a10b10c10d10eNextpdataJmpb
121、x(bx)=120jmp120Ip=(bx)=120Jmpdatasidata=1000SI=500jmp1500Ip=1500Jmpbx10510610710810910a120121122123MovJMPWORDPTROPRDJMPWORDPTROPRD段内间接转移段内间接转移操作数:操作数:16位通用寄存器、存储器位通用寄存器、存储器执行的操作执行的操作:(IP)(EA)转移范围:转移范围:-32768+32767例:例:JMPFARPTROPRDJMPFARPTROPRD段间直接转移段间直接转移操作数:操作数:far-标号标号执行的操作执行的操作:(IP)标号所在段的段内偏移地址标号
122、所在段的段内偏移地址(CS)标号所在段的段地址标号所在段的段地址转移范围:段间转移范围:段间例如:例如:JMPFARPTRTABLEJMPDWORDPTROPRDJMPDWORDPTROPRD段间间接转移段间间接转移操作数:存储器(操作数:存储器(32位)位)执行的操作执行的操作:(IP)(EA)(CS)(EA+2)转移范围:段间转移范围:段间例如:例如:JMPDWORDTABLESPSI例:例:直接转移直接转移JPMSHORTMULT1段内短接转移段内短接转移JMPNERAPTRMULT1段间直接转移段间直接转移JMPFARPTRMULT1段内近接转移段内近接转移JMPSHORTMULTI+
123、0AH段内短接转移段内短接转移MULT1为程序转向的标号为程序转向的标号例:例:间接转移间接转移若若BX0002H,且变量定义为:且变量定义为:DBT1DW0400HDBT2DD01000020HTABDW0600H,0640H06A0HJMPBX段内间接转移段内间接转移IP=0002HJMPDBT1段内间接转移段内间接转移IP=0400HJMPDBT2段间间接转移段间间接转移CS:IP0020:0100HJMPTABBX+2.段内间接转移段内间接转移IP06A0HJMPWORDPTRBX段内间接转移段内间接转移IP=003H;0002H的内容生成的内容生成EA(2 2) 子程序调用及返回指令
124、子程序调用及返回指令子程序调用及返回指令子程序调用及返回指令段内段内调用调用段间段间调用调用直接调用直接调用间接调用间接调用直接调用直接调用间接调用间接调用CALLNEARPTROPRDCALLNEARPTROPRDCALLFARPTROPRDCALLFARPTROPRDCALLDWORDPTROPRDCALLDWORDPTROPRDCALLCALL RETRET分类分类名称名称指令指令CALLWORDPTROPRDCALLWORDPTROPRDCALLchangeCALLBXCALLfarptrtranCALLDWORDPTRBX举例举例返回返回返回返回带立即数带立即数返回返回RETRETR
125、ETEXPRETEXPRETRET6near-标号标号far-标号标号16位寄存器位寄存器存储器存储器存储器存储器(32位位)操作数操作数调用指令调用指令CALL调用指令是为程序设计实现模块化而准备的调用指令是为程序设计实现模块化而准备的格式:格式:CALLdst其操作分其操作分4步进行:步进行:(SP)(SP)-2(SP+1),(SP)(CS)(CS)SEG(SP)(SP)-2(SP)+1,(SP)(IP)(IP)dst若为若为段间调用,应完成段间调用,应完成,即将下条指令的即将下条指令的(CS)先入栈,然后(先入栈,然后(IP)入栈,最后再将转移入栈,最后再将转移地址的码段地址地址的码段地
126、址SEG取代(取代(CS),),把偏移量把偏移量dst取取代(代(IP)。)。若为段内调用,则只需执行若为段内调用,则只需执行两两步步CALL指令和指令和JMP指令的区别在于前者需要保存返指令的区别在于前者需要保存返回地址,即多执行回地址,即多执行两步两步返回指令返回指令RETRET指令在子程序末尾,当子程序功能完成后,由它指令在子程序末尾,当子程序功能完成后,由它返回。返回。RET指令的操作如下:指令的操作如下:若为段内若为段内返回,执行返回,执行步:步:(IP)(SP)+1,(SP)(SP)(SP)+2若为段间返回,执行若为段间返回,执行步:步:(CS)(SP+1),(SP)(SP)(SP
127、)+2RETEXPRETEXP在调用子程序时,有时需要传递参数,一种方式是主程序在调用子程序时,有时需要传递参数,一种方式是主程序将参数压栈,以便子程序调用。将参数压栈,以便子程序调用。而子程序返回后,该参数即无用,若留在堆栈中则占用堆而子程序返回后,该参数即无用,若留在堆栈中则占用堆栈空间,故用栈空间,故用RETEXPRETEXP指令将其释放。指令将其释放。例如:例如:RET6SS:0000SS:SP堆堆栈栈段段IPIP参数参数4参数参数3参数参数2参数参数1SS:SPSS:SP2.2.条件转移指令条件转移指令条件转移指令条件转移指令根据上一条指令影响的状态位来判断是根据上一条指令影响的状态
128、位来判断是否转移。否转移。特点:特点:特点:特点:1.条件转移指令全部为段内转移条件转移指令全部为段内转移2.目标地址在当前指令的目标地址在当前指令的-128127范围内。范围内。3.目标地址由操作数目标地址由操作数OPRD确定。确定。3.条件转移指令不影响标志位。条件转移指令不影响标志位。051001D87403A20020F4+127-12810510610710810910a10b10c10d10eAddax,bxJznextMov2000,axNext:hlt指令指令指令指令功能功能功能功能转移条件转移条件转移条件转移条件JZ/JEOPRDJZ/JEOPRD结果为结果为0/相等则转移相
129、等则转移Z=1JNZ/JNEOPRDJNZ/JNEOPRD结果不为结果不为0/不相等则转移不相等则转移Z=0JSOPRDJSOPRD结果为负则转移结果为负则转移S=1JNSOPRDJNSOPRD结果不为负则转移结果不为负则转移S=0JOOPRDJOOPRD溢出则转移溢出则转移O=1JNOOPRDJNOOPRD不溢出则转移不溢出则转移O=0JP/JPEOPRDJP/JPEOPRD奇偶位为奇偶位为1则转移则转移P=1JNP/JPOOPRDJNP/JPOOPRD奇偶位为奇偶位为0则转移则转移P=0JCXZOPRDJCXZOPRDCX=0则转移则转移CX=0根据单个条件标志的设置情况转移根据单个条件标
130、志的设置情况转移根据单个条件标志的设置情况转移根据单个条件标志的设置情况转移例例1:计算:计算Y=XMovax,fb00hTestax,8000hJnslableNegaxLable:movY,axhltAx8000OSZAPC001010000指令指令指令指令功能功能功能功能转移条件转移条件转移条件转移条件JB/JNAE/JCOPRDJB/JNAE/JCOPRD低于低于/不高于等于不高于等于/有借位则转移有借位则转移C=1JNB/JAE/JNCOPRDJNB/JAE/JNCOPRD不低于不低于/高于等于高于等于/无借位则转移无借位则转移C=0JBE/JNAOPRDJBE/JNAOPRD低于或
131、等于低于或等于/不高于则转移不高于则转移CZ=1JNBE/JAOPRDJNBE/JAOPRD不低于或等于不低于或等于/高于则转移高于则转移CZ=0根据组合条件标志的设置情况转移根据组合条件标志的设置情况转移根据组合条件标志的设置情况转移根据组合条件标志的设置情况转移主要用来比较两个数的大小主要用来比较两个数的大小无符号数大小的比较无符号数大小的比较无符号数大小的比较无符号数大小的比较指令指令指令指令功能功能功能功能转移条件转移条件转移条件转移条件JL/JNGEOPRDJL/JNGEOPRD小于小于/不大于等于则转移不大于等于则转移SO=1且且Z=0JNL/JGEOPRDJNL/JGEOPRD不
132、小于不小于/大于或等于则转移大于或等于则转移SO=0或或Z=1JLE/JNGOPRDJLE/JNGOPRD小于或等于小于或等于/不大于则转移不大于则转移SO=1或或Z=1JNLE/JGOPRDJNLE/JGOPRD不小于等于不小于等于/大于则转移大于则转移SO=0且且Z=0带符号数大小的比较带符号数大小的比较带符号数大小的比较带符号数大小的比较例例2:两无符号数相加,结果正确则:两无符号数相加,结果正确则Ax中中存入存入1,若溢出则,若溢出则AX中存入中存入0。Movax,xMovbx,yAddbx,axJcerrorMovax,1Jmpexiterror:movax,0exit:hltAx8
133、000OSZAPC001010001例例3:有一组无符号数,与:有一组无符号数,与50比较,大于比较,大于50的存入的存入另一存储区,小于或等于另一存储区,小于或等于50的放弃。的放弃。Leasi,array1Leadi,array2Movcx,nAgain:Moval,siIncsiCmpal,50JbenextMovdi,alIncdinext:DeccxJnzagainHltal-50OSZAPC00101100105A2001085array1array2A285例例4:数组:数组ARRAY为为N字数组,要求将其中正数、负数、字数组,要求将其中正数、负数、0的个数的个数统计出来,分别存
134、入寄存器统计出来,分别存入寄存器DI、SI、AX中。中。XORBX,BXXORSI,SIXORDI,DIMOVCX,Nagain:CMPARRAYBX,0JLEless_or_eqPUSHFINCDIPOPFOSZAPC00101100105A2001085239002arraycmpLess_or_eq:JLNEXTINCSInext:ADDBX,2DECCXJNZAGAINMOVAX,NSUBAX,SISUBAX,DIHLT例例4:用条件转移指令实现长字节转移。:用条件转移指令实现长字节转移。如:如:jznext;next地址大于地址大于-128+127范围。范围。Jznext105106
135、10710810910a1200120112021203MovnextAddax,bxJnztempJmpnextTemp:movax,0next:movax,1LEASI,STRINGMOVCX,0AHMOVAL,20H;空格的空格的ASCII码为码为20HMOVAH,0H;结果在结果在AH中中AGAIN:CMPAL,SIJZADDAJMPCONTADDA:INCAHCONT:INCSIDECCXJNZAGAINHLT例例6:数数出出长长度度为为10的的,以以STRING为为首首地地址址的的字字符符串串中中空空格格的的个数。个数。41424320454620482049string指令指令指
136、令指令功能功能功能功能循环条件循环条件循环条件循环条件LOOPOPRDLOOPOPRD计数器不为零循环计数器不为零循环CX 0LOOPZ/LOOPEOPRDLOOPZ/LOOPEOPRD计数器不为零且相等时循环计数器不为零且相等时循环CX 0且且Z=1LOOPNZ/LOOPNEOPRDLOOPNZ/LOOPNEOPRD计数器不为零且不相等时循环计数器不为零且不相等时循环CX 0且且Z=03.3.循环指令循环指令循环指令循环指令 LOOPOPRDLOOPOPRDCX循环次数循环次数循环体循环体LOOPZ(CX-1,CX=0?Z=0?)YNLEASI,STRINGMOVCX,0AHMOVAL,20
137、H;空格的空格的ASCII码为码为20HMOVAH,0H;结果在结果在AH中中AGAIN:CMPAL,SIJZADDAJMPCONTADDA:INCAHCONT:INCSILOOPAGAINHLT例例6-1:数数出出长长度度为为10的的,以以STRING为为首首地地址址的的字字符符串串中中空空格格的的个数个数。循环条件:循环条件:CX0(CX)-1CX(CX)=0?是,循环结束是,循环结束否,继续循环否,继续循环转向的地址范围在转向的地址范围在-128+127之间之间MOVCX,NMOVSI,ASC-1MOVAL,20HAGAIN:INCSICMPAL,SILOOPNZAGAINJZNEXTM
138、OVSI,0EXIT:HLT例例7:有一串:有一串n个字符的字符串个字符的字符串(ABCDEFGHIJK)存存储于首地址为储于首地址为ASC的存储区,的存储区,要求查找空格的位置。要求查找空格的位置。41424344454647482049ASC循环条件:循环条件:CX0且且Z=0(CX)-1CX(CX)0?Andz=0是,继续循环是,继续循环否,循环结束否,循环结束SI七、处理器控制指令七、处理器控制指令名称名称格式格式功能(对标志位的影响)功能(对标志位的影响)进位标志清进位标志清0指令指令CLCCLCC=0进位标志置进位标志置1指令指令STCSTCC=1进位标志取反进位标志取反CMCCM
139、CC=C方向标志清方向标志清0指令指令CLDCLDD=0方向标志置方向标志置1指令指令STDSTDD=1中断标志清中断标志清0指令指令CLICLII=0中断标志置中断标志置1指令指令STISTII=1标志处理指令标志处理指令标志处理指令标志处理指令其它处理指令其它处理指令其它处理指令其它处理指令名称名称格式格式功能功能状态标志位状态标志位处理器等待指令处理器等待指令WAITWAIT处理器等待处理器等待不影响不影响处理器交权指令处理器交权指令ESCESC处理器交权处理器交权不影响不影响总线封锁前缀总线封锁前缀LOCKLOCK封锁总线封锁总线不影响不影响处理器暂停指令处理器暂停指令HLTHLT使处
140、理器暂时处使处理器暂时处于停机状态于停机状态不影响不影响空操作指令空操作指令NOPNOP使使CPU不进行任不进行任何操作何操作不影响不影响3.5中断类指令及中断类指令及IBMPCDOC系统功能调用系统功能调用一、中断及其产生一、中断及其产生当微计算机在运行期间,遇到某些特殊情况,当微计算机在运行期间,遇到某些特殊情况,需要需要CPU停止执行当前的程序,产生断点,转去停止执行当前的程序,产生断点,转去执行一组专门的例行进行处理,这个过程称中断。执行一组专门的例行进行处理,这个过程称中断。这行程序称中断服务程序。这行程序称中断服务程序。在在8086的中断机构中,包含两类中断源,一是的中断机构中,包
141、含两类中断源,一是外部中断源,二是内部中断源。外部中断源,二是内部中断源。中断指令中断指令中断指令中断指令名称名称格式格式功能功能控制标志位控制标志位软中断指令软中断指令INTNINTN软中断软中断I=0T=0溢出中断指令溢出中断指令INTOINTO溢出时中断溢出时中断I=0T=0中断返回中断返回IRETIRET从中断返回从中断返回对所有的标志位对所有的标志位都有影响都有影响二、中断及中断返回指令二、中断及中断返回指令(一)中断指令:有一)中断指令:有3条条1.INTnN为中断类型号,因此可有为中断类型号,因此可有0255级中断。级中断。CPU根据根据此类型号此类型号n,从位于内存实际地址从位
142、于内存实际地址0000H003FH区中的中区中的中断向量表找到中断服务程序的首地址,每一个类型号含一断向量表找到中断服务程序的首地址,每一个类型号含一个个4字节的中断向量,中断向量就是中断服务程序的入口字节的中断向量,中断向量就是中断服务程序的入口地址。地址。INT n 指令的操作:1. PUSH F2. TF0, IF03. PUSH CS4. (CS)n*4+25. PUSH IP6. (IP)n*4IRET 指令的操作:1. POP IP2. POP CS3. POP F2.INT(相当于相当于INT3)该中断称为断点中该中断称为断点中断,是断,是8086提供给用户的一种调试提供给用户的
143、一种调试手段。手段。3.INTO该指令性检查算术运算是否产生该指令性检查算术运算是否产生溢出,溢出,响应中断与否由响应中断与否由OF位决位决定定(二)中断返回指令二)中断返回指令IRET用在用在任何一种中断服务程序的末尾,以退出中断,并任何一种中断服务程序的末尾,以退出中断,并返回中断断点处的下一条指令。返回中断断点处的下一条指令。三、三、8086的专用中断的专用中断1.类型类型0中断中断称为除数为称为除数为0的中断。的中断。2.类型类型1中断中断又称单步中断。当又称单步中断。当CPU测试到测试到TF=1时,自动产生时,自动产生单步中断单步中断3.类型类型2中断中断此此中断是供中断是供CPU外
144、部紧急事件使用的非屏蔽中断外部紧急事件使用的非屏蔽中断NMI4.类型类型3中断(中断(INT)设置断点,设置断点,是是8086提供用户使用的一种调试手段提供用户使用的一种调试手段5。类型。类型4中断(中断(INTO)溢出中断。溢出中断。四、四、PCDOS的系统功能调用与基的系统功能调用与基本的本的I/O子程序调用子程序调用(一)一)8086中断类型号的分配中断类型号的分配在在8086允许的允许的256级中断类型中,除级中断类型中,除00H04H级级规定为专用的中断外,规定为专用的中断外,IBM-PC机把类型号为机把类型号为08H1FH分配给主板的扩展槽上的基本外设的中分配给主板的扩展槽上的基本
145、外设的中断服务子程序和断服务子程序和BIOSROM的的I/O了程序调用指令,了程序调用指令,把类型号为把类型号为200FFH中的一些分配给中的一些分配给DOS中的功中的功能子程序调用指令,其中的能子程序调用指令,其中的40H7FH留给用户,留给用户,作为开发时供使用的中断类型号。作为开发时供使用的中断类型号。(二)二)PCDOS系统功能调用系统功能调用PCDOC为用户提供了许多可以直接使用的命令。为用户提供了许多可以直接使用的命令。DOS还为还为用户提供了用户提供了80多个功能子程序;按其功能分多个功能子程序;按其功能分为三个方面:为三个方面:(1)磁盘的读写管理)磁盘的读写管理(2)内存管理
146、)内存管理(3)基本)基本I/O管理以及对时间、日期的处理子程序管理以及对时间、日期的处理子程序在调用这些子程序时,程序中应给出下面三方面的内在调用这些子程序时,程序中应给出下面三方面的内容:容:(1)入口参数;)入口参数;(2)子程序的功能号)子程序的功能号AH寄存器;寄存器;(3)INT21H(三)基本三)基本I/O子程序调用子程序调用1.键盘输入键盘输入并回显(功能号并回显(功能号01)例如:例如:MOVAH,1;将功能号将功能号01送入送入AHINT21H2.显示输出(功能显示输出(功能02)2号系统功能调用是标准输出设备输出一个字符号系统功能调用是标准输出设备输出一个字符代码,入口参
147、数是将要输出的字符的代码,入口参数是将要输出的字符的ASCII码置入码置入DL,如:如:MOVAH,02;将功能将功能02送入送入AHMOVDL,¥;设入口参数设入口参数INT21H3.异步通信输入(功能号异步通信输入(功能号03)3号号系统功能调用等待并从标准辅助设备输入系统功能调用等待并从标准辅助设备输入1个个字符,并送到寄存器字符,并送到寄存器AL中。中。4.异步通信输出(功能异步通信输出(功能04)4号系统功能调用是从标准辅助输出一个字符,号系统功能调用是从标准辅助输出一个字符,入口参数是把输出的字符码放在入口参数是把输出的字符码放在DL中。中。5.打印机输出(功能号打印机输出(功能号
148、5)5号系统功能调用是把入口时放入号系统功能调用是把入口时放入DL中的字符中的字符输出到打印输出设备。如:输出到打印输出设备。如:MOVDL,AMOVAH,05INT21H6.直接控制台直接控制台I/O(功能号功能号06)6号号系统功能调用可以从标准输入设备键盘输入字系统功能调用可以从标准输入设备键盘输入字符,也可以向标准输出设备屏幕输出字符执行分两符,也可以向标准输出设备屏幕输出字符执行分两种情况:种情况:(1)当)当DL=0FFH,表示操作功能为输入,表示操作功能为输入,而且以分为两种情况:而且以分为两种情况:若标志若标志ZF=0,表示键盘上的字符代码已准备表示键盘上的字符代码已准备好,读
149、入到好,读入到AL中了;中了;若若ZF=1,表示无键按下,表示无键按下,AL中不是键入的字中不是键入的字符值。符值。(2)当)当DL0FFH时,表示操作功能为输时,表示操作功能为输出,出,DL中为输出字符的中为输出字符的ASCII码。码。例如:例如:MOVDL,0FFH;从键盘输入字符从键盘输入字符MOVAH,06HINT21HMOVDL,24H;从屏幕输出字符从屏幕输出字符$MOVAH,06HINT21H7.键盘输入无回显(功能号键盘输入无回显(功能号07)7号系统功能调用等待从标准输入设备输入字符号系统功能调用等待从标准输入设备输入字符然后将输入字符送入然后将输入字符送入AL出口出口8.键
150、盘输入无回显(功能键盘输入无回显(功能08)8号功能调用除不回显外,其他功能同号功能调用除不回显外,其他功能同01调用,调用,但要检查但要检查Crl-Break9.显示字符串(功能号显示字符串(功能号09)9号系统功能调用将从标准输出设备上输出存于号系统功能调用将从标准输出设备上输出存于存储器内的字符串。入口时,要求存储器内的字符串。入口时,要求DS:DX指向内指向内存中一个以存中一个以$为结束标志的字符串。为结束标志的字符串。10.键盘输入到缓冲区(功能键盘输入到缓冲区(功能0AH)执行执行0AH系统功能调用前,应在数据段定义一个系统功能调用前,应在数据段定义一个缓冲存储区;定义如下:缓冲存
151、储区;定义如下:DATASEGMENTBUFDB81DB?DB81DUP(?)(?)DATAEND入口时,要求入口时,要求DS:DX指向输入缓冲区指向输入缓冲区BUF,执行时,将逐一读入键盘输入码,存入缓冲区执行时,将逐一读入键盘输入码,存入缓冲区自第三个单元开始的存储区,直至遇到回车符自第三个单元开始的存储区,直至遇到回车符为止。为止。11.检查键盘状态(功能检查键盘状态(功能0BH)执行执行0BH号系统功能调用时,若键盘有键按下,则号系统功能调用时,若键盘有键按下,则在寄存器在寄存器AL中置入中置入0FFH,同时检查按键是否为同时检查按键是否为Ctrl-Break,若是,则退出;反之,无键
152、按下,则向若是,则退出;反之,无键按下,则向AL中置入中置入0。12.设置日期(功能号设置日期(功能号2BH)本功能调用的入口参数:本功能调用的入口参数:CX:DX中必须有一个中必须有一个有效的日期,有效的日期,CX中放入年号,中放入年号,DH中放入月号,中放入月号,DL中放入日号,若日期有效,设置成功,中放入日号,若日期有效,设置成功,AL=0,否则否则AL=0FFH13.取得日期(功能号取得日期(功能号2DH)例例3-31:将日期置为:将日期置为1995年年7月月30日的程序如下日的程序如下:MOVCX,1995MOVDH,7MOVDL,30MOVAH,2BHINT21H本功能调用不需要入
153、口参数,调用后的返回日期本功能调用不需要入口参数,调用后的返回日期CX:DX中,中,CX中放年号,为二进制数,中放年号,为二进制数,DH中中放月号,放月号,DL中放日号。中放日号。14.设置时间(功能号设置时间(功能号2DH)时间的格式由时间的格式由4个个8位二进制数表示,位二进制数表示,CH中放小时,中放小时,CL中放分,中放分,DH中放钟,中放钟,DL响应秒响应秒15.取得时间(功能号取得时间(功能号2CH)本功能调用不需要用入口参数,调用结束时,本功能调用不需要用入口参数,调用结束时,从从CX:DX中取得时间,时间格式同中取得时间,时间格式同2DH功能调功能调用用五五.BIOS中断调用中
154、断调用1.BIOS中断调用类型中断调用类型2.在在IBMPC的系统板上装有的系统板上装有40KB的的ROM,其中地址其中地址从从0FE000H-0FFFFFH的为的为ROMBIOS。BIOS中断调用使用方法:将功能号送给中断调用使用方法:将功能号送给AH,并给出所需的并给出所需的入口参数,然后再写中断指令。入口参数,然后再写中断指令。2.BIOS中断调用举例中断调用举例(1)键盘)键盘I/O中断调用(中断调用(INT16H)INT16H中断调用有三个功能,分别用功能号中断调用有三个功能,分别用功能号0,1,2表示,表示,功能号送功能号送AH。AH=0功能:从键盘读入字符,出口时,功能:从键盘读
155、入字符,出口时,AL中为键盘读入字符的中为键盘读入字符的ASCII码,码,AH中为键盘读入字符的扫描码。中为键盘读入字符的扫描码。AH=1本调用的功能含了本调用的功能含了AH=0的调用功能,执行后还将对的调用功能,执行后还将对ZF标志标志进行设置。进行设置。AH=3功能:读取特殊键功能的状态。功能:读取特殊键功能的状态。(2)打印机)打印机I/O中断调用(中断调用(INT17H)INT17H中断调用有三个功能,分别用功能号中断调用有三个功能,分别用功能号0,1,2表示,表示,功能号送功能号送AH。入口时,将打印机号送入口时,将打印机号送DX,机号分别为机号分别为0,1,2。AH=0功能:将功能
156、:将AL中的字符在打印机上打印出来。入口时,要打印中的字符在打印机上打印出来。入口时,要打印的字符的的字符的ASCII码送码送AL。AH=1功能:初始化打印机,并回送打印机状态到功能:初始化打印机,并回送打印机状态到AH中中AH=2功能:读取打印机的状态信号,出口时将此状态信息放在功能:读取打印机的状态信号,出口时将此状态信息放在AL中中六六.返回返回DOS的方法及使用的中断调用的方法及使用的中断调用INT20H和和INT21H和和4CH号功能调用都能退出或结束当前程号功能调用都能退出或结束当前程序,返回序,返回DOS。但它们分别用在不同框架结束的汇编语言源但它们分别用在不同框架结束的汇编语言源程序中。程序中。