




已阅读5页,还剩140页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微型计算机机原理及应用,程序设计的基本技术,1,2,3,5,顺序程序设计,分支程序设计,循环程序设计,子程序设计,4,串处理程序设计,注意:本书有关汇编语言程序设计只限于DOS环境下的实地址方式,该方式下字长为16位。顺序程序是最简单的程序,它的执行顺序和程序中指令的顺序完全一致,1顺序程序设计,格式:MULsourceIMULsource;符号整数乘法,1.1乘除法指令,1.乘法指令MUL和符号整数乘法指令IMUL,1、源操作数source可以是字节、字或双字,可为寄存器或存储器操作数,不能为立即数。2、目的操作数是隐藏的,为被乘数,放于AL、AX或EAX,视source的类型属性决定是AL、AX还是EAX3、在乘法指令之前必须将目的操作数送AL(字节乘)或AX(字乘)或EAX(双字乘)。,乘积的放法:8位或16位乘法指令所执行的操作是AL或AX乘以source,乘积放回到AX或DX和AX,如下图所示,AL,sourc8,AX,AX,sourc16,AX,DX,1.1乘除法指令,32位乘法指令所执行的操作是EAX乘以source,乘积放回到EDX和EAX,如下图所示,EAX,sourc32,EAX,EDX,注意:乘法指令对标志位CF和OF有影响,对其余标志位的影响不确定。,1.1乘除法指令,例如:将AX中的3位BCD数转换为二进制数存入字节变量SB中。,M0VCH,10MOVCL,4MOVSB,AL;暂存十位和个位MOVAL,AH;百位存入AL中MULCH;百位10AXMOVAH,SB;百位10的积小于255,所以只用AL存放即可SHRAH,CL;取十位ADDAL,AH;百位10+十位ALMULCH;(百位10+十位)10AXANDSB,0FH;取个位ADDSB,AL;(百位10+十位)10+个位SB,N2102N110N0(N210N1)10N0,程序段如下:,1.1乘除法指令,格式:IMULREG,source;REGREGXsourceIMULREG,source,imm;REGsourceXimm,1.1乘除法指令,注:符号整数乘法指令IMUL,1、双操作数乘法指令是用源操作数乘目的操作数,乘积存入目的操作数。2、三操作数乘法指令是用源操作数乘立即数,乘积存入目的操作数。3、要求:其源操作数source可为寄存器或存储器操作数,目的操作数只能是16位和32位的寄存器,源、目的操作数的类型要求一致。,格式:DIVsourceIDIVsource;符号整数除法注意:源操作数source可以是字、字节或双字,可为REG或MEM,不能为立即数目的操作数是隐藏的,放置被除数,可为AX或DX和AX或EDX和EAX。,2.除法指令DIV和符号整数除法指令IDIV,1.1乘除法指令,8位或16位除法指令所执行的操作如下图所示,AL,sourc8,AX,AX,sourc16,AH,DX,1.1乘除法指令,32位除法指令所执行的操作如下图所示,EAX,sourc32,EDX,可用除法运算(除10取余)将二进制数转换为BCD数,1.1乘除法指令,如,用除10取余法将8位二进制数FFH转换为BCD数255H的二进制运算如下图所示,1.1乘除法指令,方法:“除10取余”法,例如将AL中的8位无符号二进制数转换为BCD数放入AX中,例如将AL中的8位无符号二进制数转换为BCD数放入AX中,MOVAL,0FFHMOVCL,10MOVAH,0;将8位二进制数扩展为16位DIVCL;商AL,余数AH(个位数)MOVCH,AH;暂存BCD数个位MOVAH,0DIVCL;商AL,余数AH(十位数)MOVCL,4SHLAH,CL;BCD数十位移至高4位ORCH,AH;BCD数十位与个位拼合MOVAH,0MOVCL,10DIVCL;AH中余数为BCD数的百位MOVAL,CH;BCD数十位与个位送AL,1.1乘除法指令,3.扩展指令CBW和CWD,扩展方法:要把一个8位二进制数除以另一个8位二进制数,要有一个16位二进制数在AX中,所以做8位除以8位的除法前先要把8位被除数扩展为16位。做16位除以16位的除法前要把16位被除数扩展为32位,做32位除以32位的除法前要把32位被除数扩展为64位。这种扩展对于无符号数除法只需将AH或DX或EDX清0,而对符号整数除法则要通过扩展符号位来把被除数扩展。,1.1乘除法指令,指令都隐含操作数在做8位除以8位、16位除以16位、32位除以32位的符号整数除法之前,应先扩展AL或AX或EAX中的被除数。扩展指令和符号整数除法指令仅对补码数适用。,格式:CBW;AL的最高位符号位扩展至AHCWD;AX的最高位扩展至DXCWDE;AX的最高位扩展至EAX的高16位CDQ;EAX的最高位扩展至EDX,1.1乘除法指令,如:有一符号字数组变量ARRAY,第1个字是被除数,第2个字是除数,接着存放商和余数,其程序段为:,MOVSI,OFFSETARRAYMOVAX,SICWDIDIVWORDPTR2SIMOV4SI,AXMOV6SI,DX,1.1乘除法指令,1.2BCD数调整指令,分析:两个BCD数相加,其和仍应为BCD数,如不是BCD数则结果错误。(正确)BCD数十进制数码加法器的和(错误)0000000001001910010001,00001010100001,01011511110001,0110160001,00000010,0101250001,1001如何修正?,1.2BCD数调整指令,造成此结果的原因?产生错误的原因是8421BCD码为十进制,逢十进一,而四位二进制是逢十六进一,二者进位关系不同,当和数大于9时,8421BCD应产生进位,而十六进制还不可能产生进位。为此,应对结果进行修正。当运算结果小于等于9时,不需修正或加“0”,但当结果大于9时,应修正让其产生一个进位,加0110即可。如相加结果产生了进位位,其结果必定大于9,所以,也需修正。对BCD数使用二进制数算术运算指令进行运算,然后执行一条专用调整指令来处理BCD数的结果。,1.BCD数加法调整指令DAA和AAA,格式:DAA功能:将AL中的数当作两个压缩BCD数相加之和调整为正确的压缩BCD数。调整规则:(AL0FH)9或AF=1,则AL加6;(AL0F0H)90H或CF=1,则AL加60H.,1.2BCD数调整指令,(1)压缩BCD数加法调整,注意:该指令操作数隐含为AL,即只能对AL中的操作数据进行调整。导致压缩BCD数的加减指令只能针对字节运算。对结果调整时要用到CF和AF两个标志位,所以调整指令应紧跟BCD数加法指令DAA指令会影响标志如:MOVAX,3456HADDAL,AH;AL8AH,AF0,CF0DAA;AL90H,1.2BCD数调整指令,例1求两个字变量W1和W2中压缩BCD数之和,存入字节变量SUM中。,如:8931+5678=14609,程序段如下:W1DW8931HW2DW5678HSUMDB3DUP(0)MOVAL,BYTEPTRW1;AL31HADDAL,BYTEPTRW2;31+78=A9H,ALA9H,CF=0,AF=0DAA;AL09H,CF=1MOVSUM,AL;存个位和十位MOVAL,BYTEPTRW1+1;AL89HADCAL,BYTEPTRW2+1;89+56+CF=ALE0H,CF=0,AF=1DAA;AL46H,CF=1MOVSUM+1,AL;存百位和千位MOVSUM+2,0;处理向万位的进位RCLSUM+2,1,1.2BCD数调整指令,格式:AAA功能:将AL中的数当作两个非压缩BCD数相加之和进行调整,得到正确的非压缩BCD数送AX。调整规则:(AL0FH)9或AF=1,则(AL+6)0FHAL,AH+1AH;否则,AL0FHAL,AH不变.,(2)非压缩BCD数加法调整,1.2BCD数调整指令,注意:同DAA指令,AAA指令的操作数也隐含为AL,且要紧跟加法指令。导致非压缩BCD数的加减指令只能针对字节运算。AAA调整后的存放规律可理解为调整后的个位数送AL,十位数(即进位)加到AH中,故执行该指令前应注意AH是否清0。如:将两个BCD数的ASCII码相加,得到和的ASCII码:MOVAL,35H;5ADDAL,39H;9,AL=6EHMOVAH,0AAA;AX=0104HORAX,3030H;AX=3134H即14,1.2BCD数调整指令,例2求两个字变量W1和W2中非压缩BCD数之和,存入字节变量SUM中。,如:89+67=156,程序段如下:W1DW0809HW2DW0607HSUMDB3DUP(0)MOVAX,W1;AX0809HADDAL,BYTEPTRW2;AL10H,AF=1AAA;AX0906HMOVSUM,AL;存个位MOVAL,AHADDAL,BYTEPTRW2+1;AL0FH,AF=0MOVAH,0AAA;AL05H,AH=01HMOVWORDPTRSUM+1,AX;存十位和百位,1.2BCD数调整指令,格式:DAS功能:将AL中的数当作两个压缩BCD数相减之差进行调整,得到正确的压缩BCD数。调整规则:(AL0FH)9或AF=1,则AL减6;(AL0F0H)90H或CF=1,则AL减60H.,如:MOVAX,5643HSUBAL,AH;AL=DEH,有借位DAS;AL=78H,保持借位,即134-56,2.BCD数减法调整指令DAS和AAS,(1)压缩BCD数减法调整,1.2BCD数调整指令,格式:AAS功能:将AL中的数当作两个非压缩BCD数相减之差进行调整,得到正确的非压缩BCD数送AX。调整规则:(AL0FH)9或AF=1,则(AL-6)0FHAL,AH-1AH;否则,AL0FHAL,AH不变.,如:MOVAX,0806HSUBAL,07H;AX=08FFHAAS;AX=0709H,(2)非压缩BCD数减法调整,1.2BCD数调整指令,格式:AAM功能:将AL中小于64H的二进制数变换为非压缩BCD数送AX调整规则:AL/0AHAH(十位),ALMOD0AHAL(个位),如:MOVAL,63HAAM;AX=0909H,3.非压缩BCD数乘除法调整指令AAM和AAD,(1)乘法调整,1.2BCD数调整指令,例3字变量W和字节变量B分别存放着两个非压缩BCD数,编写求两数之积,并将它存储到JJ字节变量中的程序。程序段如下:WDW0307HBDB9JJDB3DUP(0)MOVAL,BYTEPTRW;AL=07HMULB;AX=003FHAAM;AX=0603HMOVWORDPTRJJ,AXMOVAL,BYTEPTRW+1;AL=03HMULB;AX=001BHAAM;AX=0207HADDAL,JJ+1;07H+06H=0DH,即AL=0DHAAA;进位直接加入AH!AX=0303HMOVWORDPTRJJ+1,AX,1.2BCD数调整指令,格式:AAD功能:将AX中的两位非压缩BCD数变换成二进制数集中放在AL中。,如:MOVAX,0906HMOVDL,06HAAD;AX=0060HDIVDL;AL=10H,AH=0MOVDL,AH;存余数AAM;AX=0106H,(2)除法调整,注:此指令可对被除数进行预调整加、减和乘法调整在相应运算操作之后进行,而除法的调整在除法操作之前进行,1.2BCD数调整指令,例3.4字变量W和字节变量B中分别存放着两个非压缩BCD数编程求二者的商和余数,并分别存放到字变量QUOT和字节变量REMA中。程序段如下:WDW0909HBDB5REMADB0QUOTDW0MOVAX,WAAD;0909H63HDIVB;63H5=13H4,AL=13H,AH=04HMOVREMA,AHAAM;13H0109HMOVQUOT,AX,1.2BCD数调整指令,例5从键盘键入09的任一自然数N,求其立方值并将其送显示器显示.,INPUTDBPleaseInputN(09):LFBDB0182764DB125216343512729NDB0MOVDX,OFFSETINPUTMOVAH,9INT21H,可用乘法运算实现,也可用查表法实现。查表法程序段如下:,1.3顺序程序设计举例,MOVAH,1;输入并显示器显示N,N送入ALINT21HMOVN,ALMOVAH,2;2号系统功能调用-换行MOVDL,0AHINT21HMOVDL,NANDDL,0FH;将N转换为N(将ASCII码转换为数字)MOVCL,2;将N乘以4SHLDL,CLMOVDH,0;8位4N扩展为16位的地址偏移量ADDDX,OFFSETLFB;4N+表的偏移地址MOVAH,9INT21H,1.3顺序程序设计举例,例6编写两个32位无符号数的乘法程序程序如下:.386stacksegmentstackUSE16stackdw32dup(0)stackendsdatasegmentUSE16ABDD12345678HCDDD12233445HABCDDD2DUP(0)dataendscodesegmentUSE16startprocfarassumess:stack,cs:code,ds:data,1.3顺序程序设计举例,pushdssubax,axpushaxmovax,datamovds,axMOVEAX,ABMULCDMOVABCD,EAXMOVABCD+4,EDXretstartendpcodeendsendstart,1.3顺序程序设计举例,程序设计的基本技术,1,3,5,顺序程序设计,分支程序设计,循环程序设计,子程序设计,4,串处理程序设计,2,顺序程序是按指令的书写(存放)顺序执行,而实际情况需要根据不同的条件做不同的处理,形成分支.汇编中的分支的条件往往是通过标志的不同状态而反映的。常用改变标志指令和转移指令实现分支。分类:JMP、JCOND两类。转移指令将控制程序转向其后的目的标号指定的地址。条件转移指令紧跟在能改变并设置状态的指令之后,由状态标志决定程序的走向。,2分支程序设计,通用格式:Jcondshort_lable操作:若满足条件,则OFFSETshort_lableIP,实现转移;否则顺序执行.short_lable短标号,条件转移是相对转移指令,即从当前地址到目标地址的偏移量为-128127(从本指令则为-126+129,因为条件转移指令均为双字节指令),故只能实现段内转移.80386以后,在实地址方式下,能够转移到代码段的任何位置。,2.1条件转移指令,仅判断一个标志位实现转移.,1.简单条件转移指令,2.1条件转移指令,如:JZ/JES_LAB为零/相等转移操作:测试前面操作结果为0则转移,即判ZF=1转移.JZ,JE为等价助记符,任写一种均可,可根据程序设计意图选择.如:MOVBX,0FFFFHINCBX;ZF=1JZNEXT;为0转移到NEXTNEXT:,2.1条件转移指令,如:MOVBL,1;CMPBL,5;ZF=0JENEXT;比较结果相等则转移到NEXT;不相等顺序执行NEXT:注意:此类指令,均只测试前面的操作结果所设标志,指令本身不影响标志.所以,在条件转移指令前,一定有一条能正确影响标志的指令.,2.1条件转移指令,2.无符号数条件转移指令,条件转移常依据两个数的关系来决定,两个数的关系除相等与否,还有大小之分,比较大小时,要区分是无符号数还是符号数,否则答案不明确.,如:0FFH00H?视为无符号数0FFH=25500H;视为符号数0FFH=-100H.所以,应将两种类型的数分开比较:对无符号数使用术语:低于/高于Below/Above;对带符号数使用术语:小于/大于Less/Greater,2.1条件转移指令,无符号数条件转移指令有4条(P93,表32):指令助记符功能JB/JNAE低于/不高于等于转移JNB/JAE不低于/高于等于转移JA/JNBE高于/不低于等于转移JNA/JBE不高于/低于等于转移,2.1条件转移指令,3.符号数条件转移指令,有符号数条件转移指令有4条(P94,表33):指令助记符功能JL/JNGE小于/不大于等于转移JNL/JGE不小于/大于等于转移JG/JNLE大于/不小于等于转移JNG/JLE不大于/小于等于转移,2.1条件转移指令,格式:JMPtarget操作:将控制转向目的标号target:target在段内:target的偏移地址IPtarget在段外:target的偏移地址IPtarget的段首址CS,条件转移范围为-128+127,而无条件转移指令没有范围限制.在分支程序中往往需要它将各分支重新汇集到一起.如何实现条件转移指令的范围?,2.2无条件转移指令,1.无条件直接转移指令,格式:JMPdest操作:转移的目的地址放于寄存器或存储器。目的操作数为寄存器寄存器内容送IP目的操作数为字变量字变量内容送IP目的操作数为双字变量双字变量内容送CS和IP如:JMPNEXT;无条件转移转到NEXTNEXT:如:JMPWORDPTRBX;即(BX)IP,2.无条件间接转移指令,2.2无条件转移指令,注意:分支实现的基本方法有两种:一种是利用比较转移指令实现分支;一种是利用跳转表实现分支.视比较对象,正确选择合适的转移指令.要为每个分支安排正确出口.凡是可共用的部分,应尽量放在公共程序段中以使程序简短.在调试分支程序时,应使用多组数据,分别对各种分支进行反复测试.,2.3分支程序设计举例,例7编程计算下面函数值(X,Y均为字节符号数),思路:1、如何确定X、Y是同号、异号数?利用XORX,Y的结果来确定。若同号,则异或的结果必为0;若异号,则异或的结果必为1。2、如何确定X、Y是正数或负数?利用CMP指令,比较X,Y,与0的大小来确定。,2.3分支程序设计举例,例7编程计算下面函数值(X,Y均为字节符号数),XDB-5YDB20ZDB0,MOVAL,XXORAL,Y;根据X、Y的符号置S标志,相同为0JSDIFF;符号位S=1转移,相异为1,X、Y相异结束MOVZ,1;Z赋1CMPX,0;相同后,判断其中某数的符号JNSNOCHA;大于等于0,结束NEGZ;小于0,求补得1NOCHA:RETDIFF:MOVZ,0RET,2.3分支程序设计举例,例8从键盘上键入09中任一自然数N,将2的N次方值在显示器的下一行显示出来。思路:1、计算2N的方法:1左移N位,得到的结果为二进制数。2、求得的徝是一个二进制数,为了输出还要将二进制数转换为十进制数BCD数码,将二进制数转化为BCD数,采用“除10取余法”,为了使用9号系统功能调用,还需将BCD数码的ASCII码存入内存,余数为BCD数,余数加上30H即可得到余数的ASCII码。3、2的N次方值对应的列表在存储器中的放法,其最大值是2的9次方,29=512,最大值的ASCII码占3个单元,再加上回车、换行和$,所以输出数据区OBUF最多6个单元。除10操作一直进行到商等于0为止本例中的最大商值为51(=33H),故可以采用16位除以8位的除法操作。,2.3分支程序设计举例,例8从键盘上键入09中任一自然数N,将2的N次方值在显示器的下一行显示出来。程序段如下:OBUFDB6DUP(0)MOVAH,1键盘键入的数的ASCII码送至ALINT21HANDAL,0FH;将N转换为NMOVCL,ALMOVAX,1;1X2NSHLAX,CLMOVBX,5MOVOBUFBX,$MOVCX,10;转换为十进制数的ASCII码,2.3分支程序设计举例,2.3分支程序设计举例,MOVCX,10;转换为十进制数的ASCII码AGAIN:MOVDX,0DIVCXORDL,30HDECBXMOVOBUFBX,DL;将转换结果“2”的ASCII码存入ANDAX,AX;判断转换是否结束JNZAGAINSUBBX,2MOVWORDPTROBUFBX,0A0DH;存入回车换行MOVDX,BXADDDX,OFFSETOBUFMOVAH,9INT21HRET,例9从键盘上键入2位十六进制数将其拼合成一个字节存入字节变量SB中。思路:1、键入的二位十六进制数码,采用10号系统功能调用,输入并存好。(存的是ASCII码)2、键入数码假设为56,则存入AX中,AX=3635H,且AH=36H,AL=35H,3、如何将56的ASCII码转换为数码并合并到一个字节中去。注意:0-9和A-F的ASCII码转换为数码的方法是不同的。,2.3分支程序设计举例,例9从键盘上键入2位十六进制数将其拼合成一个字节存入字节变量SB中。IBUFDB3,0,3DUP(0)SBDB0MOVDX,OFFSETIBUF;键入2位十六进制数MOVAH,10INT21HMOVAX,WORDPTRIBUF+2;键入字符送AXSUBAX,3030H;字符变为十六进制数CMPAL,0AHJBLNSUB7SUBAL,7LNSUB7:CMPAH,0AHJBLNSUB7SUBAH,7,2.3分支程序设计举例,HNSUB7:MOVCL,4;将AX中的数拼合成一个字节SHLAL,CLORAL,AHMOVSB,ALRET,2.3分支程序设计举例,例10某工厂的产品有8种不同的加工处理程序P0P7,根据键盘输入,做不同的处理,若是07以外的键,则退出加工处理,此例可以用两种方法实现:一种是用逐一比较判断,逐次比较转移实现二叉分支、整体上实现多分支;另一种是跳转表法,直接实现多分支.,2.3分支程序设计举例,2.3分支程序设计举例,方法一逐一比较法.简单,条理清楚,易于实现,但转移范围只能是:128127,要求:分支不能太多。INPUTDBInput(07):$MOVDX,OFFSETINPUT;显示提示MOVAH,9INT21HMOVAH,1;等待键入一个字符INT21HCMPAL,0;为0字符则转P0JEP0CMPAL,1;为1字符则转P1JEP1,2.3分支程序设计举例,CMPAL,2JEP2CMPAL,3JEP3CMPAL,4JEP4CMPAL,5JEP5CMPAL,6JEP6CMPAL,7JEP7RET;不是07则退出程序,2.3分支程序设计举例,P0:MOVDL,0;键入0则显示0以替代P0程序JMPEXITP1:MOVDL,1;键入1则显示1以替代P1程序JMPEXITP7:MOVDL,7JMPEXITEXIT:MOVAH,2INT21HRET;分支程序一定要注意汇合到结束处,2.3分支程序设计举例,方法二:跳转表法利用无条件的间接转移指令可实现远距离的多分支(间接跳转至不同分支的入口处)在数据区造一地址表,存放不同的分支入口地址;设表的首地址为PTAB,每一个PTABP0入口地址占一个字单元,2P1Pi的入口地址PTAB2i4P2若将2iBX,则JMPPTABBX:可转到Pi入口处,2.3分支程序设计举例,INPUTDBINPUT(07):$PTABDWP0,P1,P2,P3,P4,P5,P6,P7;定义地址表MOVDX,OFFSETINPUT;显示提示MOVAH,9INT21HMOVAH,1;等待键入07的数字INT21HCMPAL,0;检查输入数据,不是07则退出JBEXITCMPAL,7JAEXITANDAX,0FH;i2BXADDAX,AX,2.3分支程序设计举例,MOVBX,AXJMPPTABBX;(PTAB2i)PiIPP0:MOVDL,0;键入0则显示0以替代P0程序JMPDOWNP1:MOVDL,1;键入1则显示1以替代P1程序JMPDOWNP7:MOVDL,7DOWN:MOVAH,2INT21HRET,键入的ASC码为无符号数,所以,用JB、JA等指令而不能用JG、JL等。,请思考:若为跨段标号,应修改哪些地方?注:只需修改:DWDD(存IP、CS)、i2i4即可,程序设计的基本技术,1,2,5,顺序程序设计,分支程序设计,循环程序设计,子程序设计,4,串处理程序设计,3,循环程序的四部分:(1)循环准备(循环初始化)建地址指针、置计数初值、设置必要的常数、对工作寄存器及工作单元置初值或清0等.(2)循环体重复执行的部分,循环的核心.(3)循环的修改修改计数器、寄存器、地址指针(基址或变址寄存器)、恢复某些参数。为下一轮循环做准备。(4)循环控制修改计数器,判断控制循环是否结束或继续。,3循环程序设计,循环程序的具体结构流程有两种:,3.1循环程序的基本结构,例:编程统计字变量W中有多少位1,并将结果存入字节变量N中。,方法一:先执行,后判断MOVN,0MOVCX,16LOP:SHLW,1JNCNOINCINCNNOINC:DECCXJNZLOPret,方法二:先判断,后执行MOVN,0LOP:CMPW,0JZDONESHLW,1JNCLOPINCNJMPLOPDONE:ret,DECCXJNZLOP,3.1循环程序的基本结构,循环控制方法最常见的有两种:计数控制循环次数已知,故可用某个寄存器或单元作为计数器,用计数器的值来控制循环的结束与否.条件控制循环次数未知,即循环次数与循环体的执行情况有关,通过条件测试指令来测试是否满足循环条件,以控制循环是否结束.,3.1循环程序的基本结构,此类指令的特点是:1、循环次数由CX计数器控制.循环指令本身不影响标志。2、同条件转移指令一样,重复控制指令也是相对转移指令(即段内转移),重复控制指令的目的地址必须在本指令地址的126129字节的范围之内。,3.2重复控制指令,LOOP指令:无条件循环指令,格式:LOOPshort-lable操作:CX1CX,当CX0则转short-lable所指指令;否则顺序执行.注意:在使用LOOP指令前,必须把循环次数送入CX.LOOPshotr-lable=若CX=0,则循环要进行65536次.,3.2重复控制指令,LOOPZ/LOOPE指令:,格式:LOOPZ/LOOPEshort-lable操作:CX1CX,当CX0,且ZF=1(相等)则转移;否则顺序执行.注意:本指令不影响ZF,ZF由前面指令设定.即前面比较结果相等。,3.2重复控制指令,格式:LOOPNZ/LOOPNEshort-lable操作:CX1CX,当CX0,且ZF=0(不相等)则转移;否则顺序执行.,格式:JCXZshort-lable操作:CX=0转移,否则顺序执行.注意:指令本身不作减操作,本指令一般用在循环的开始处,当CX=0,则跳过循环。,LOOPNZ/LOOPNE指令,JCXZ指令,3.2重复控制指令,(注意循环结构,防止死循环),下面通过几个例题介绍循环控制计数控制条件控制计数与条件双重控制对于某些问题,还有一些特殊控制,如:设开关变量等,可参其他教材.,3.3单重循环程序设计举例,例11计算Z=X+Y,其中X、Y为双字变量.,32位系统:XDD72345678HYDD90ABCDEFHZDB5DUP(0)MOVEAX,XADDEAX,YMOVDWORDPTRZ,EAXMOVZ+4,0RCLZ+4,1,思路:按照由低到高字节相加.最后的和可能占5个字节.用一个双字变量所占的字节数4作为循环体的控制条件,为计数控制.,3.3单重循环程序设计举例,例11计算Z=X+Y,其中X、Y为双字变量.,XDD72345678HYDD90ABCDEFHZDB5DUP(0),MOVCX,4;设计数初值MOVSI,0;地址指针ANDAX,AX;清CF,使CF=0AGAIN:MOVAL,BYTEPTRXSIADCAL,BYTEPTRYSIMOVZSI,ALINCSI;指下一个字节LOOPAGAIN;计数控制MOVZSI,0;处理向RCLZSI,1万位进位,3.3单重循环程序设计举例,例12编写将某数据区十六进制数加密的程序.每个数字占一个字节,分析:设加密数关系如下:十六数:0123456789ABCDEF加密数:A98EF10B25D3746C解密数:658BD9EC2107FA34即发0,则发A;发3,则发E;发A,则发D解密规律解密数的位移量=加密数表的数值如:解密数0的位移量是=0AH如:解密数4的位移量是=0FH,3.3单重循环程序设计举例,HEXSDB1,2,0EH;待发数NEQU$-HEXS;统计待发数个数JMHDBNDUP(0);存加密数JMBDB0AH,9,8,0EH,0FH,1,0,0BH,2,5,0DH,3,7,4,6,0CHMOVCX,NMOVBH,0初始化MOVSI,0AGAIN:MOVBL,HEXSSI;取十六进制数,其大小正好为该数码在加密表中的地址偏移量。MOVAL,JMBBX;BX+ALALMOVJMHSI,AL;存加密数INCSI;指向下一数LOOPAGAIN;计数控制,加密表,3.3单重循环程序设计举例,JMHDB0FH,0EH,8,9,0AH;设加密数NEQUJMH;统计加密数个数KMBDB6,5,8,0BH,0DH,9,0EH,0CH,2,1,0,7,0FH,0AH,3,4KMHDBNDUP(0);存解密数MOVCX,NMOVBX,OFFSETKMBMOVSI,0NEXT:MOVAL,JMHSIXLATKMBMOVKMHSI,ALINCSILOOPNEXT,解密表,3.3单重循环程序设计举例,例13将字节变量SB中的8位二进数送显示器显示.,思路:把SB中的八位二进制数0或1,当成数码显示出来,八位数码加1,需预留9个单元。1、为了避免通过CF来传递二进制数,先将SB中的8位二进制数送入AL中,再左移AX,将1位二进制数直接移入AH中。即将字节变量中的1位二进制数移入AH中,再将移入的二进制数变为ASCII码。,SBDB9AHOBUFDB9DUP(0),3.3单重循环程序设计举例,SBDB9AHOBUFDB9DUP(0)MOVCX,8MOVBX,0;BX为输出缓冲区的地址偏移量MOVAL,SBAGAIN:MOVAH,0SHLAX,1ADDAH,30HMOVOBUFBX,AHINCBXLOOPAGAINMOV0BUFBX,$MOVDX,OFFSETOBUFMOVAH,9INT21Hret,3.3单重循环程序设计举例,二进制数显示:,SBDB8AHOBUFDB3DUP(0)MOVCX,0204H;CH中为循环次数,CL中为移位次数MOVBX,0;BX为输出缓冲区的地址偏移量MOVAL,SBAGAIN:MOVAH,3;将数码转换为ASCII码SHLAX,CLCMPAH,39H;确定数码介于0-9或A-FJBENAD7ADDAH,7NAD7:MOVOBUFBX,AHINCBXDECCHJNZAGAIN,3.3单重循环程序设计举例,十六进制数显示:,MOV0BUFBX,$MOVDX,OFFSETOBUFMOVAH,9INT21Hret,例14将键入的十进制数(3276832767)转换为二进制数。,思路:1、数码的输入采用10号系统功能调用,存入的是ASCII码。2、判断数码是正数或负数,若为正数则直接从第一个数码转至第3步进行转换,若为负数,则移至第2个数码开始转换。如何判断其正负?将该数码与“-”比较,若结果为0,则标志位Z=1,否则Z=0,判断时,保留其Z,因为若是负数,需取其补码。3、十进制数码转换为二进制数,采用乘10的方法,此部分采用循环程序,循环的次数为数码个数。具体为:,3.3单重循环程序设计举例,算法:十进制数二进制数:反复10+Di循环体D4D3D2D1D0=D4104D3103D0(010+D4)10+D3)10+D2)10+D1)10+D0循环次数输入负数输入数码个数1;输入正数(不带符号)输入数码个数循环体中对其绝对值转换为二进制数,若为负数还应求补,3.3单重循环程序设计举例,BINARYDW0OBUFDBINPUTADECIMAL(3276832767):$IBUFDB7,0,7DUP(0)MOVDX,OFFSETIBUF;键入十进制数,存入的ASCII码MOVAH,10INT21HMOVCL,IBUF+1;十进制数位数(含“-”)送CXMOVCH,0MOVSI,OFFSETIBUF+2;指向键入的第一个字符CMPBYTEPTRSI,;判是否为负数PUSHF;保护零标志JNESININC;正数跳转至SININCINCSI;越过“-”指向数字DECCX;实际字符数少1(“-”号),3.3单重循环程序设计举例,SININC:MOVAX,0;开始十进制二进制AGAIN:MOVDX,10;(010+a4)10+)10+a0MULDXANDBYTEPTRSI,0FH;十进制数ASC转换为BCD数。ADDAL,SIADCAH,0INCSI;指向下一位LOOPAGAIN;计数循环POPF;恢复零标志JNZNNEG;非0即为正数,则不求补NEGAX;负数对其绝对值求补NNEG:MOVBINARY,AX;存放结果,3.3单重循环程序设计举例,例15对多个字符号数求和,结果不超出双字符号数,以十六进制数的形式显示其结果。注意:其结果不超出双字符号数思路:1、求多个数累加的方法,以0为基础多次累加。2、累加的和即8位十六进制数如何转换为ASCII码?通过循环左移把最高1位(二进制数左移4位)移至最低位,并用AND指令取出来,再转换为ASCII码,循环8次。注意:转换过程中,若该数码大于9,则需进行加9修正。,3.3单重循环程序设计举例,.386stacksegmentstackUSE16stackdw32dup(0)stackendsdatasegmentUSE16NUMDW1111H,2222H,3333H,4444H,5555HDW6666H,7777H,8888H,9999HCOUNTEQU($-NUM)/2RESULTDD0OBUFDB10DUP(0)dataends,3.3单重循环程序设计举例,codesegmentUSE16beginprocfarassumess:stack,cs:code,ds:datapushdssubax,axpushaxmovax,datamovds,axMOVCX,COUNTMOVEBX,0AGAIN1:MOVSXEAX,NUMEBX*2ADDRESULT,EAXINCEBXLOOPAGAIN1MOVDI,OFFSETOBUF,3.3单重循环程序设计举例,MOVCX,8;将十六进制数拆转为ASCII字符AGAIN2:ROLRESULT,4MOVAL,0FHANDAL,BYTEPTRRESULTADDAL,30HCMPAL,39HJNANA7ADDAL,7NA7:MOVDI,ALINCDILOOPAGAIN2,3.3单重循环程序设计举例,MOVWORDPTRDI,$HMOVBX,OFFSETOBUF-1;去掉前面的0CONT:INCBXCMPBYTEPTRBX,0JECONTMOVDX,BXMOVAH,9INT21Hretbeginendpcodeendsendbegin,3.3单重循环程序设计举例,例19将存储器中的16位无符号二进制数转换成BCD数,并以十进制数在显示器上显示出来。,思路:1、N10取其余数,则为十进制数,重复直到商为0.它是次数未知的循环.为条件控制循环.将余数ASC,送显示缓冲区,用9号功能显示即可.2、因除10的中间商有可能大于255,所以应采用32位除以16位除法。BINARYDW55HOBUFDB6DUP(0),3.3单重循环程序设计举例,MOVBX,OFFSETOBUF+5;BX指向低位字符地址MOVBYTEPTRBX,$MOVAX,BINARYMOVCX,10AGAIN:MOVDX,0;被除数扩展(无号符数扩展)DIVCX;余数DX(实际上放于DL),商AXADDDL,30H;十进制数转换为ASCDECBX;修改地址指针MOVBX,DL;存十进制数字串,放置数码时从低位开始ORAX,AX;商为0?JNZAGAINMOVDX,BX;显示MOVAH,9INT21Hret,3.3单重循环程序设计举例,多重循环即循环体内再套有循环.,例3.22对字节变量BUF中存放的n个字节符号数排序,3.4多重循环程序设计举例,将第1个单元中的数与其后n1个单元中的数逐个比较,每次比较之后总是把较大的数放在一个寄存器中,经过n1次比较之后得到n个数中的最大数,存入第1个单元。接着将第2个单元中的数与其后的n2个单元中的数逐个比较,经过n2次比较得到n1个数的最大数(亦即n个数中的第2大数)存入第2个单元.,BUFDB20,19,250COUNTEQU$-BUF,MOVSI,OFFSETBUFMOVDX,COUNT-1;外循环初始化OUTSID:MOVCX,DX;内循环初始化PUSHSI;保存第一个数地址MOVAL,SI;取第一个数INSIDE:INCSICMPAL,SIJNCNEXCHGXCHGSI,ALNEXCHG:LOOPINSIDE;内循环修改控制POPSIMOVSI,AL;存max至第一单元INCSIDECDX;外循环修改控制JNZOUTSID,3.4多重循环程序设计举例,程序设计的基本技术,1,3,2,顺序程序设计,分支程序设计,循环程序设计,子程序设计,4,串处理程序设计,5,4串处理程序设计,循环程序的特点:利用基址或变址寄存器建立地址指针,设置循环计数器,循环体执行完后修改地址指针和计数器,判断循环是否结束。字符串操作指令推出的原因:由于循环程序的特点,为了方便这类程序的设计,提出了字符串操作指令和重复前缀。字符串操作指令的特点:设计好初始值,选择合适的字符串操作指令和重复前缀即可,而不需要地址指针的修改及循环次数的控制。,4串处理程序设计,相关规定:*SI或ESI:源串的偏移地址指针,段地址为DS。*DI或EDI:目的串的偏移地址指针,段地址为ES。*DF=0:源串和目的串的偏移地址指针SI或ESI、DI或EDI增址传送。*DF=1:源串和目的串的偏移地址指针SI或ESI、DI或EDI减址传送。*增量或减量的量值由串属性是字节、字等来确定。,4串处理程序设计,一、方向标志置位和清除指令*方向标志置位指令格式:STD操作:DF=1,减址传送*方向标志清除指令格式:CLD操作:DF=0,增址传送二、串操作指令MOVS:串传送指令LODS:从源串中取数指令STOS:往目的串中存数指令CMPS:串比较指令SCAS:串收索指令,4串处理程序设计,1、串传送指令格式:MOVSdest-string,source-stringMOVSBMOVSWMOVSD指令的意义:把DS段中以SI或ESI为偏移地址的源串中的一个字节、一个字、一个双字传送到ES段以DI或EDI为偏移地址的目的串中,自动修改SI或ESI及DI或EDI从而指向下一个字节、一个字、一个双字。注意:1、源串和目的串的属性要相同。2、SI或ESI及DI或EDI的修改方向由方向标志DF确定,修改值的大小由串的属性确定。,4串处理程序设计,2、从源串中取数指令格式:LODSsource-stringLODSBLODSWLODSD指令的意义:把DS段中以SI或ESI为偏移地址的源串中的一个字节、一个字、一个双字取出送AL、AX、EAX、自动修改SI或ESI从而指向下一个字节、一个字、一个双字。注意:1、源串和AL、AX、EAX的属性要相同。2、SI或ESI的修改方向由方向标志DF确定,修改值的大小由串的属性确定。,4串处理程序设计,3、往目的串中存数指令格式:STOSdest-stringSTOSBSTOSWSTOSD指令的意义:把AL、AX、EAX中的内容存放到ES数据段中以DI或EDI为偏移地址的目的串中,自动修改DI或EDI从而指向下一个字节、一个字、一个双字。注意:1、DI或EDI的修改方向由方向标志DF确定,修改值的大小由串的属性确定。,4串处理程序设计,4、串比较指令格式:CMPSdest-string,source-stringCMPSBCMPSWCMPSD指令的意义:把DS段中以SI或ESI为偏移地址的源串中的一个字节、一个字、一个双字减去ES段以DI或EDI为偏移地址的目的串中的一个字节、一个字、一个双字,相减的结果不需存放,只影响到标志位。并自动修改SI或ESI及DI或EDI从而指向下一个字节、一个字、一个双字。注意:1、源串和目的串的属性要相同。2、SI或ESI及DI或EDI的修改方向由方向标志DF确定,修改值的大小由串的属性确定。,4串处理程序设计,5、串收索指令格式:SCASdest-stringSCASBSCASWSCASD指令的意义:是用AL、AX或EAX中的内容减去ES数据段中以DI或EDI为偏移地址的目的串中的一个字节、一个字、一个双字,相减的结果不需存放,只影响到标志位。自动修改DI或EDI从而指向下一个字节、一个字、一个双字。注意:1、DI或EDI的修改方向由方向标志DF确定,修改值的大小由串的属性确定。,4串处理程序设计,三、重复前缀分类:REP:无条件重复REPE/REPZ:相等/Z=1(结果为0)重复REPNE/REPNZ:不相等/Z=0(结果不为0)重复注意:1、重复前缀只允许用在串操作指令之前,且与串操作指令之间用空格隔开。其作用是使其后的串操作指令重复执行。2、使用时先判断重复次数CX或ECX是否为0,从而确定其是否重复,若为0,则不再重复,反之,则重复。每重复一次,CX或ECX自动减1。,4串处理程序设计,1、REP:无条件重复适用指令:MOVS串传送指令、STOS往目的串中存数指令作用:使传送操作无条件的重复执行,直到CX=0或ECX=0为止。2、REPE/REPZ(相同或Z=1即重复,找到不同的即停止重复)适用指令:CMPS:串比较指令、SCAS:串收索指令作用:使比较或搜索操作重复进行,直到CX=0或ZF=0(ZF=0即停止重复)ECX=0或ZF=0。3、REPNE/REPNZ(不相同或Z=0即重复,找到相同的即停止)适用指令:CMPS:串比较指令、SCAS:串收索指令作用:使比较或搜索操作重复进行,直到CX=0或ZF=1(ZF=1即停止重复)ECX=0或ZF=1。,4串处理程序设计,使用注意事项:1、源串应用DS:SI或DS:ESI间址,目的串应用ES:DI或ES:EDI间址,通常情况下,把源串和目的串放于同一个数据段
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年智能制造工程职业资格考试试题及答案
- 2025年全国工会财务知识竞赛题库及答案
- 2025年贵州省专业技术继续教育公需科目考试及答案
- 2025年国家开放大学(电大)《动画制作基础》期末考试备考试题及答案解析
- 2025年河南省南阳市专业技术继续教育公需科目考试及答案
- 2025年保健医培训题库及答案
- 2025年国家开放大学(电大)《人际沟通与协商技巧》期末考试备考试题及答案解析
- 2025年国家开放大学(电大)《品牌传播与公关管理》期末考试备考试题及答案解析
- 2025年国家开放大学(电大)《公司财务会计》期末考试备考试题及答案解析
- 吉林省水利安全员b证考试题库及答案解析
- 《犟龟》课件 统编版语文三年级上册
- 产后腹直肌分离的诊断与治疗
- 人民陪审员刑事培训课件
- 2025年陕西音乐联考试题及答案
- 2025年高一的数学知识点大纲
- 2025至2030拖拉机市场前景分析及行业深度研究及发展前景投资评估分析
- 2025年平面图形的画法说课教学课件
- 养老院保洁培训课件
- 中外运社招在线测评题
- 《生成式人工智能》 课件 第4章 Transformer模型
- 中医围手术期护理
评论
0/150
提交评论