《算术运算指令》PPT课件.ppt

上传人:牧羊曲112 文档编号:5565421 上传时间:2023-07-28 格式:PPT 页数:48 大小:1.64MB
返回 下载 相关 举报
《算术运算指令》PPT课件.ppt_第1页
第1页 / 共48页
《算术运算指令》PPT课件.ppt_第2页
第2页 / 共48页
《算术运算指令》PPT课件.ppt_第3页
第3页 / 共48页
《算术运算指令》PPT课件.ppt_第4页
第4页 / 共48页
《算术运算指令》PPT课件.ppt_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《《算术运算指令》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《算术运算指令》PPT课件.ppt(48页珍藏版)》请在三一办公上搜索。

1、1,3.3.2 算术运算指令,涉及两种类型数据:无符号数和有符号数。对加减法指令,无符号和有符号数可采用同一套指令,但应注意:参加的操作数必须都是无符号数或都是有符号数。需使用不同的标志位(CF,OF)来检查无符号数和有符号数的运算结果是否溢出。这类指令一般都影响标志寄存器FLAGS。,2,表4-2 算术运算类指令表,3,两个8位数相加时有4种情况:,无符号数和有符号数均不溢出二进制相加 无符号数加 有符号数加 0000 1000 8+8+0001 1110+30+(+30)0010 0110 38+38 结果38 CF=0 OF=0,无符号数范围0255 带符号数范围-128127,4,无符

2、号数溢出 无符号数 有符号数 0000 1000 8+8+1111 1101+253+(-3)10000 0101 261+5 结果5 CF=1 OF=0 有符号数溢出 0000 1000 8+8+0111 1101+125+(+125)1000 0101 133+133结果-123 CF=0 OF=1(补码表示),5,无符号数和有符号数均溢出 无符号数 有符号数 1000 1000 136-120+1111 0111+247+(-9)10111 1111 383-129 结果127 CF=1 OF=1 上面四种情况说明,CF标志可用来表示无符号数的溢出,OF标志可用来表示有符号数的溢出。有符

3、号数的溢出是一种出错状态,在运算过程中应当避免。,6,所有的算术运算指令,都会影响FLAGS标志寄存器的6个状态标志CF/OF/ZF/SF/AF/PF(3个控制标志IF/DF/TF不受影响)。总的讲,有这样一些规则:当无符号数运算产生溢出(即最高位向前有进位 或借位)时,CF=1,否则为0;当有符号数运算产生溢出时,OF=1(即OF=CFCF-1),否则为0;当运算结果为0时,ZF=1,否则为0;当运算结果为负数时,SF=1,否则为0;当运算一半位置有进位或借位时,AF=1,否则为0;当运算结果中有偶数个时,PF=1,否则为0。,7,共有5条:(1)不带进位的加法指令ADD 格式:ADD ac

4、c,data ADD mem/reg,data ADD mem/reg1,mem/reg2注:1.源和目的操作数不能同时为存储器操作数 2.不能把段寄存器作为操作数例:ADDAL,30H ADDAX,BX+20H ADDCX,SI ADDDI,200HADD指令对标志位(指6个状态标志)都有影响。,1.加法指令,8,(2)带进位位的加法指令ADC,ADC指令在形式上和功能上都有与ADD类似,只是相加时还要包括进位标志CF的内容。例如:ADC AL,68H;AL(AL)+68H+(CF)ADC AX,CX;AX(AX)+(CX)+(CF)ADC BX,DI;BX(BX)+DI+1DI+(CF),

5、9,例:有两个4字节的无符号数相加:2C 56 F8 AC+30 9E 47 BE=?设被加数、加数分别存放在BUFFER1及BUFFER2开始的两个存储区内,结果放回BUFFER1存储区,如下页图所示。因CPU只能进行8位或16位的加法运算,为此可将加法分4次进行。,ADC指令主要用于多字节加法运算中,10,56H,2CH,BEH,47H,BUFFER1,BUFFER2,ACH,F8H,9EH,30H,被加数,加数,数据段,多字节加法示意图,.,.,11,程序段如下:MOV CX,4;置循环次数 MOV SI,0;置SI初值为零 CLC;清进位标志CFLL:MOV AL,BUFFER2SI

