【文档说明】汇编语言之第6章课件.ppt,共(31)页,111.501 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44809.html
以下为本文档部分文字说明:
2022/11/248086/8088宏汇编语言程序设计第6章算术运算十进制运算乘除法运算开平方运算多精度运算(自学内容)2022/11/248086/8088宏汇编语言程序设计算术运算6.1十进制数运算在前面学习的算术运算指令都是以二进制数为操作
数的。而在实际生活中,主要是使用十进制数据的,因此程序中接收的原始数据一般都是十进制数据,而用户也希望程序输出的也是习惯的十进制数。可以通过两种方法来实现:1、通过数制转换2、直接进行十进制数运算有两种选择:
(1)设置专门的十进制运算指令(2)先用二进制运算指令完成运算,然后再对结果进行校正。8086/8088CPU采用这种方案。2022/11/248086/8088宏汇编语言程序设计十进制数运算在计算机中,用4位二进制数表示一位
十进制数的表示方法称为二-十进制数,即BCD码。8086/8088指令系统把BCD码分为两种格式:组合型(压缩型、装配型、PACKED)和非组合型(非压缩型、拆散型、UNPACKED。组合型:一个字节表示两个BCD码,即两位十进制数用一个字节表示。其中高4位表示BC
D码的高位,低4位表示BCD码的低位。非组合型:一个字节的低4位表示一个BCD码,高4位通常为0000或0011等,它对该字节所表示的十进制数无影响。2022/11/248086/8088宏汇编语言程序设计十进制数运
算例:写出(3590)10的压缩BCD码和非压缩BCD码,并分别把它们存入数据区PAKED和UNPAK压缩BCD:(3590)10=(0011010110010000)BCD非压缩BCD:(3590)10=(0
0000011000001010000100100000000)BCDPAKED90H35HUNPAK00H09H05H03H2022/11/248086/8088宏汇编语言程序设计BCD码校正指令一、BCD码校正指令8086/8088指令系统共有6条BCD码校正指令。其中加减法校
正各有两条,乘除法各有一条。1、非组合型加法校正指令AAA指令格式:AAA在执行AAA指令前,已用ADD指令或ADC指令完成加法,且加法结果存放在AL中。执行AAA指令对AL中的数据进行校正,其结果存放在AL中,向高位的进位在AH和CF中。校正方法:若AL中低4位的数>
9,或AF=1,那么(AL)=(AL)+6,(AH)=(AH)+1,且AL中高4位清零,AF、CF置1。2022/11/248086/8088宏汇编语言程序设计BCD码校正指令例如执行指令序列:ADDAL,BLAAA(1)(AL)=2=(0000001
0)BCD,(BL)=7=(00000111)BCD00000010+0000011100001001执行ADD指令后AL低4位的值为9,AF=0,所以AL中就是非压缩型BCD码,不需要校正,执行AAA指令
后AL,AH中的值都不改变。2022/11/248086/8088宏汇编语言程序设计(2)(AL)=5=(00000101)BCD,(BL)=7=(00000111)BCD00000101+00000
11100001100执行ADD指令后AL低4位的值为12>9,AF=0,执行AAA指令(AL)=(AL)+600001100+0000011000010010AL高4位清零:00000010AH置1:00000001ZF标志位置1最后在AH,AL中获得非组合BCD码的和
数(AH)=01H,(AL)=02H2022/11/248086/8088宏汇编语言程序设计(2)(AL)=9=(00001001)BCD,(BL)=7=(00000111)BCD00001001+0000011100010
000执行ADD指令后(AL)=0,AF=1,执行AAA指令(AL)=(AL)+600010000+0000011000010110AL高4位清零:00000110AH置1:00000001ZF标志位置
1最后在AH,AL中获得非组合BCD码的和数(AH)=01H,(AL)=06H2022/11/248086/8088宏汇编语言程序设计BCD码校正指令2、组合型加法校正指令DAA在执行DAA指令前,已用ADD指令或ADC指令完成加法,且加法结果
存放在AL中。执行DAA指令对AL中的数据进行校正,校正结果存放在AL中,向高位的进位仅在CF中。校正法则:(1)如果AL中低4位>9或AF=1,那么(AL)=(AL)+6,AF=1。(2)如果AL中高4位>9或CF=1,那么(AL)=(AL)+
60H,CF=1。2022/11/248086/8088宏汇编语言程序设计BCD码校正指令3、非组合型减法校正指令AAS在执行AAS指令前,已用SUB指令或SBB指令完成减法,且减法结果存放在AL中。执行AAS指令对AL中的数据进行校正,校正结果存放在
AL中,向高位的借位存放在AH和CF中。校正法则:如果AL中低4位>9或AF=1,那么(AL)=(AL)-6,(AH)=(AH)-1,并把AL中的高4位清零,CF、AF均置1。2022/11/248086/8088宏汇编语言程序设计BC
D码校正指令4、组合型加法校正指令DAS在执行DAS指令前,已用SUB指令或SBB指令完成减法,且减法结果存放在AL中。执行DAS指令对AL中的数据进行校正,校正结果存放在AL中,向高位的借位仅在CF中。校正法则:(1)如果AL中低4位
>9或AF=1,那么(AL)=(AL)-6,AF=1。(2)如果AL中高4位>9或CF=1,那么(AL)=(AL)-60H,CF=1。2022/11/248086/8088宏汇编语言程序设计十进制数运算例:编制一程序实现非组合BCD码减法运算,并显示运算结果
。设有两个3位10进制数(非组合BCD码)S1和S2,它们分别存放在NUM1和NUM2为首址的存储单元中(低字节存放高位,高地址存放高位)两数相减时,如果S1≥S2,就进行S1-S2减法,运算结果的前导符号为+,如果S1<S2,就进行S2-S1减法,运算结果的前导符
号为-,。运算结果以ASCII码的形式表示,并存放在RESULT为首址的字单元中,调用DOS系统功能子程序的09号功能把结果显示出来。程序流程图(P111图6.1)源程序:2022/11/248086/8088宏汇编语言程序设计TITLEDECIMALSUBTRA
CTIONDATASEGMENTNUM1DB2,1,5;十进制数215NUM2DB2,8,6;十进制数286RESULT0DB‘THERESULTIS:’RESULTDB4DUP(0);存放结果DATAENDSSTACK1SEGMENTPARA
STACKDW20HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1BEING:MOVAX,DATAMOVDS,AX2022/11/248086/808
8宏汇编语言程序设计LEASI,NUM1+2;置被减数低位指针LEADI,NUM2+2MOVAH,‘+’;置结果前导符号XORBX,BXMOVCX,3;置相减位数LOP1:MOVAL,NUM1[BX]CMPAL,NUM2[BX]JZNE
XT1;如果相等转移JNCNEXT2;如果S1>S2转移MOVAH,’-’;修改结果前导符号XCHGSI,DI;交换减数和被减数NEXT1:INCBXLOOPLOP1NEXT2:MOVRESULT,AH;存结果符号LEABX,RESULT+3;置存放结果指针MOVCX,3CLC2
022/11/248086/8088宏汇编语言程序设计LOP2:MOVAL,[SI];从低位开始,逐位相减SBBAL,[DI]AASLAHF;暂存高位借位ORAL,30H;形成ASCII码MOV[BX],AL;存结果SAHFDECSIDECDIDECBXLOO
PLOP2LEADX,RESULT0MOVAH,09HINT21HMOVAH,4CHINT21HCODEENDSENDBEING2022/11/248086/8088宏汇编语言程序设计6.2乘除法运算字节/字扩展
指令字节扩展指令:CBW字扩展指令:CWD这两条指令均是无操作数指令。CBW指令隐含使用AX,CWD隐含使用DX。指令功能:CBW指令扩展AL中符号位至AH中CWD指令扩展AX中符号位至DX中这两条指令主要应用在除法指令前,形成双倍长度的除数。它们对标志寄存器无影响。202
2/11/248086/8088宏汇编语言程序设计6.2乘除法运算8086/8088指令系统分别有无符号数和带符号数的乘除法指令。1、乘法指令无符号数乘法指令:MULSRC带符号数乘法指令:IMULS
RC乘法指令根据操作数的长度来执行操作:对于字节操作数(AX)(AL)*(SRC)字操作数(DX,AX)(AX)*(SRC)注意:(1)AL(AX)为隐含的乘数寄存器。(2)AX(DX,AX)为隐含的乘积寄存器。(3)SRC不能为立即数。(4)除CF和O
F外,对其它状态标志位无定义。2022/11/248086/8088宏汇编语言程序设计乘法指令00乘积的高一半为零11否则MUL指令:CF,OF=00乘积的高一半是低一半的符号扩展11否则IMUL指令:CF,OF=例:(AX)=16A5H,(BX)=0611H(1)IMULBL;(AX)
(AL)*(BL);A5*11F9F5;(AX)=0F9F5HCF=OF=1(2)MULBX;(DX,AX)(AX)*(BX);16A5*0611=00895EF5;(DX)=0089H(AX)=5EF5HCF=OF=12022/11/248
086/8088宏汇编语言程序设计除法指令无符号数除法指令:DIVSRC带符号数除法指令:IDIVSRC执行操作:字节操作(AL)(AX)/(SRC)的商(AH)(AX)/(SRC)的余数字操作(AX)(DX,AX)/(SRC)的商
(DX)(DX,AX)/(SRC)的余数注意:AX(DX,AX)为隐含的被除数寄存器。AL(AX)为隐含的商寄存器。AH(DX)为隐含的余数寄存器。SRC不能为立即数。对所有状态标志位均无定义。2022/11/248086/8088宏汇编语言程序设计例1、试编制一个计算XY的程
序。假设X、Y为数据段的两变量,且XY≤65535。分析:在8086/8088指令系统中没有设置乘方运算指令,因此只能将乘方运算转换成乘法运算。源程序:DATASEGMENTXDW5YDW6POWEDW?DAT
AENDSSTACK1SEGMENTPARASTACKDW10HDUP(0)STACK1ENDS2022/11/248086/8088宏汇编语言程序设计CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1ST
ART:MOVAX,DATAMOVDS,AXMOVAX,XMOVCX,YDECCXJEEXIT;指数为1则转移MOVDX,0LOP:MULXLOOPLOPEXIT:MOVPOWE,AX;存结果MOVAH,4CHINT2
1HCODEENDSENDSTART2022/11/248086/8088宏汇编语言程序设计例:试编制一程序,找出从2开始的N个质数。问题分析:质数就是只能被1和本身整除的整数。偶数肯定不是质数,而2,3都是质数,从5开始判断寻找质数。流程图:P126图6.5源程序:T
ITLE求质数程序DATASEGMENTCOUNTDB20H;指定质数个数NUMDW40HDUP(0)DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP(0)STACK1EN
DS2022/11/248086/8088宏汇编语言程序设计CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXLEADI,NUM;存放质数的指针值MOVCL,CO
UNTXORDH,DHXORCH,CHMOVWORDPTR[DI],2;ADDDI,2MOVWORDPTR[DI],3SUBCL,2MOVDL,5MOVBL,3;除数起点2022/11/248
086/8088宏汇编语言程序设计MOVBH,3LOP:XORAH,AHMOVAL,DLDIVBLCMPAH,0JENEXT1;能乘除,不是素数转移ADDBL,2CMPBL,BHJAENEXT2;除数>最大除数则是素数JMPLOPNEXT1:
ADDDL,2MOVBH,DLSHRBH,1;确定新的最大除数MOVBL,3JMPLOP2022/11/248086/8088宏汇编语言程序设计NEXT2:ADDDI,2;修改指针MOV[DI],DX;存新质数ADDDL,2MOVBH,DLSHR
BH,1;确定新的最大除数MOVBL,3LOOPLOPMOVAH,4CHINT21HCODEENDSENDSTART2022/11/248086/8088宏汇编语言程序设计6.3开平方根在
8086/8088指令系统中没有提供开平方跟指令。开平方根可以通过程序来实现。开平方根可以通过两种方法来实现,一种是减奇数法开平方根,另一种就是手工计算方式。减奇数开平方根法获得平方根的整数部分:n个从1开始的连
续自然数中的奇数之和等于n的平方。分析:如果要求S的平方根,那么可以从S中逐次减去从1开始的连续自然数的奇数1,3,5,…一直到相减数等于零,或不够减的下一个奇数为止。然后统计减去自然数的奇数个数,它就是S的近似平方根。流程图
:P127图6.62022/11/248086/8088宏汇编语言程序设计源程序:TITLE开平方根DATASEGMENTDA1DW1234H;被开方的数SQRDBO;存平方根DATAENDSSTACK1SEGMENTPAR
ASTACKDW10HDUP(0)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AX2022/11/248086/80
88宏汇编语言程序设计MOVAX,DA1MOVCL,0MOVDX,1;奇数初值为1LOP:SUBAX,DXJBEND0;转移INCCLADDDX,2JMPLOPEND0:MOVSQR,CLMOVAH,4CHINT21HCODEENDSENDSTART2022
/11/248086/8088宏汇编语言程序设计开平方根我们看到,用减奇数法来开平方根结构非常简单,但是当被开方的数增大时,运算程序所花费的时间将会增加。如果我们在程序中仿照使用手工计算的方式来求平方根则能快速求出较大数的平方根,参见P127例6.3.2,由于本
例题涉及代码转换和多精度运算,代码转换知识在第8章讲述,此方法不要求掌握,有兴趣的同学可以自己学习。2022/11/248086/8088宏汇编语言程序设计6.4多精度运算在8086/8088微处理器中,每条指令只能处理8位或者16位的二进制数,因此它所能表达的范围也是很有限的。为了提高
运算精度,通常用多个字节或多个字来表示一个完整的数据。这时候就需要编制一些子程序或程序段,分别完成不同的多精度数据操作。例如:编制一个多精度数的求补子程序。要求:多精度数的首址放在SI中,多精度数的字节数
在CL中。分析:求补运算采用“变反加1”来实现。2022/11/248086/8088宏汇编语言程序设计COMPPROCPUSHSIXORCH,CHPUSHCXLOP1:NOTBYTEPTR[SI]
INCSILOOPLOP1POPCXPOPSISTCLOP2:ADCBYTEPRT[SI],0INCSILOOPLOP2RETCOMPENDP