第三章(3)微机原理与接口技术.ppt
39页算术运算指令共有以下五类:算术运算指令共有以下五类:加法运算指令加法运算指令减法运算指令减法运算指令乘法运算指令乘法运算指令除法运算指令除法运算指令转换指令转换指令3.3.2 3.3.2 算术运算指令算术运算指令 1 1、加法与减法指令、加法与减法指令加法指令加法指令 ((ADDADD、、ADCADC、、INCINC)) (1) (1) 不带进位加法指令(不带进位加法指令(ADDADD))格式:格式:ADD DST, SRCADD DST, SRC功能:执行源操作数功能:执行源操作数SRCSRC和目的操作数和目的操作数DSTDST的相加操作,结果放的相加操作,结果放 在目的操作数中在目的操作数中说明:说明:DSTDST必须为累加器、任一通用寄存器或存储器操作数必须为累加器、任一通用寄存器或存储器操作数例:例: ADDADD AL AL,,30H 30H ADD ADD SI SI,,[BX+20H][BX+20H] ADD ADD CX CX,,SISI ADD ADD [DI] [DI],,200H200HADDADD指令对指令对6 6个状态标志均产生影响。
个状态标志均产生影响例:已知例:已知(BX)=0D75FH(BX)=0D75FH,指令,指令 ADD BX ,8046HADD BX ,8046H 执行后,状态标志各是多少?执行后,状态标志各是多少? 0D75FH = 1101 0111 0101 11110D75FH = 1101 0111 0101 1111 8046H = 1000 0000 0100 0110 8046H = 1000 0000 0100 0110 1 1 11 111 1 11 11 0101 0111 1010 0101 0101 0111 1010 0101结果:结果:CF=1, ZF=0, PF=1, AF=1, OF=1, SF=0 (2) (2) 带进位加法指令(带进位加法指令(ADCADC))格式:格式:ADC DSTADC DST,,SRCSRC功能:功能:ADCADC与与ADDADD类似,不同的是将进位标志类似,不同的是将进位标志CFCF 的值加在和中。
的值加在和中 ADD ALADD AL,,50H 50H ADC AX ADC AX,,SI SI 例例: :有两个有两个4 4字节的无符号数相加:字节的无符号数相加: 2C56F8AC+309E47BE=2C56F8AC+309E47BE=?? 因因CPUCPU只能进行只能进行8 8位或位或1616位的加法运算,为此可将位的加法运算,为此可将两数分成两数分成低字低字和和高字高字分别相加分别相加ADCADC指令用于指令用于多字节多字节加法运算中加法运算中56H2CHBEH47HBUFFER1BUFFER2ACHF8H9EH30H被被加加数数加加数数数数据据段段多字节加法多字节加法示意图示意图 ......设被加数、加数设被加数、加数分别存放在分别存放在BUFFER1及及BUFFER2开始的开始的两个存储区内,两个存储区内,结果放回结果放回BUFFER1存储区程序段如下:程序段如下: MOV AXMOV AX,,BUFFER2BUFFER2ADD BUFFER1ADD BUFFER1,,AX AX MOV AXMOV AX,,BUFFER2+2BUFFER2+2ADC BUFFER1+2ADC BUFFER1+2,,AXAX56H2CHBEH47HBUFFER1BUFFER2ACHF8H9EH30H ......;低字相加低字相加;高字相加,高字相加,;包括低字包括低字;的进位的进位ADDADD加法指令和加法指令和ADCADC加法指令原则加法指令原则 1.1.源和目的操作数不能同时为存储器操作数源和目的操作数不能同时为存储器操作数 2.2.源和目的操作数类型必须一致,即都是字源和目的操作数类型必须一致,即都是字 节或都是字节或都是字(3) (3) 自增指令(自增指令(INCINC))格式:格式:INC DSTINC DST功能:将操作数的内容加功能:将操作数的内容加1 1,再送回该操作数。
再送回该操作数例:例: INC ALINC AL INC SI INC SI INC BYTE PTR[BX+4] INC BYTE PTR[BX+4]注:本指令不影响注:本指令不影响CFCF标志 减法指令减法指令不带借位的减法指令不带借位的减法指令SUB((Subtract))带借位的减法指令带借位的减法指令SBB(( Subtract with borrow))自减指令自减指令DEC((Decrement))取负指令取负指令NEG((Negate))比较指令比较指令CMP((Compare))(4) (4) 不带借位的减法指令不带借位的减法指令格式:格式:SUB DSTSUB DST,,SRCSRC功能:将目的操作数减去源操作数,结果放在目的操作功能:将目的操作数减去源操作数,结果放在目的操作 数中,主要完成数中,主要完成2 2个字节或个字节或2 2个字的相减个字的相减注注::1.源和目的操作数不能同时为存储器操作数源和目的操作数不能同时为存储器操作数 2.立即数不能作为目的操作数立即数不能作为目的操作数指令例子:指令例子: SUB AL,,60H SUB [BX+20H],,DX SUB AX,,CX(5) (5) 带借位的减法指令带借位的减法指令格式:格式:SBB DSTSBB DST,,SRCSRC功能:目的操作数减去源操作数的同时,还要减去功能:目的操作数减去源操作数的同时,还要减去CFCF的值。
的值 指令例子:指令例子: SBB AXSBB AX,,2030H2030H SBB AX SBB AX,,CXCX SBB WORD PTR[SI] SBB WORD PTR[SI],,2080H2080H SBB [SI],DX SBB [SI],DX(6) (6) 自减指令自减指令格式:格式:DEC DSTDEC DST功能:使目的操作数减功能:使目的操作数减1 1,再送回到目的操作数中再送回到目的操作数中指令例子:指令例子: DEC CL DEC BYTE PTR[DI+2] DEC SI (7) (7) 取负指令取负指令格式:格式:NEG DSTNEG DST功能:对目的操作数求补码,结果送回目的操作数中功能:对目的操作数求补码,结果送回目的操作数中说明:说明:对对1 1个操作数取补码相当于用个操作数取补码相当于用0 0减去此操作数减去此操作数如果操作数的值为如果操作数的值为-128-128或者或者-32768-32768,那么,执行求补指令后,,那么,执行求补指令后,结果没变化,但结果没变化,但OV=1OV=1。
NEGNEG指令会影响所有状态标志位指令会影响所有状态标志位例:例:NEG ALNEG AL NEG CXNEG CX (8) (8) 比较指令比较指令格式:格式:CMP DSTCMP DST,,SRCSRC功能:执行两个数的相减操作,但不送回相减的结果,功能:执行两个数的相减操作,但不送回相减的结果,只是使结果影响标志位只是使结果影响标志位AFAF、、CFCF、、OFOF、、PFPF、、SFSF和和ZFZF 根据标志位来判断比较的结果根据标志位来判断比较的结果1)1)根据根据ZF判断两个数是否相等若判断两个数是否相等若ZF=1,=1,则两数相等则两数相等2)2)若两个数不相等若两个数不相等, ,则分两种情况考虑则分两种情况考虑: : ① ①比较的是两个无符号数比较的是两个无符号数 若若CF=0,=0,则则destdest>>srcsrc; ; 若若CF=1,=1,则则destdest<<srcsrc ②②比较的是两个有符号数比较的是两个有符号数 若若OF⊕ ⊕SF=0=0,则,则destdest>>srcsrc; ; 若若OF⊕ ⊕SF=1=1,则,则destdest<<srcsrc。
比较指令在使用时,一般在其后紧跟一条比较指令在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向条件转移指令,判断比较结果的转向举例:比较举例:比较ALAL、、BLBL、、CLCL中带符号数的大小,将中带符号数的大小,将 最小数放在最小数放在ALAL中程序:程序: CMP AL,BL CMP AL,BL ;;ALAL和和BLBL比较比较 JNG JNG BBBBBB ;若;若AL≤BL,AL≤BL,则转则转 XCHG AL,BL XCHG AL,BL ;若;若ALAL>>BL,BL,则交换则交换 BBB: CMP AL,CL BBB: CMP AL,CL ;;ALAL和和CLCL比较比较 JNGJNG CCC CCC ;若;若AL≤CL,AL≤CL,则转则转 XCHG AL,CL XCHG AL,CL ;若;若ALAL>>CL,CL,则交换则交换 CCC: HLTCCC: HLT 2 2.乘法指令与除法指令.乘法指令与除法指令 进行乘法时:进行乘法时:8位位× 8位位 → 16位乘积位乘积 16位位× 16位位 → 32位乘积位乘积(1) (1) 无符号数的乘法指令无符号数的乘法指令格式:格式:MUL SRCMUL SRC功能:将功能:将ALAL((8 8位)或位)或AXAX((1616位)中的数据与源操作数相位)中的数据与源操作数相 乘,结果放在乘,结果放在AXAX或或DXDX与与AXAX两寄存器中。
两寄存器中操作:字节操作数操作:字节操作数 (AX) (AL) ×× (src) 字操作数字操作数 (DX, AX) (AX) ×× (src) MUL BL MUL BL ;;ALAL中的中的8 8位数和位数和BLBL中的中的8 8位数相乘,位数相乘, 结果在结果在AXAX中中 MUL CX MUL CX ;;(AX)(AX)××( (CX),CX),乘积在乘积在DX,AXDX,AX中中 MUL BYTE PTR[BX]MUL BYTE PTR[BX](2) (2) 有符号数的乘法指令有符号数的乘法指令格式:格式:IMUL SRCIMUL SRC功能:功能和形式上与功能:功能和形式上与MULMUL很类似,只是要求两个乘数必很类似,只是要求两个乘数必 须均为有符号数须均为有符号数 IMUL BX IMUL BX ;;AXAX和和BXBX中的两个中的两个1616位有符号数相乘,结果位有符号数相乘,结果 在在DXDX和和AXAX中中注意:注意:MUL/IMULMUL/IMUL指令中指令中 AL(AX)AL(AX)为隐含的乘数寄存器;为隐含的乘数寄存器; AX(DX,AX)AX(DX,AX)为隐含的乘积寄存器;为隐含的乘积寄存器; SRCSRC不能为立即数;不能为立即数; 除除CFCF和和OFOF外,对外,对其它其它标志位无定义标志位无定义。
除法指令除法指令ü进行除法时:进行除法时:1616位位/8/8位位 → →8 8位商位商 3232位位/16/16位位→→1616位商位商ü对被除数、商及余数存放有如下规定:对被除数、商及余数存放有如下规定: 被除数被除数 商商余数余数字节除法字节除法 AXAX AL AL AH AH 字除法字除法 DX:AXDX:AX AX AX DX DX1.1.((3 3)无符号数除法指令)无符号数除法指令格式:格式:DIV SRCDIV SRC功能:把功能:把AXAX(或(或DXDX,,AXAX))中的被除数除以中的被除数除以8 8位位 (或(或1616位)源操作数,商数放在位)源操作数,商数放在AL(AL(或或AX)AX)中,中, 余数放在余数放在AH(AH(或或DX)DX)中 DIV CL DIV CL ;;AXAX中的数据除以中的数据除以CLCL中的数据,商中的数据,商 在在ALAL中,余数在中,余数在AHAH中中注:注:若除数为零或若除数为零或AL中商大于中商大于0FFH,(或或AX中商大于中商大于0FFFFH),, 则则CPU产生一个类型产生一个类型0的内部中断。
的内部中断(4) (4) 带符号数除法指令带符号数除法指令格式:格式:IDIV SRCIDIV SRC功能:与功能:与DIVDIV相似,不同的是将除数,被除数,商和余数都看作相似,不同的是将除数,被除数,商和余数都看作是带符号数是带符号数 IDIV BXIDIV BX;将;将DXDX和和AXAX中的中的3232位数除以位数除以BXBX中的中的1616位数,运算位数,运算 后,商在后,商在AXAX中,余数在中,余数在DXDX中中 除法运算时,要求用除法运算时,要求用1616位数除以位数除以8 8位数,或者用位数,或者用3232位数除以位数除以1616位数,当被除数只有位数,当被除数只有8 8位时,必须将此位时,必须将此8 8位数据放在位数据放在ALAL中,并中,并对高对高8 8位位AHAH进行扩展同样,当被除数只有进行扩展同样,当被除数只有1616位,而除数也为位,而除数也为1616位时,必须将位时,必须将1616位被除数放在位被除数放在AXAX中,并对高中,并对高1616位位DXDX进行扩展。
进行扩展3.3.符号扩展指令符号扩展指令(1) (1) 字节扩展指令字节扩展指令格式:格式:CBW CBW 功能:将功能:将ALAL寄存器中的符号位扩展到寄存器中的符号位扩展到AHAH中即当ALAL<<80H80H时,执行时,执行CBWCBW后,后,AH=0AH=0;当;当ALAL>>80H80H时,时,执行执行CBWCBW后,后,AH=FFHAH=FFH2) (2) 字扩展指令字扩展指令格式:格式:CWDCWD功能:用功能:用CWDCWD指令将指令将AXAX中的被除数扩展成双字中的被除数扩展成双字 例例: : 写出写出34H34H÷÷25H25H的程序段的程序段MOV AL,,34H MOV BL,,25H CBW ; AL的符号扩展到的符号扩展到AH DIV BL ; 0034H÷÷25H,25H,结果为结果为 ; (AH)=0FH, (AL)=01H4..BCD码调整指令码调整指令 1 1) )加法的十进制调整指令加法的十进制调整指令( (1 1) )非组合非组合BCDBCD码加法调整码加法调整AAA 本指令对在本指令对在ALAL中的由两个非组合的中的由两个非组合的BCDBCD码相加后码相加后的结果进行调正,得到一个正确的非组合的的结果进行调正,得到一个正确的非组合的BCDBCD码。
码AAAAAA指令只影响指令只影响AFAF和和CFCF,,其余标志无定义其余标志无定义AAAAAA指令应紧跟在指令应紧跟在ADDADD或或ADCADC指令之后指令之后AAAAAA指令的操作如下:指令的操作如下:如果如果ALAL的低的低4 4位>位>9 9∨∨AF=1AF=1,,则:则: ① ① ALAL←(AL)+6,(AH)←(AH)+1,AF←1←(AL)+6,(AH)←(AH)+1,AF←1 ② AL ② AL←((AL)∧0FH)←((AL)∧0FH) ③ CF ③ CF←AF←AF否则否则AL←(AL)∧0FHAL←(AL)∧0FH调整原理:先看一个例子调整原理:先看一个例子 计算计算8 8++9 0000 10009 0000 1000 见右式见右式 +0000 1001 +0000 1001 000 0001 1 0001 0001 == 1111 结果应为结果应为1717,而计算机相加为,而计算机相加为1111,,原因在于运算过程中,如遇原因在于运算过程中,如遇到低到低4 4位往高位往高4 4位产生进位时(此时位产生进位时(此时AF=1AF=1))是按逢十六进一的规是按逢十六进一的规则,但则,但BCDBCD码要求逢十进一,因此只要产生进位,个位就会少码要求逢十进一,因此只要产生进位,个位就会少6 6,这就要进行加,这就要进行加6 6调正。
调正这个这个1代表了代表了16,而实际上,而实际上仅应为仅应为10,即多进了,即多进了6 实际上当低实际上当低4 4位的结果>位的结果>9(9(即即A A~~F F之间之间) )时,也应进时,也应进行加行加6 6调正 (原因是逢十没有进位,故用加原因是逢十没有进位,故用加6 6的方法的方法强行产生进位强行产生进位) ) 如对上例的结果进行加如对上例的结果进行加6 6:: 0001 0001 00010001 1111 + 0000 0110 + 0000 0110 6 6 0001 0111 0001 0111 17 17 结果正确结果正确( (2 2) )组合组合BCDBCD码加法调整码加法调整DAADAA两个组合两个组合BCDBCD码相加结果在码相加结果在ALAL中,通过中,通过DAADAA调整得到一调整得到一个正确的组合个正确的组合BCDBCD码指令操作指令操作( (调整方法调整方法) ):: 若若ALAL的低的低4 4位>位>9 9∨∨AF=1AF=1 则则(AL)(AL)←(AL)+6←(AL)+6,,AF←1AF←1 若若ALAL的高的高4 4位>位>9 9∨∨CF=1CF=1 则则(AL)(AL)←(AL)+60H←(AL)+60H,,CF←1CF←1除除OFOF外,外,DAADAA指令影响所有其它标志。
指令影响所有其它标志DAADAA指令应紧跟在指令应紧跟在ADDADD或或ADCADC指令之后指令之后例:例:48+74=? 48+74=? 0100 1000 48H0100 1000 48H MOV ALMOV AL,,48H 48H + 0111 0100+ 0111 0100 74H74H MOV BLMOV BL,,74H 1011 1100 BCH74H 1011 1100 BCH ADD AL ADD AL,,BL BL + 0110 0110+ 0110 0110 66H66H DAA DAA 1 1 0010 0010 0010 0010 1 1 22H 22H ( (进位进位) ) ( (进位进位) ) 执行执行ADDADD后,后,( (AL)=BCHAL)=BCH,,高高4 4位低位低4 4位均大于位均大于9 9,故,故DAADAA指令指令执行加执行加66H66H调整,最后结果为:调整,最后结果为: (AL)=22H, CF=1, AF=1(AL)=22H, CF=1, AF=1(1)(1)非组合非组合BCDBCD码减法的十进制调整指令码减法的十进制调整指令AASAAS 对对ALAL中由两个非组合的中由两个非组合的BCDBCD码相减的结果进行调整。
调整操作为:码相减的结果进行调整调整操作为: 若若ALAL的低的低4 4位>位>9 9或或AF=1,AF=1,则:则: ① ① AL←(AL)-6,AH←(AH)-1,AF←1AL←(AL)-6,AH←(AH)-1,AF←1 ② AL←(AL)∧0FH ② AL←(AL)∧0FH ③ CF←AF ③ CF←AF 否则:否则:AL←(AL)∧0FHAL←(AL)∧0FH2)2)减法的十进制调整指令减法的十进制调整指令举例:举例:16-8=?16-8=? MOV AX,0106H 0000 0110 06 MOV AX,0106H 0000 0110 06 MOV BL,08H MOV BL,08H - 0000 1000- 0000 1000 - 08 - 08 SUB AL,BL SUB AL,BL 1111 1110 FE 1111 1110 FE AAS AAS - 0000 0110- 0000 0110 - 06- 06 1111 1000 F8 1111 1000 F8 ∧0000 1111∧0000 1111 ∧0F∧0F 0000 1000 08 0000 1000 08结果为:结果为:(AL)=08H,(AH)=0,(AL)=08H,(AH)=0,((CFCF))= =((AFAF))=1=1(2)(2)组合组合BCDBCD码减法的十进制调整指令码减法的十进制调整指令DASDAS 对对ALAL中由两个组合中由两个组合BCDBCD码相减的结果进行调整。
调整操作为:码相减的结果进行调整调整操作为: 若若ALAL的低的低4 4位>位>9 9∨∨AF=1,AF=1,则:则: AL←(AL)-6, AL←(AL)-6, 且且AF←1AF←1 若若ALAL的高的高4 4位>位>9 9∨∨CF=1,CF=1,则:则: AL←(AL)-60HAL←(AL)-60H,且,且CF←1CF←1ØDASDAS对对OFOF无定义无定义, ,但影响其余标志位但影响其余标志位ØDASDAS指令要求跟在减法指令之后指令要求跟在减法指令之后3) 3) 乘法调整指令乘法调整指令AAMAAM 对对AXAX中由两个非组合中由两个非组合BCDBCD码相乘的结果进行调整调整码相乘的结果进行调整调整操作为:操作为: (AL)/0AH, (AH)←(AL)/0AH, (AH)←商,商,(AL)←(AL)←余数余数Ø隐含的操作寄存器为隐含的操作寄存器为AL和和AH;;ØAAM跟在跟在MUL指令之后使用;指令之后使用;Ø影响标志位影响标志位PF、、SF、、ZF,,其它其它无定义无定义;Ø用用AAM可实现可实现≤≤9999的二的二- -十进制转换。
十进制转换例例1 1:按十进制乘法计算:按十进制乘法计算7 7××8=?8=? 程序段如下:程序段如下:MOVMOV AL,07HAL,07H;;(AL)=07H(AL)=07HMOVMOV CL,08HCL,08H;;(CL)=08H(CL)=08HMULMUL CLCL;;(AX)=0038H(AX)=0038HAAMAAM;;(AH)=05H,(AL)=06H (AH)=05H,(AL)=06H 所得结果为非组合的所得结果为非组合的BCDBCD码例例2 2:把:把3AH3AH转换成等值的十进制数转换成等值的十进制数 MOV ALMOV AL,,3AH 3AH ;;5858 AAM AAM ;;(AH)=05H(AH)=05H,,(AL)=08H(AL)=08H4) 4) 除法调整指令除法调整指令AADAAD对非组合对非组合BCD除法运算进行调整调整操作为:除法运算进行调整调整操作为: (AL)←(AH)(AL)←(AH)××0AH0AH++(AL)(AL) AH ← 0 AH ← 0Ø隐含的操作寄存器为隐含的操作寄存器为AH,,AL;;ØAAD要在要在DIV指令指令之前之前使用;使用;Ø影响标志位影响标志位PF、、SF、、ZF,其它,其它无定义无定义;Ø用用AAD可实现可实现≤≤9999的十的十- -二进制转换。
二进制转换例例1:按十进制除法计算:按十进制除法计算55÷÷7=? 程序段如下:程序段如下:MOV AX, 0505H ;;(AX)=55BCDMOV CL, 07H;;(CL)= 7AAD;;(AX)=0037H DIVCL;;(AH)=6, (AL)=7 所得结果为非组合的所得结果为非组合的BCD码(商码(商7余余6)例例2:把:把73转换成等值的二进制数转换成等值的二进制数 MOV AX, 0703H ;;(AX)= 73BCD AAD ;;(AX)=0049H。





