《微机原理课件第6讲.ppt》由会员分享,可在线阅读,更多相关《微机原理课件第6讲.ppt(51页珍藏版)》请在三一办公上搜索。
1、,第3章 8086的寻址方式和指令系统,H,乘法指令,H,MUL无符号数乘法指令,MUL无符号数乘法指令(Multiply unsigned)格式 MUL src。功能 将源操作数和累加器中的数都当成无符号数,然后将两数相乘,src可以是字(065535)和字节(0255)。操作数要求可以是寄存器、存储单元,但不能是立即数;源操作数是存储单元时,必须在操作数前加B或W说明是字节还是字。,H,MUL无符号数乘法指令,运算情况 源操作数是一个字节 源操作数与累加器AL中的内容相乘,乘积为双倍长的16位数,高8位送到AH,低8位送AL。即 AXAL源。,AL,被乘数,8位,操作数,乘数,8位,AX,
2、乘积,16位,H,MUL无符号数乘法指令,运算情况 源操作数是一个字 源操作数与累加器AX的内容相乘,结果为32位数,高位字放在DX寄存器中,低位字放在AX寄存器中。即(DX,AX)AX 源,AX,被乘数,16位,操作数,乘数,16位,AX,乘积,32位,DX,H,举例MUL CL;AL乘CL,结果在AX中MUL BX;AX乘BX,结果在DX:AX中MUL BYTE DI;AL乘存储器(8位),结果在AX中MUL WORDBX;AX乘存储器字,结果在DX:AX中如果运算结果的高半部分(在AH或DX中)为零,则状态标志位(CF)=(OF)=0,否则(CF)=(OF)=1。因此,状态标志位(CF)
3、=(OF)=1,表示AH或DX中包含着乘积的有效位。,MUL无符号数乘法指令,H,举例MOV AL,14H;(AL)=14H-20MOV CL,05H;(CL)=05H-5MUL CL;(AX)=0064H-100本例中结果的高半部分(AH)=0,因此,状态标志位(CF)=(OF)=0,通过检测标志,可以去除结果中的前导无效零。有了乘法(和除法)指令,使有些运算程序的编程变得简单方便。但是必须注意,乘法指令的执行速度很慢,除法指令也是如此。,MUL无符号数乘法指令,H,IMUL整数乘法指令,IMUL整数乘法指令(Integer Multiply)格式 IMUL src。功能 将源操作数和累加器
4、中的数都当成有符号数,然后将两数相乘,src可以是字(-3276832767)和字节(-128127)。操作数要求和运算情况 与MUL要求相同。,H,举例IMUL CL;AL乘CL,结果在AX中IMUL BX;AX乘BX,结果在DX:AX中IMUL BYTE DI;AL乘存储器(8位),结果在AX中IMUL WORDBX;AX乘存储器字,结果在DX:AX中如果运算结果的高半部分(在AH或DX中)为0或1,则状态标志位(CF)=(OF)=0,否则(CF)=(OF)=1。因此,状态标志位(CF)=(OF)=1,表示AH或DX中包含着乘积的有效位。为0,则表示高半部分是符号扩展。,IMUL整数乘法指
5、令,正数,AH或DX 为全0负数,AH或DX为全1,H,举例MOV AX,04E8H;(AX)=04E8HMOV BX,4E20H;(BX)=4E20HIMULBX;(DX:AX)=(AX)(BX)以上指令的执行结果为:(DX)=017FH,(AX)=4D00H,且(CF)=(OF)=1。实际上,以上指令完成带符号数+1256和+20000的乘法运算,得到乘积为+25120000。由于此时DX中结果的高半部分包含着乘积的有效数字,故状态标志位(CF)=(OF)=1。,IMUL整数乘法指令,H,AAM乘法的ASCII调整指令,AAM乘法的ASCII调整指令(ASCII Adjust for Mu
6、ltiply)格式 AAM。功能 对AL中的两个非压缩十进制数相乘的乘积进行十进制数的调整,在AX中得到正确的非压缩十进制数的乘积,高位在AH中,低位在AL中。调整的过程 把AL寄存器内容除以10,商放在AH中,余数在AL中。即:AH AL/10所得的商;AL AL/10所得的余数.,H,AAM乘法的ASCII调整指令,举例 求两个非压缩十进制数08和04之乘积。解:MOV AL,08H;置初值 MOV BL,04H MUL BL;AL08与04之乘积20H AAM;调整得AH03H(十位),AL02H(个位)结果:AX0302H,即BCD数32。若想转换成ASCII码,需再执行 OR AX,
7、3030H,H,除法指令,H,DIV无符号数除法指令,DIV无符号数除法指令(Division unsigned)格式 DIV src。功能 将两个无符号数相除,被除数的长度必须是除数长度的两倍,若不够,必须扩展被除数的长度。操作数要求可以是寄存器、存储单元,但不能是立即数;源操作数是存储单元时,必须在操作数前加B或W说明是字节还是字。,H,DIV无符号数除法指令,运算情况 源操作数是一个字节 16位被除数必须放入AX中,src为8位。ALAX/src字节的商 AHAX/src字节的余数,H,DIV无符号数除法指令,运算情况 源操作数是一个字 32位被除数必须放入(DX,AX)中,src为16
8、位。AX(DX,AX)/src字的商 DX(DX,AX)/src字的余数,H,举例MOV AX,0F05H;(AX)=0F05HMOV DX,068AH;(DX)=068AHMOV CX,08E9H;(CX)=08E9HDIV CX;运算完毕后,商(AX)=BBE1H,余数(DX)=073CH,DIV无符号数除法指令,H,注意事项 执行DIV指令时,如果除数为0,或字节除法时AL寄存器中的商大于FFH,或字除法时AX寄存器中的商大于FFFFH,则CPU立即自动产生一个类型号为0的内部中断。,DIV无符号数除法指令,H,IDIV整数除法指令,IDIV整数除法指令(Integer Division
9、)格式 IDIV src。功能 将两个带符号数相除,被除数的长度必须是除数长度的两倍,若不够,必须用CBW或CWD扩展被除数的长度。操作数要求与运算情况 同DIV。,H,注意事项 执行IDIV指令时,如果除数为0,或字节除法时AL寄存器中的商超出-128127范围,或字除法时AX寄存器中的商超出-3276832767范围,则CPU立即自动产生一个类型号为0的内部中断。,IDIV整数除法指令,H,IDIV整数除法指令,关于余数的符号 在对有符号数进行除法运算时,例如-30除以8,可以得到商为-4,余数为+2;也可以得到商为-3,余数为-6,两结果都是正确的。对于8086,规定余数的符号和被除数的
10、符号相同,因此第二种结果是8086执行完以后的结果。,H,被除数扩展问题,无论是无符号数还是有符号数除法时,必须满足被除数长度是除数长度的两倍。当不够时,涉及到被除数的扩展。无符号数:被除数的扩展比较简单,添上足够的零就可以了。以下指令将AL中的一个8位无符号数扩展成为16位,存放在AX中。MOV AL,0FBH;(AL)=11111011BXOR AH,AH;(AH)=00000000B 有符号数:被除数的扩展必须根据各自的符号来完成,因此,需要借助指令CBW和CWD完成。,H,CBW把字节转换成字指令,CBW把字节转换成字指令(Convert Byte to Word)格式 CBW。功能
11、把寄存器AL中字节的符号位扩充到AH的所有位。(AH被称为AL的符号扩充),不影响标志位。扩展方法 AL为正数(AL=80H)时,即D7=1时,使AH=0FFH。,H,扩展方法MOV AL,4FH;(AL)=01001111BCBW;由于AL7FH,或者说AL为负数时,符号位为1,AH应补1,因此(AH)=11111111B,CBW把字节转换成字指令,H,CWD把字转换成双字指令,CWD把字转换成双字指令(Convert Word to Double Word)格式 CWD。功能 把寄存器AX中字的符号位扩充到DX的所有位。扩展方法 AX为正数(AX7FFFH)时,即D15=1时,使DX=0F
12、FFFH。,H,CBW和CWD指令在带符号数的乘法(IMUL)和除法(IDIV)运算中十分有用,在字节或字的运算之前,将AL或AX中数据的符号位进行扩展。例如:MOV AL,MUL_BYTE;(AL)8位被乘数(带符号数)CBW;扩展成为16位带符号数,在AX中IMULBX;两个16位带符号数相乘,结果在DX:AX中,CBW和CWD,H,AAD除法的ASCII调整指令,AAD除法的ASCII调整指令(ASCII Adjust for Division)格式 AAD。功能 在做除法之前,将AX中BCD码转换成二进制数并存入AL中。调整过程 AL AH10AL;AH 00。,H,位运算指令(12条
13、),位操作指令是对8位或16位的寄存器或存储单元中的内容按位进行操作。,H,逻辑运算指令,H,NOT取反指令,NOT取反指令(Logical Not)格式 NOT dst。功能 dst dst取反,执行完后不影响标志位。操作数要求可以是8位或16位寄存器、存储器。对于存储器操作,需指明是字还是字节。,H,AND逻辑与指令,AND逻辑与指令(Logical AND)格式 AND dst,src。src可以是立即数。功能 dst dstsrc,执行完后影响标志位。主要用于使操作数的某些位保留(和“1”相与),而使某些位清除(和“0”相与)。操作数要求可以是8位或16位寄存器、存储器,不能同时为me
14、n。对于存储器操作,需指明是字还是字节。,H,OR逻辑或指令,OR逻辑或指令(Logical OR)格式 OR dst,src。src可以是立即数。功能 dst dstsrc,执行完后影响标志位。主要用于使操作数的某些位保留(和“0”相或),而使某些位置1(和“0”相或)。操作数要求可以是8位或16位寄存器、存储器,不能同时为men。对于存储器操作,需指明是字还是字节。,H,AND,OR,NOT举例,举例 MOV AL,35H;AL=0011,0101B AND AL,0FH;0000,1111B,得AL=05H OR AL,70H;0111,0000B,得AL=75H NOT AL;取反得1
15、000,1010B,即AL=8AH,H,XOR异或指令,XOR异或指令(Exclusive OR)格式 XOR dst,src。src可以是立即数。功能 dst dstsrc,执行完后影响标志位。主要用于使操作数的某些位保留(和“0”相异或),而使某些位取反(和“1”相异或)。操作数要求 可以是8位或16位reg、men,不能同时为men。对于存储器操作,需指明是字还是字节。,H,TEST测试指令,TEST测试指令(Test)格式 TEST dst,src。src可以是立即数。功能 dstsrc,执行完后影响标志位。但是与完后的结果不回送。主要用于对某些位数据的检测,编程时,其后往往紧跟条件转
16、移指令。操作数要求可以是8位或16位寄存器、存储器,不能同时为men。对于存储器操作,需指明是字还是字节。,H,逻辑运算指令总结,除了NOT指令外,其他指令都影响状态标志位。这些指令将根据各自逻辑运算的结果影响SF、ZF和PF状态标志位,同时将CF和OF置“0”,但AF的值不确定。,H,算术逻辑移位指令,H,SHL/SAL逻辑/算术左移指令,SHL/SAL逻辑算术左移指令(Shift Logic/Arithmetic Left)格式 SHL/SAL dst,1/CL。功能 将寄存器或存储器中的目的操作数的各位左移,每移一次,最低有效位LSB补0,而最高有效位MSB进入标志位CF。,H,SHL/
17、SAL逻辑算术左移指令,举例MOV AH,06H;SAL AH,1;MOV CL,03HSHL DI,CLSAL BYTE PTRBX,左移一次,相当于乘以2,仅移位一次时,可以直接用立即数表示,否则,移位次数必须送入CL中。,H,AH06H00000110B,将AH的内容左移1次,AH 00001100B,;将DI的内容左移3次,;将内存单元的字节左移1位,SHR逻辑右移指令,SHR逻辑右移指令(Shift Logic Right)格式 SHR dst,1/CL。功能 各位进行右移。每移一次,低位进入CF,最高位补0。,H,SHR逻辑右移指令,说明 若目的操作数为无符号数,每右移一次,目的操
18、作数除以2,余数被丢掉。举例用右移的方法作除法1338165。解:MOV AL,1000 0101B;AL133MOV CL,03H;CL移位次数SHR AL,CL;右移3次指令执行后,AL10H16,余数5被丢失。标志位CF、AF不定。,H,SAR算术右移指令,SAR算术右移指令(Shift Arithmetic Right)格式 SAR dst,1/CL。功能 各位进行右移。每移一次,低位进入CF,最高位保持不变,所谓算术和逻辑的区别就是在右移时,是补符号位还是零。,H,SAR算术右移指令,说明 若目的操作数为带符号数,每右移一次,目的操作数除以2,余数被丢掉。举例用右移的方法作除法-12
19、88-16。解:MOV AL,1000 0000B;AL-128 MOV CL,03H;CL移位次数 SHR AL,CL;右移3次指令执行后,AL1111,0000B0F0H=-16。,H,循环移位指令,H,ROL循环左移指令,ROL循环左移指令(Rotate Left)格式 ROL dst,1/CL。功能 将dst向左循环移动1位或CL寄存器指定的位数。最高位移到进位标志CF,同时,最高位移到最低位形成循环,进位标志CF不在循环回路之内。,H,ROR循环右移指令,ROR循环右移指令(Rotate Right)格式 ROR dst,1/CL。功能 将dst向右循环移动1位或CL寄存器指定的位数
20、。最低位移到进位标志CF,同时最低位移到最高位。,H,RCL通过进位位循环左移指令,RCL通过进位位循环左移指令 Rotate through Carry Left格式 RCL dst,1/CL。功能 将dst连同进位标志CF一起向左循环移动1位或由CL寄存器指定的位数。最高位移入CF,而CF移入最低位。,H,RCR通过进位位循环右移指令,RCR通过进位位循环右移指令 Rotate through Carry Right格式 RCR dst,1/CL。功能 将dst与进位标志CF一起向右循环移动1位,或由CL寄存器指定的位数。最低位移入进位标志CF,CF则移入最高位。,H,利用循环移位指令可以对寄存器或存储器中的任一位进行位测试。例如要求测试AL寄存器中第5位的状态是“0”还是“1”,则可利用以下指令实现:MOVCL,5;(CL)移位次数ROL AL,CL;(CF)AL的第5位JNC ZERO;若(CF)=0,则转ZERO;否则ZERO:,循环移位指令的应用,H,小结,算术类指令的分类与具体功能位运算指令的分类与具体功能,H,本节作业,P121-7,H,