6、ADC BUFFER1SI,AL;带进位加 INC SI;(SI)+1 DEC CX;(CX)-1 JNZ LL;若(CX)0,则转LL思考:若最高位有进位,如何改?,12,ADD/ADC指令对条件标志位(CF/OF/ZF/SF)的影响:,CF位表示无符号数相加的溢出。OF位表示带符号数相加的溢出。,13,格式:INC reg/mem功能:类似于C语言中的+操作:对指定的操作数加1 例:INC AL INC SI INC BYTE PTRBX+4注意:本指令不影响CF标志,但对AF/OF/PF/SF/ZF会产生影响。,3)加1指令INC(单操作数指令),14,(1)不考虑借位的减法指令SUB

7、格式:SUB dest,src 操作:dest(dest)-(src)注:1.源和目的操作数不能同时为存储器操作数 2.不能把段寄存器作为操作数指令例子:SUB AL,60H SUB BX+20H,DX SUB AX,CX,2.减法指令,15,SBB指令主要用于多字节的减法。格式:SBB dest,src操作:dest(dest)-(src)-(CF)指令例子:SBB AX,CX SBB WORD PTRSI,2080H SBB SI,DX,(2)考虑借位的减法指令SBB,16,例:x、y、z均为32位数,分别存放在地址为X,X+2;Y,Y+2;Z,Z+2的存储单元中,用指令序列实现wx+y+

8、24-z,结果放在W,W+2单元中。MOV AX,X MOV DX,X+2 ADD AX,Y ADC DX,Y+2;x+y ADD AX,24 ADC DX,0;x+y+24 SUB AX,Z SBB DX,Z+2;x+y+24-z MOV W,AX MOV W+2,DX;结果存入W,W+2单元,17,作用类似于C语言中的”操作符。格式:DEC opr 操作:opr(opr)-1指令例子:DEC CL DEC BYTE PTRDI+2 DEC SI,(3)减1指令DEC,注:该指令与INC一样,它不影响CF标志,但对AF/OF/PF/SF/ZF会产生影响。,18,格式:NEG opr操作:op

9、r 0-(opr)对一个操作数取补码相当于用0减去此操作数,故利用NEG指令可得到负数的绝对值。例:若(AL)=0FCH,则执行 NEG AL后,(AL)=04H,CF=1 本例中,0FCH为-4的补码,执行求补指令后,即得到4(-4的绝对值)。,(4)求补指令NEG,19,SUB/SBB指令对标志位(CF/OF/ZF/SF)的影响:,CF=1表示无符号数减法溢出。OF=1表示带符号数减法溢出。NEG指令对CF/OF的影响:CF:操作数为0时,求补的结果使CF=0,否则CF=1。OF:字节运算对-128求补或字运算对-32768求补时OF=1,否则OF=0。,20,格式:CMP dest,sr

10、c操作:dest(dest)-(src)(而 SUB dest,src;dest(dest)-(src))CMP也是执行两个操作数相减,但结果不送目标操作数,其结果只反映在标志位上。指令例子:CMP AL,0AH CMP CX,SI CMP DI,BX+03,(5)比较指令CMP,21,根据标志位来判断比较的结果,1)根据ZF判断两个数是否相等。若ZF=1,则两数相等。2)若ZF=0,则两个数不相等,则分两种情况考虑:比较的是两个无符号数 若CF=0,则destsrc;若CF=1,则destsrc。比较的是两个有符号数 若OFSF=0,则destsrc;若OFSF=1,则destsrc。,22

11、,比较指令在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向。举例:比较AL、BL、CL中带符号数的大小,将 最小数放在AL中。程序:CMP AL,BL;AL和BL比较 JNG BBB;若ALBL,则转 XCHG AL,BL;若ALBL,则交换 BBB:CMP AL,CL;AL和CL比较 JNG CCC;若ALCL,则转 XCHG AL,CL;若ALCL,则交换 CCC:HLT,思考:程序的结果?(AL、BL、CL中数据的大小顺序),23,进行乘法时:8位 8位 16位乘积(即 AL mem8/reg8 AX)16位 16位 32位乘积(即 AX mem16/reg16 DX AX)

12、(1)无符号数的乘法指令MUL mem/reg格式:MUL src操作:字节操作数(AX)(AL)(src)字操作数(DX,AX)(AX)(src)指令例子:MUL BL;(AL)(BL),乘积在AX中 MUL CX;(AX)(CX),乘积在DX,AX中 MUL BYTE PTRBX,3.乘法指令,24,格式与MUL指令类似,只是要求两操作数均为有符号数。指令例子:IMUL BL;(AX)(AL)(BL)IMUL WORD PTRSI;(DX,AX)(AX)(SI+1SI),(2)有符号数乘法指令IMUL,注意:MUL/IMUL指令中 AL(AX)为隐含的乘数寄存器;AX(DX,AX)为隐含的

