您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 第3章 微机原理 汇编 朱定华
1第三章程序设计的基本技术3.13.23.3顺序程序设计分支程序设计循环程序设计学习要点:乘除法指令、BCD数调整指令、跳转指令、重复控制指令掌握顺序程序、分支程序、循环程序的结构和设计方法2顺序程序是最简单的程序,它的执行顺序和程序中指令的顺序完全一致3.1顺序程序设计3格式:MULsourceIMULsource;符号整数乘法3.1.1乘除法指令1.乘法指令MUL和符号整数乘法指令IMUL源操作数source可以是字节或字,可为寄存器或存储器操作数,不能为立即数目的操作数是AL或AX,视source的类型属性决定是AL还是AX在乘法指令之前必须将目的操作数送AL(字节乘)或AX(字乘)416位乘法指令所执行的操作是AL或AX乘以source,乘积放回到AX或DX和AXALsourc8AX×AXsourc16AX×DX3.1.1乘除法指令可用乘法运算将BCD数转换为二进制数5例将AX中小于(等于)255大于0的3位BCD数转换为二进制数,存入字节变量SB中如将BCD数255H转换为二进制数11111111B,运算的过程为:2.3.4常用指令应用举例N2×102+N1×10+N0=(N2×10+N1)×10+N06例将AX中的大于0小于(等于)255的BCD数转换为二进制数存入字节变量SB中M0VCH,10MOVCL,4MOVSB,AL;暂存十位和个位MOVAL,AH;百位存入AL中MULCH;百位×10→AXMOVAH,SBSHRAH,CL;取十位ADDAL,AH;百位×10+十位→ALMULCH;(百位×10+十位)×10→AXANDSB,0FH;取个位ADDSB,AL;(百位×10+十位)×10+个位→SBN2×102+N1×10+N0=(N2×10+N1)×10+N0程序段如下:7格式:DIVsourceIDIVsource;符号整数除法注:源操作数source可以是字或字节,可为REG或MEM,不能为立即数目的操作数是AX或DX和AX2.除法指令DIV和符号整数除法指令IDIV3.1.1乘除法指令816位除法指令所执行的操作如下图所示ALsourc8AXAXsourc16AXDXAHDX……3.1.1乘除法指令可用除法运算(除10取余)将二进制数转换为BCD数9例将AL中的8位无符号二进制数转换为BCD数放入AX中“除10取余”法如,将二进制数FFH转换为BCD数255H10例将AL中的8位无符号二进制数转换为BCD数放入AX中MOVAL,0FEHMOVCL,4MOVBL,10MOVAH,0;将8位二进制数扩展为16位DIVBL;商→AL,余数→AH(个位数)MOVBH,AH;个位暂存MOVAH,0DIVBL;商→AL,余数→AH(十位数)SHLAH,CLORBH,AH;BCD数十位与个位合并MOVAH,0DIVBL;AH中余数为BCD数百位MOVAL,BH;BCD数十位与个位送AL“除10取余”法113.扩展指令CBW和CWD要把一个8位二进制数除以一个8位二进制数,要有一个16位二进制数在AX中.所以做8位除以8位的除法前先要把8位被除数扩展为16位,做16位除以16位的除法前要把16位被除数扩展为32位.这种扩展对于无符号数除法只需将AH或DX清0,而对符号整数除法则要通过扩展符号位来把被除数扩展。3.1.1乘除法指令12两指令都隐含操作数在做8位除以8位、16位除以16位的除法之前,应先扩展AL或AX中的被除数扩展指令和符号整数除法仅对补码数适用格式:CBW;AL的最高位扩展至AHCWD;AX的最高位扩展至DX3.1.1乘除法指令13如:有一符号字数组变量ARRAY,第1个字是被除数,第2个字是除数,接着存放商和余数,其程序段为:MOVSI,OFFSETARRAYMOVAX,[SI]CWDIDIVWORDPTR2[SI]MOV4[SI],AXMOV6[SI],DX3.1.1乘除法指令143.1.2BCD数调整指令用二进制数算术运算指令对BCD数进行运算,会得到一个非BCD数或不正确的BCD数。如:00001001B+00000111B=00010000B00000011B+00001001B=00001100B第一个结果是非BCD数;第二个结果是不正确的BCD数。若再加上6,就可以得到正确的BCD数:00010000B+00000110B=00010110B00001100B+00000110B=00010010B对BCD数使用二进制数算术运算指令进行运算,然后执行一条专用调整指令来处理BCD数的结果151.BCD数加法调整指令DAA和AAA格式:DAA功能:将AL中的和调整为正确的压缩BCD数调整规则:(AL&0FH)9或AF=1,则AL加6;(AL&0F0H)90H或CF=1,则AL加60H.3.1.2BCD数调整指令(1)压缩BCD数加法调整16如:MOVAX,3456HADDAL,AH;AL=8AH,AF=0,CF=0DAA;AL=90H如:MOVAX,3739HADDAL,AH;AL=70H,AF=1,CF=0DAA;AL=76H如:MOVAX,2189HADDAL,AH;AL=AAH,AF=0,CF=0DAA;AL=10H,CF=13.1.2BCD数调整指令00110100+0101011010001010+01101001000017注:该指令操作数隐含为AL,即只能对AL中的操作数据调整对结果调整时要用到CF,AF标志,所以调整指令应紧跟BCD数加法指令DAA指令会影响标志3.1.2BCD数调整指令18例3.1求两个字变量W1和W2中压缩BCD数之和,存入字节变量SUM中。W1DW8931HW2DW5678HSUMDB3DUP(0)MOVAL,BYTEPTRW1;AL=31HADDAL,BYTEPTRW2;AL=A9H,CF=0,AF=0DAA;AL=09H,CF=1MOVSUM,AL;存个位和十位MOVAL,BYTEPTRW1+1;AL=89HADCAL,BYTEPTRW2+1;AL=E0H,CF=0,AF=1DAA;AL=46H,CF=1MOVSUM+1,AL;存百位和千位MOVSUM+2,0;处理向万位的进位RCLSUM+2,119格式:AAA功能:将AL中的和调整为正确的非压缩BCD数送AX调整规则:(AL&0FH)9或AF=1,则(AL+6)&0FH→AL,AH+1→AH,CF=1;否则,AL&0FH→AL,AH不变,CF=0.如:MOVAX,0806HADDAL,AH;AL=0EH,AH=08HMOVAH,0AAA;AX=0104H(2)非压缩BCD数加法调整3.1.2BCD数调整指令20注:同DAA,AAA的操作数也隐含为AL,且要紧跟加法指令AAA调整后的存放规律可理解为调整后的个位数送AL,十位数(即进位)加到AH中.故执行该指令前AH应依据前后关系决定是否清0如:将两个BCD数的ASCII码相加,得到和的ASCII码:MOVAL,35H;’5’ADDAL,39H;’9’,AL=6EHMOVAH,0AAA;AX=0104HORAX,3030H;AX=3134H即’14’3.1.2BCD数调整指令21例3.2求两个字变量W1和W2中非压缩BCD数之和,存入字节变量SUM中。W1DW0809HW2DW0607HSUMDB3DUP(0)MOVAL,BYTEPTRW1;AL=09HADDAL,BYTEPTRW2;AL=10H,AF=1AAA;AL=06H,AH=01HMOVSUM,AL;存个位MOVAL,BYTEPTRW1+1;AL=08HADCAL,BYTEPTRW2+1;AL=0FH,AF=0MOVAH,0AAA;AL=05H,AHMOVWORDPTRSUM+1,AX;存十位和百位22格式:DAS功能:将AL中的差调整为正确的压缩BCD数调整规则:(AL&0FH)9或AF=1,则AL减6;(AL&0F0H)90H或CF=1,则AL减60H.如:MOVAX,5634HSUBAL,AH;AL=DEH,有借位DAS;AL=78H,保持借位,即134-562.BCD数减法调整指令DAS和AAS(1)压缩BCD数减法调整3.1.2BCD数调整指令23格式:AAS功能:将AL中的差调整为正确的非压缩BCD数送AX调整规则:(AL&0FH)9或AF=1,则(AL-6)&0FH→AL,AH-1→AH;否则,AL&0FH→AL,AH不变.如:MOVAX,0806HSUBAL,07H;AX=08FFHAAS;AX=0709H(2)非压缩BCD数减法调整3.1.2BCD数调整指令24格式:AAM功能:将AL中小于64H的二进制数变换为非压缩BCD数送AX调整规则:AL/0AH→AH(十位),ALMOD0AH→AL(个位)如:MOVAL,63HAAM;AX=0909H3.非压缩BCD数乘除法调整指令AAM和AAD(1)乘法调整3.1.2BCD数调整指令25例3.3字变量W和字节变量B分别存放着两个非压缩BCD数,编写求两数之积,并将它存储到字节变量P中的程序。WDW0307HBDB9PDB3DUP(0)MOVAL,BYTEPTRW;AL=07HMULB;AX=003FHAAM;AX=0603HMOVWORDPTRP,AXMOVAL,BYTEPTRW+1;AL=03HMULB;AX=001BHAAM;AX=0207HADDAL,P+1;07H+06H=0DH,即AL=0DHAAA;进位直接加入AH!AX=0303HMOVWORDPTRP+1,AX26格式:AAD功能:将AX中的两位非压缩BCD数变换成二进制数(仍在AX中,故AH=0)如:MOVAX,0906HMOVDL,06HAAD;AX=0060HDIVDL;AL=10H,AH=0MOVDL,AH;存余数AAM;AX=0106H(2)除法调整注:此指令可对被除数进行预调整加、减和乘法调整在相应运算操作之后进行,而除法的调整在除法操作之前进行.3.1.2BCD数调整指令27例3.4字变量W和字节变量B中分别存放着两个非压缩BCD数编程求二者的商和余数,并分别存放到字变量Q和字节变量R中。程序段如下:WDW0909HBDB5RDB0QDW0MOVAX,WAAD;0909H63HDIVB;63H5=13H…4,AL=13H,AH=04HMOVR,AHAAM;13H0109HMOVQ,AX28MOVAX,1972HADDAL,AHDAAMOVAX,0102HADDAL,AHAAAMOVAX,0609HADDAL,AHMOVAH,0AAAMOVAL,48HAAMMOVAX,0602HAAD;AL=8BH,AH=19H;AL=91H,AH=19H;AL=03H,AH=01H;AX=0103H,CF=0;AL=0FH,AH=06H;AH=0;AX=0105H,CF=1;AX=0702H;AX=003EH29例3.5从键盘键入0~9的任一自然数N,将其立方值送显示器显示.INPUTDB’PleaseInputN(0~9):$’LFBDB’0$1$8$27$64$’DB’125$216$343$512$729$’NDB0MOVDX,OFFSETINPUTMOVAH,9INT21H显示提示信息建立立方表可用乘法运算实现,也可用查表法实现。查表法程序段如下:3.1.3顺序程序设计举例30MOVAH,1INT21HMOVN,ALMOVAH,2MOVDL,0AHINT21HMOVDL,NANDDL,0FHMOVCL,2SHLDL,CLMOVDH,0ADDDX,OFFSETLFBMOVAH,9INT21H31第三章程序设计的基本技术3.13.3顺序程序设计分支程序设计循环程序设计3.232顺序程序是按指令的书写(存放)顺序执行,而实际情况需要根据不同的条件做不同的处理,形成分支.汇编中的分支的条件往往是通过标志的不同状态而反映的.常用改变标志指令和转移指令实现分支.3.2分支程序设计33通用格式:Jcond
本文标题:第3章 微机原理 汇编 朱定华
链接地址:https://www.777doc.com/doc-3609335 .html