13、乘积寄存器;SRC不能为立即数;除CF和OF外,对其它标志位无定义。,25,MUL/IMUL乘法指令对CF/OF的影响:,例:(AL)=A5H(-5B),(BL)=11H(1)IMUL BL;(AX)(AL)(BL);A511-5B11=-060B F9F5;(AX)=F9F5H CF=OF=1(2)MUL BL;(AX)(AL)(BL);A511=0AF5;(AX)=0AF5H CF=OF=1,26,4.除法指令,进行除法时:16位/8位 8位商及8位余数 32位/16位 16位商及16位余数对被除数、商及余数存放有如下规定:被除数 商 余数字节除法 AX AL AH 字除法 DX:AX A

14、X DX,27,格式:DIV src操作:字节操作(AL)(AX)/(src)的商(AH)(AX)/(src)的余数 字操作(AX)(DX,AX)/(src)的商(DX)(DX,AX)/(src)的余数指令例子:DIV CL DIV WORD PTRBX注:若除数为零或AL中商大于FFH(或AX中商大于FFFFH),则CPU产生一个类型0的内部中断。,(1)无符号数除法指令DIV,28,(2)有符号数除法指令IDIV,格式:IDIV src 操作与DIV类似。商及余数均为有符号数,且余数符号总是与被除数符号相同。CBW与CWD两指令主要用于被除数扩展注意:对于DIV/IDIV指令 AX(DX,

15、AX)为隐含的被除数寄存器。AL(AX)为隐含的商寄存器。AH(DX)为隐含的余数寄存器。src不能为立即数。对所有FLAGS的状态标志位均无定义。,29,运算要求被除数字长是除数字长的两倍,若不满足则需对被除数进行扩展,否则产生错误。8位16位 16位32位 ALAX(AH AL)AXDX AX 对无符号数除法扩展,只需将AH或DX清零即可。对有符号数而言,则是符号位的扩展。可使用符号扩展指令CBW和CWD,关于除法操作中的字长扩展问题,30,例:写出两带符号数34H25H的程序段。,MOV AL,34H MOV BL,25H CBW;AL的符号扩展到AH IDIV BL;0034H25H,

16、结果为;(AH)=0FH,(AL)=01H,31,*5.BCD码运算的十进制调整指令,专用于对BCD码运算的结果进行调整 包括:AAA、DAA、AAS、DAS、AAM、AAD 均为隐含寻址,隐含的操作数为AL和AH 为何要对BCD码的运算结果进行调整?BCD码本质上是十进制数,即应遵循逢十进一的规则。而计算机是按二进制(十六进制)进行运算,并未按十进制规则进行运算。,32,1)加法的十进制调整指令,(1)非压缩BCD码加法调整AAA 本指令对在AL中的由两个未组合的BCD码相加后的结果进行调正,得到一个正确的未组合的BCD码。注意:AAA指令只影响AF和CF,其余标志无定义。AAA指令应紧跟在

17、ADD或ADC指令之后。,33,如果AL的低4位9AF=1,则:AL(AL)+6,(AH)(AH)+1,AF1 AL(AL)0FH)CFAF否则AL(AL)0FH,AAA指令的操作如下:,34,调整原理:先看一个例子 计算89 0000 1000+0000 1001 0001 0001 11 而计算机相加为11,原因在于运算过程中,如遇到低4位往高4位产生进位时(此时AF=1)是按逢十六进一的规则,但BCD码要求逢十进一,因此只要产生进位,个位就会少6,这就要进行加6调正。,这个1代表了16,而实际上仅应为10,即多进了6。,35,实际上当低4位的结果9(即AF之间)时,也应进行加6调正(原因

18、是逢十没有进位,故用加6的方法强行产生进位)。如对上例的结果进行加6:0001 0001 11+0000 0110 6 0001 0111(压缩式)17 0000 1111-0000 0001 0000 0111(非压缩式),调整方法:如果AL的低4位9AF=1,则:AL(AL)+6,(AH)(AH)+1,AF1 AL(AL)0FH)CFAF否则AL(AL)0FH,36,例2:有两个字符串形式的十进制数,2658和 3619,求二者之和。即2658+3619=?由题意知,被加数和加数的每一位都以ASCII码(与非压缩BCD码区别)形式存放在内存中。假定二数在内存中均是低位在前,高位在后,另留出

19、5个单元存放相加的结果。内存中数据存放形式见下页图。,37,36H,32H,39H,31H,STRING1,STRING2,38H,35H,36H,33H,被加数,加数,数据段,8,5,6,2,9,1,6,3,SUM,结果,.,.,非压缩BCD码3改为0,SI,DI,BX,CX,CX,CX,38,程序段为:LEA SI,STRING1;STRING1偏移地址送SI LEA DI,STRING2;STRING2偏移地址送DI LEA BX,SUM;SUM偏移地址送BX MOV CX,4;循环4次 CLC;清进位标志AGAIN:MOV AL,SI ADC AL,DI;带进位加 AAA;未压缩BCD

20、码调正 MOV BX,AL;结果存入SUM INC SI;调整指针 INC DI INC BX DEC CX;循环计数器减1 JNZ AGAIN;若未处理完,则转AGAIN,39,思考题:(1)根据程序写出结果SUM的值。(2)若最高位有进位,程序如何修改?(3)从此例不难看出,用AAA指令也可对字符串形式的十进制数加法进行调整,所以它又被称为加法的ASCII调正指令。为什么AAA指令既可对非压缩BCD码加法进行调整,也可对ASCII码形式的十进制数进行调整?(注意AAA指令的第步),40,(2)压缩BCD码加法调整DAA,两个压缩BCD码相加结果在AL中,通过DAA调整得到一个正确的压缩BC

21、D码.指令操作(调整方法):若AL的低4位9AF=1 则(AL)(AL)+6,AF1 若AL的高4位9CF=1 则(AL)(AL)+60H,CF1 DAA指令影响除OF外所有其它标志。DAA指令应紧跟在ADD或ADC指令之后。,41,例:48H+74H=?0100 1000 48 MOV AL,48H+0111 0100 74 MOV BL,74H 1011 1100 BC ADD AL,BL+0110 0110 66 DAA 1 0010 0010 1 22(进位)(进位)执行ADD后,(AL)=BCH,高4位低4位均大于9,故DAA指令执行加66H调整,最后结果为:(AL)=22H,CF=

22、1,AF=1,42,(1)非压缩BCD码减法的十进制调正指令AAS 对AL中由两个非压缩的BCD码相减的结果进行调整。调整操作为:若AL的低4位9或AF=1,则:AL(AL)-6,AH(AH)-1,AF1 AL(AL)0FH CFAF 否则:AL(AL)0FH,2)减法的十进制调整指令,43,举例:16-8=?MOV AX,0106H 0000 0110 06 MOV BL,08H-0000 1000-08 SUB AL,BL 1111 1110 FE AAS-0000 0110-06 1111 1000 F8 0000 1111 0F 0000 1000 08结果为:(AL)=08H,(AH

23、)=0,CF=AF=1,44,(2)压缩BCD码减法的十进制调正指令DAS 对AL中由两个压缩BCD码相减的结果进行调整。调整操作为:,若AL的低4位9AF=1,则:AL(AL)-6,且AF1 若AL的高4位9CF=1,则:AL(AL)-60H,且CF1 注意:AAS、DAS对标志位的影响与AAA、DAA相同。AAS、DAS指令要求紧跟在减法指令SUB或SBB之后。,45,3)乘法的十进制调正指令AAM 对AX中由两个非压缩BCD码相乘的结果进行调整。调整操作为:(AL)/0AH,(AH)商,(AL)余数注意:隐含的操作寄存器为AL和AH;AAM紧跟在MUL指令之后使用;影响标志位PF、SF、

24、ZF,其它无定义;用AAM可实现99的二-十进制转换。,46,例1:按十进制乘法计算78=?程序段如下:MOVAL,07H;(AL)=07HMOVCL,08H;(CL)=08HMULCL;(AX)=0038HAAM;(AH)=05H,(AL)=06H 所得结果为非压缩的BCD码。例2:把3AH转换成等值的十进制数。MOV AL,3AH;58 AAM;(AH)=05H,(AL)=08H,47,4)除法的十进制调正指令AAD,对非压缩BCD除法运算进行调整。调整操作为:(AL)(AH)0AH(AL)AH 0注意:隐含的操作寄存器为AH,AL;AAD要在DIV指令之前使用;影响标志位PF、SF、ZF,其它无定义;用AAD可实现99的十-二进制转换。,48,例1:按十进制除法计算557=?程序段如下:MOVAX,0505H;(AX)=55BCDMOVCL,07H;(CL)=7AAD;(AX)=0037H DIVCL;(AH)=6,(AL)=7 所得结果为非压缩的BCD码(商7余6)。例2:把73转换成等值的二进制数。MOV AX,0703H;(AX)=73BCD AAD;(AX)=0049H,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号