微机原理第8章汇编语言程序设计.ppt

上传人:牧羊曲112 文档编号:6284491 上传时间:2023-10-13 格式:PPT 页数:145 大小:1.57MB
返回 下载 相关 举报
微机原理第8章汇编语言程序设计.ppt_第1页
第1页 / 共145页
微机原理第8章汇编语言程序设计.ppt_第2页
第2页 / 共145页
微机原理第8章汇编语言程序设计.ppt_第3页
第3页 / 共145页
微机原理第8章汇编语言程序设计.ppt_第4页
第4页 / 共145页
微机原理第8章汇编语言程序设计.ppt_第5页
第5页 / 共145页
点击查看更多>>
资源描述

《微机原理第8章汇编语言程序设计.ppt》由会员分享,可在线阅读,更多相关《微机原理第8章汇编语言程序设计.ppt(145页珍藏版)》请在三一办公上搜索。

1、微型计算机机原理及应用,程序设计的基本技术,1,2,3,5,顺序程序设计,分支程序设计,循环程序设计,子程序设计,4,串处理程序设计,注意:本书有关汇编语言程序设计只限于DOS环境下的实地址方式,该方式下字长为16位。顺序程序是最简单的程序,它的执行顺序和程序中指令的顺序完全一致,1 顺序程序设计,格式:MUL source IMUL source;符号整数乘法,1.1 乘除法指令,1.乘法指令MUL和符号整数乘法指令IMUL,1、源操作数 source可以是字节、字或双字,可为 寄存器或存储器操作数,不能为立即数。2、目的操作数是隐藏的,为被乘数,放于AL、AX或 EAX,视source的类

2、型属性决定是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中。,M0

3、V CH,10MOV CL,4MOV SB,AL;暂存十位和个位MOV AL,AH;百位存入AL中MUL CH;百位10AXMOV AH,SB;百位10的积小于255,所以只用AL存放即可SHR AH,CL;取十位ADD AL,AH;百位10+十位ALMUL CH;(百位10+十位)10 AXAND SB,0FH;取个位ADD SB,AL;(百位10+十位)10+个位SB,N2102N110N0(N210N1)10N0,程序段如下:,1.1 乘除法指令,格式:IMUL REG,source;REGREG X source IMUL REG,source,imm;REGsource X imm,

4、1.1 乘除法指令,注:符号整数乘法指令IMUL,1、双操作数乘法指令是用源操作数乘目的操作数,乘积存入目的操作数。2、三操作数乘法指令是用源操作数乘立即数,乘积 存入目的操作数。3、要求:其源操作数 source可为寄存器或存储器 操作数,目的操作数只能是16位和32位的寄存 器,源、目的操作数的类型要求一致。,格式:DIV source IDIV source;符号整数除法注意:源操作数source可以是字、字节或双字,可为 REG或MEM,不能为立即数目的操作数是隐藏的,放置被除数,可为AX或DX 和AX或EDX和EAX。,2.除法指令DIV和符号整数除法指令IDIV,1.1 乘除法指令

5、,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中,MOV AL,0FFHMOV CL,10MOV AH,0;将8位二进制数扩展为16位DI

6、V CL;商AL,余数AH(个位数)MOV CH,AH;暂存BCD数个位MOV AH,0 DIV CL;商AL,余数AH(十位数)MOV CL,4SHL AH,CL;BCD数十位移至高4位OR CH,AH;BCD数十位与个位拼合MOV AH,0MOV CL,10DIV CL;AH中余数为BCD数的百位MOV AL,CH;BCD数十位与个位送AL,1.1 乘除法指令,3.扩展指令CBW和CWD,扩展方法:要把一个8位二进制数除以另一个8位二进制数,要有一个16位二进制数在AX中,所以做8位除以8位的除法前先要把8位被除数扩展为16位。做16位除以16位的除法前要把16位被除数扩展为32位,做32

7、位除以32位的除法前要把32位被除数扩展为64位。这种扩展对于无符号数除法只需将AH或DX或EDX清0,而对符号整数除法则要通过扩展符号位来把被除数扩展。,1.1 乘除法指令,指令都隐含操作数 在做8位除以8位、16位除以16位、32位除以32位的符号整数除法之前,应先扩展AL或AX或EAX中的被除数。扩展指令和符号整数除法指令仅对补码数适用。,格式:CBW;AL的最高位符号位扩展至AH CWD;AX的最高位扩展至DX CWDE;AX的最高位扩展至EAX的高16位 CDQ;EAX的最高位扩展至EDX,1.1 乘除法指令,如:有一符号字数组变量ARRAY,第1个字是被除数,第2个字是除数,接着存

8、放商和余数,其程序段为:,MOV SI,OFFSET ARRAYMOV AX,SICWDIDIV WORD PTR 2SIMOV 4SI,AXMOV 6SI,DX,1.1 乘除法指令,1.2 BCD数调整指令,分析:两个 BCD数相加,其和仍应为BCD数,如不是 BCD数则结果错误。(正确)BCD数 十进制数码 加法器的和(错误)0000 0 0000 1001 9 1001 0001,0000 10 1010 0001,0101 15 1111 0001,0110 16 0001,0000 0010,0101 25 0001,1001如何修正?,1.2 BCD数调整指令,造成此结果的原因?产

9、生错误的原因是 8421BCD码为十进制,逢十进一,而四位二进制是逢十六进一,二者进位关系不同,当和数大于 9 时,8421BCD应产生进位,而十六进制还不可能产生进位。为此,应对结果进行修正。当运算结果小于等于 9 时,不需修正或加“0”,但当结果大于 9 时,应修正让其产生一个进位,加0110即可。如相加结果产生了进位位,其结果必定大于 9,所以,也需修正。对BCD数使用二进制数算术运算指令进行运算,然后执行一条专用调整指令来处理BCD数的结果。,1.BCD数加法调整指令DAA和AAA,格式:DAA功能:将AL中的数当作两个压缩BCD数相加之和调整为 正确的压缩BCD数。调整规则:(AL0

10、FH)9或AF=1,则AL加6;(AL0F0H)90H或CF=1,则AL加60H.,1.2 BCD数调整指令,(1)压缩BCD数加法调整,注意:该指令操作数隐含为AL,即只能对AL中的操作数据进行调整。导致压缩BCD数的加减指令只能针对字节运算。对结果调整时要用到CF和AF两个标志位,所以调整指令应紧跟BCD数加法指令DAA指令会影响标志如:MOV AX,3456H ADD AL,AH;AL8AH,AF0,CF0 DAA;AL90H,1.2 BCD数调整指令,例1 求两个字变量W1和W2中压缩BCD数之和,存入字节变量SUM中。,如:8931+5678=14609,程序段如下:W1 DW 89

11、31HW2 DW 5678HSUM DB 3 DUP(0)MOV AL,BYTE PTR W1;AL31H ADD AL,BYTE PTR W2;31+78=A9H,ALA9H,CF=0,AF=0 DAA;AL09H,CF=1 MOV SUM,AL;存个位和十位 MOV AL,BYTE PTR W1+1;AL89H ADC AL,BYTE PTR W2+1;89+56+CF=ALE0H,CF=0,AF=1 DAA;AL46H,CF=1 MOV SUM+1,AL;存百位和千位 MOV SUM+2,0;处理向万位的进位 RCL SUM+2,1,1.2 BCD数调整指令,格式:AAA功能:将AL中的

12、数当作两个非压缩BCD数相加之和 进行调整,得到正确的非压缩BCD数送AX。调整规则:(AL0FH)9或AF=1,则(AL+6)0FHAL,AH+1AH;否则,AL0FH AL,AH不变.,(2)非压缩BCD数加法调整,1.2 BCD数调整指令,注意:同DAA指令,AAA指令的操作数也隐含为AL,且要紧跟加法指令。导致非压缩BCD数的加减指令只能针对字节运算。AAA调整后的存放规律可理解为调整后的个位数送AL,十位数(即进位)加到AH中,故执行该指令前应注意AH是否清0。如:将两个BCD数的ASCII码相加,得到和的ASCII码:MOV AL,35H;5 ADD AL,39H;9,AL=6EH

13、 MOV AH,0 AAA;AX=0104H OR AX,3030H;AX=3134H 即14,1.2 BCD数调整指令,例2 求两个字变量W1和W2中非压缩BCD数之和,存入字节变量SUM中。,如:89+67=156,程序段如下:W1 DW 0809HW2 DW 0607HSUM DB 3 DUP(0)MOV AX,W1;AX0809H ADD AL,BYTE PTR W2;AL10H,AF=1 AAA;AX0906H MOV SUM,AL;存个位 MOV AL,AH ADD AL,BYTE PTR W2+1;AL0FH,AF=0 MOV AH,0 AAA;AL05H,AH=01H MOV

14、WORD PTR SUM+1,AX;存十位和百位,1.2 BCD数调整指令,格式:DAS功能:将AL中的数当作两个压缩BCD数相减之差进 行调整,得到正确的压缩BCD数。调整规则:(AL0FH)9或AF=1,则AL减6;(AL0F0H)90H或CF=1,则AL减60H.,如:MOV AX,5643H SUB AL,AH;AL=DEH,有借位 DAS;AL=78H,保持借位,即134-56,2.BCD数减法调整指令DAS和AAS,(1)压缩BCD数减法调整,1.2 BCD数调整指令,格式:AAS功能:将AL中的数当作两个非压缩BCD数相减之差 进行调整,得到正确的非压缩BCD数送AX。调整规则:

15、(AL0FH)9或AF=1,则(AL-6)0FHAL,AH-1AH;否则,AL0FH AL,AH不变.,如:MOV AX,0806H SUB AL,07H;AX=08FFH AAS;AX=0709H,(2)非压缩BCD数减法调整,1.2 BCD数调整指令,格式:AAM功能:将AL中小于64H的二进制数变换为非压缩BCD数送AX调整规则:AL/0AH AH(十位),AL MOD 0AH AL(个位),如:MOV AL,63H AAM;AX=0909H,3.非压缩BCD数乘除法调整指令AAM和AAD,(1)乘法调整,1.2 BCD数调整指令,例3 字变量W和字节变量B分别存放着两个非压缩BCD数,

16、编写求两数之积,并将它存储到JJ字节变量中的程序。程序段如下:W DW 0307HB DB 9JJ DB 3 DUP(0)MOV AL,BYTE PTR W;AL=07H MUL B;AX=003FH AAM;AX=0603H MOV WORD PTR JJ,AX MOV AL,BYTE PTR W+1;AL=03H MUL B;AX=001BH AAM;AX=0207H ADD AL,JJ+1;07H+06H=0DH,即AL=0DH AAA;进位直接加入AH!AX=0303H MOV WORD PTR JJ+1,AX,1.2 BCD数调整指令,格式:AAD功能:将AX中的两位非压缩BCD数变

17、换成二进制数集中放在AL中。,如:MOV AX,0906H MOV DL,06H AAD;AX=0060H DIV DL;AL=10H,AH=0 MOV DL,AH;存余数 AAM;AX=0106H,(2)除法调整,注:此指令可对被除数进行预调整加、减和乘法调整在相应运算操作之后进行,而除法的调整在除法操作之前进行,1.2 BCD数调整指令,例3.4字变量W和字节变量B中分别存放着两个非压缩BCD数编程求二者的商和余数,并分别存放到字变量QUOT和字节变量REMA中。程序段如下:W DW 0909H B DB 5 REMA DB 0 QUOT DW 0 MOV AX,W AAD;0909H63

18、H DIV B;63H5=13H4,AL=13H,AH=04H MOV REMA,AH AAM;13H0109H MOV QUOT,AX,1.2 BCD数调整指令,例5 从键盘键入09的任一自然数N,求其立方值并将其送显示器显示.,INPUT DB Please Input N(09):LFB DB 0 1 8 27 64 DB 125216343512729N DB 0 MOV DX,OFFSET INPUT MOV AH,9 INT 21H,可用乘法运算实现,也可用查表法实现。查表法程序段如下:,1.3 顺序程序设计举例,MOV AH,1;输入并显示器显示N,N送入AL INT 21HMO

19、V N,ALMOV AH,2;2号系统功能调用-换行MOV DL,0AHINT 21HMOV DL,NAND DL,0FH;将N转换为N(将ASCII码转换为数字)MOV CL,2;将N乘以4 SHL DL,CL MOV DH,0;8位4N扩展为16位的地址偏移量 ADD DX,OFFSET LFB;4N+表的偏移地址 MOV AH,9INT 21H,1.3 顺序程序设计举例,例6 编写两个32位无符号数的乘法程序程序如下:.386stack segment stack USE16 stack dw 32 dup(0)stack endsdata segment USE16AB DD 1234

20、5678HCD DD 12233445HABCD DD 2 DUP(0)data ends code segment USE16 start proc far assume ss:stack,cs:code,ds:data,1.3 顺序程序设计举例,push ds sub ax,ax push ax mov ax,data mov ds,ax MOV EAX,AB MUL CD MOV ABCD,EAX MOV ABCD+4,EDX retstart endpcode ends end start,1.3 顺序程序设计举例,程序设计的基本技术,1,3,5,顺序程序设计,分支程序设计,循环程序设

21、计,子程序设计,4,串处理程序设计,2,顺序程序是按指令的书写(存放)顺序执行,而实际情况需要根据不同的条件做不同的处理,形成分支.汇编中的分支的条件往往是通过标志的不同状态而反映的。常用改变标志指令和转移指令实现分支。分类:JMP、JCOND两类。转移指令将控制程序转 向其后的目的标号指定的地址。条件转移 指令紧跟在能改变并设置状态的指令之后,由状态标志决定程序的走向。,2 分支程序设计,通用格式:Jcond short_lable操作:若满足条件,则OFFSET short_lableIP,实 现转移;否则顺序执行.short_lable 短标号,条件转移是相对转移指令,即从当前地址到目标

22、地址的偏移量为-128127(从本指令则为-126+129,因为条件转移指令均为双字节指令),故只能实现段内转移.80386以后,在实地址方式下,能够转移到代码段的任何位置。,2.1 条件转移指令,仅判断一个标志位实现转移.,1.简单条件转移指令,2.1 条件转移指令,如:JZ/JE S_LAB为零/相等转移 操作:测试前面操作结果为0则转移,即判ZF=1 转移.JZ,JE为等价助记符,任写一种均可,可根据程序设计意图选择.如:MOV BX,0FFFFH INC BX;ZF=1 JZ NEXT;为0转移到NEXT NEXT:,2.1 条件转移指令,如:MOV BL,1;CMP BL,5;ZF=

23、0 JE NEXT;比较结果相等则转移到NEXT;不相等顺序执行NEXT:注意:此类指令,均只测试前面的操作结果所设标志,指令本身不影响标志.所以,在条件转移指令前,一定有一条能正确影响标志的指令.,2.1 条件转移指令,2.无符号数条件转移指令,条件转移常依据两个数的关系来决定,两个数的关系 除相等与否,还有大小之分,比较大小时,要区分是无符号数还是符号数,否则答案不明确.,如:0FFH00H?视为无符号数 0FFH=255 00H;视为符号数 0FFH=-1 00H.所以,应将两种类型的数分开比较:对无符号数使用术语:低于/高于 Below/Above;对带符号数使用术语:小于/大于 Le

24、ss/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 条件转移指令,格式:JMP target操作:将控制转向目的标号tar

25、get:target在段内:target的偏移地址IP target在段外:target的偏移地址IP target的段首址CS,条件转移范围为-128+127,而无条件转移指令没有范围限制.在分支程序中往往需要它将各分支重新汇集到一起.如何实现条件转移指令的范围?,2.2 无条件转移指令,1.无条件直接转移指令,格式:JMP dest 操作:转移的目的地址放于寄存器或存储器。目的操作数为寄存器寄存器内容送IP 目的操作数为字变量字变量内容送IP 目的操作数为双字变量双字变量内容送CS和IP 如:JMP NEXT;无条件转移转到NEXT NEXT:如:JMP WORD PTRBX;即(BX)I

26、P,2.无条件间接转移指令,2.2 无条件转移指令,注意:分支实现的基本方法有两种:一种是利用比较转移指令实现分支;一种是利用跳转表实现分支.视比较对象,正确选择合适的转移指令.要为每个分支安排正确出口.凡是可共用的部分,应尽量放在公共程序段中以使程序简短.在调试分支程序时,应使用多组数据,分别对各种分支进行反复测试.,2.3 分支程序设计举例,例7 编程计算下面函数值(X,Y均为字节符号数),思路:1、如何确定X、Y是同号、异号数?利用XOR X,Y 的结果来确定。若同号,则异或 的结果必为0;若异号,则异或的结果必为1。2、如何确定X、Y是正数或负数?利用CMP指令,比较X,Y,与0 的大

27、小来确定。,2.3 分支程序设计举例,例7 编程计算下面函数值(X,Y均为字节符号数),X DB-5Y DB 20Z DB 0,MOV AL,X XOR AL,Y;根据X、Y的符号置S标志,相同为0 JS DIFF;符号位S=1转移,相异为1,X、Y相异结束 MOV Z,1;Z赋1 CMP X,0;相同后,判断其中某数的符号 JNS NOCHA;大于等于0,结束 NEG Z;小于0,求补得1NOCHA:RETDIFF:MOV Z,0 RET,2.3 分支程序设计举例,例8 从键盘上键入09中任一自然数N,将2的N次方值在显示器的下一行显示出来。思路:1、计算2N的方法:1左移N位,得到的结果为

28、二进制数。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,将

29、2的N次方值在显示器的下一行显示出来。程序段如下:OBUF DB 6 DUP(0)MOV AH,1 键盘键入的数的ASCII码送至AL INT 21H AND AL,0FH;将N转换为N MOV CL,ALMOV AX,1;1X2NSHL AX,CLMOV BX,5MOV OBUFBX,$MOV CX,10;转换为十进制数的ASCII码,2.3 分支程序设计举例,2.3 分支程序设计举例,MOV CX,10;转换为十进制数的ASCII码AGAIN:MOV DX,0 DIV CXOR DL,30HDEC BXMOV OBUFBX,DL;将转换结果“2”的ASCII码存入AND AX,AX;判断转

30、换是否结束 JNZ AGAINSUB BX,2MOV WORD PTR OBUFBX,0A0DH;存入回车换行MOV DX,BXADD DX,OFFSET OBUFMOV AH,9INT 21H RET,例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 分支程序设计举

31、例,例9 从键盘上键入2位十六进制数将其拼合成一个字节存入字节变量SB中。IBUF DB 3,0,3 DUP(0)SB DB 0MOV DX,OFFSET IBUF;键入2位十六进制数MOV AH,10INT 21HMOV AX,WORD PTR IBUF+2;键入字符送AXSUB AX,3030H;字符变为十六进制数CMP AL,0AHJB LNSUB7SUB AL,7LNSUB7:CMP AH,0AHJB LNSUB7SUB AH,7,2.3 分支程序设计举例,HNSUB7:MOV CL,4;将AX中的数拼合成一个字节SHL AL,CLOR AL,AHMOV SB,AL RET,2.3 分

32、支程序设计举例,例10 某工厂的产品有8种不同的加工处理程序P0P7,根据键盘输入,做不同的处理,若是07以外的键,则退出加工处理,此例可以用两种方法实现:一种是用逐一比较判断,逐次比较转移实现二叉分支、整体上实现多分支;另一种是跳转表法,直接实现多分支.,2.3 分支程序设计举例,2.3 分支程序设计举例,方法一逐一比较法.简单,条理清楚,易于实现,但转移范围只能是:128127,要求:分支不能太多。INPUT DB Input(07):$MOV DX,OFFSET INPUT;显示提示 MOV AH,9 INT 21H MOV AH,1;等待键入一个字符 INT 21H CMP AL,0;

33、为0字符则转P0 JE P0 CMP AL,1;为1字符则转P1 JE P1,2.3 分支程序设计举例,CMP AL,2JE P2 CMP AL,3JE P3 CMP AL,4 JE P4CMP AL,5JE P5CMP AL,6JE P6CMP AL,7JE P7RET;不是07则退出程序,2.3 分支程序设计举例,P0:MOV DL,0;键入0则显示0以替代P0程序 JMP EXITP1:MOV DL,1;键入1则显示1以替代P1程序 JMP EXIT P7:MOV DL,7 JMP EXITEXIT:MOV AH,2 INT 21H RET;分支程序一定要注意汇合到结束处,2.3 分支程

34、序设计举例,方法二:跳转表法 利用无条件的间接转移指令可实现远距离的多分支(间接跳转至不同分支的入口处)在数据区造一地址表,存放不同的分支入口地址;设表的首地址为PTAB,每一个 PTAB P0入口地址占一个字单元,2 P1Pi的入口地址PTAB2i 4 P2若将2iBX,则JMP PTABBX:可转到Pi入口处,2.3 分支程序设计举例,INPUT DB INPUT(07):$PTAB DW P0,P1,P2,P3,P4,P5,P6,P7;定义地址表 MOV DX,OFFSET INPUT;显示提示 MOV AH,9 INT 21H MOV AH,1;等待键入07的数字 INT 21H CM

35、P AL,0;检查输入数据,不是07则退出 JB EXIT CMP AL,7 JA EXIT AND AX,0FH;i2BX ADD AX,AX,2.3 分支程序设计举例,MOV BX,AX JMP PTABBX;(PTAB2i)PiIPP0:MOV DL,0;键入0则显示0以替代P0程序 JMP DOWNP1:MOV DL,1;键入1则显示1以替代P1程序 JMP DOWN P7:MOV DL,7 DOWN:MOV AH,2 INT 21H RET,键入的ASC码为无符号数,所以,用JB、JA等指令而不能用JG、JL等。,请思考:若为跨段标号,应修改哪些地方?注:只需修改:DWDD(存IP、

36、CS)、i2i4即可,程序设计的基本技术,1,2,5,顺序程序设计,分支程序设计,循环程序设计,子程序设计,4,串处理程序设计,3,循环程序的四部分:(1)循环准备(循环初始化)建地址指针、置计数初值、设置必要的常数、对工作寄存 器及工作单元置初值或清0等.(2)循环体 重复执行的部分,循环的核心.(3)循环的修改 修改计数器、寄存器、地址指针(基址或变址寄 存器)、恢复某些参数。为下一轮循环做准备。(4)循环控制 修改计数器,判断控制循环是否结束或继续。,3 循环程序设计,循环程序的具体结构流程有两种:,3.1 循环程序的基本结构,例:编程统计字变量W中有多少位1,并将结果存入字节 变量N中

37、。,方法一:先执行,后判断 MOV N,0 MOV CX,16LOP:SHL W,1 JNC NOINC INC NNOINC:DEC CX JNZ LOP ret,方法二:先判断,后执行 MOV N,0LOP:CMP W,0 JZ DONE SHL W,1 JNC LOP INC N JMP LOPDONE:ret,DEC CXJNZ LOP,3.1 循环程序的基本结构,循环控制方法最常见的有两种:计数控制 循环次数已知,故可用某个寄存器或单元作为计数器,用计数器的值来控制循环的结束与否.条件控制 循环次数未知,即循环次数与循环体的执行情况有关,通过条件测试指令来测试是否满足循环条件,以控制

38、循环是否结束.,3.1 循环程序的基本结构,此类指令的特点是:1、循环次数由 CX计数器控制.循环指令本身不影 响标志。2、同条件转移指令一样,重复控制指令也是相对 转移指令(即段内转移),重复控制指令的目 的地址必须在本指令地址的126129字节的 范围之内。,3.2 重复控制指令,LOOP指令:无条件循环指令,格式:LOOP short-lable操作:CX1CX,当CX0则转short-lable 所指指令;否则顺序执行.注意:在使用LOOP指令前,必须把循环次数送入CX.LOOP shotr-lable=若CX=0,则循环要进行65536次.,3.2 重复控制指令,LOOPZ/LOOP

39、E指令:,格式:LOOPZ/LOOPE short-lable操作:CX1 CX,当CX0,且ZF=1(相等)则转移;否则顺 序执行.注意:本指令不影响ZF,ZF由前面指令设定.即前 面比较结果相等。,3.2 重复控制指令,格式:LOOPNZ/LOOPNE short-lable操作:CX1 CX,当CX0,且ZF=0(不相等)则转移;否则 顺序执行.,格式:JCXZ short-lable操作:CX=0转移,否则顺序执行.注意:指令本身不作减操作,本指令一般用在循环 的开始处,当CX=0,则跳过循环。,LOOPNZ/LOOPNE指令,JCXZ指令,3.2 重复控制指令,(注意循环结构,防止死

40、循环),下面通过几个例题介绍循环控制计数控制条件控制计数与条件双重控制对于某些问题,还有一些特殊控制,如:设开关变量等,可参其他教材.,3.3 单重循环程序设计举例,例11 计算 Z=X+Y,其中X、Y 为双字变量.,32位系统:X DD 72345678H Y DD 90ABCDEFH Z DB 5 DUP(0)MOV EAX,X ADD EAX,Y MOV DWORD PTR Z,EAX MOV Z+4,0 RCL Z+4,1,思路:按照由低到高字节相加.最后的和可能占5个字节.用一个双字变量所占的字节数4作为循环体的控制条件,为计数控制.,3.3 单重循环程序设计举例,例11 计算 Z=

41、X+Y,其中X、Y 为双字变量.,X DD 72345678HY DD 90ABCDEFHZ DB 5 DUP(0),MOV CX,4;设计数初值 MOV SI,0;地址指针 AND AX,AX;清CF,使CF=0AGAIN:MOV AL,BYTE PTR XSI ADC AL,BYTE PTR YSI MOV ZSI,AL INC SI;指下一个字节 LOOP AGAIN;计数控制 MOV ZSI,0;处理向 RCL ZSI,1 万位进位,3.3 单重循环程序设计举例,例12 编写将某数据区十六进制数加密的程序.每个数字占一个字节,分析:设加密数关系如下:十六数:0 1 2 3 4 5 6

42、7 8 9 A B C D E F 加密数:A 9 8 E F 1 0 B 2 5 D 3 7 4 6 C 解密数:6 5 8 B D 9 E C 2 1 0 7 F A 3 4 即发0,则发A;发3,则发E;发A,则发D解密规律解密数的位移量=加密数表的数值 如:解密数0的位移量是=0AH 如:解密数4的位移量是=0FH,3.3 单重循环程序设计举例,HEXS DB 1,2,0EH;待发数 N EQU$-HEXS;统计待发数个数JMH DB N DUP(0);存加密数JMB DB 0AH,9,8,0EH,0FH,1,0,0BH,2,5,0DH,3,7,4,6,0CH MOV CX,N MOV

43、 BH,0 初始化 MOV SI,0AGAIN:MOV BL,HEXSSI;取十六进制数,其大小正 好为该数码在加密表中的 地址偏移量。MOV AL,JMBBX;BX+AL AL MOV JMHSI,AL;存加密数 INC SI;指向下一数 LOOP AGAIN;计数控制,加密表,3.3 单重循环程序设计举例,JMH DB 0FH,0EH,8,9,0AH;设加密数N EQU JMH;统计加密数个数KMB DB 6,5,8,0BH,0DH,9,0EH,0CH,2,1,0,7,0FH,0AH,3,4KMH DB N DUP(0);存解密数 MOV CX,N MOV BX,OFFSET KMB MO

44、V SI,0NEXT:MOV AL,JMHSI XLAT KMB MOV KMHSI,AL INC SI LOOP NEXT,解密表,3.3 单重循环程序设计举例,例13 将字节变量SB中的8位二进数送显示器显示.,思路:把SB中的八位二进制数0或1,当成数码显示 出来,八位数码加1,需预留9个单元。1、为了避免通过CF来传递二进制数,先将SB中的8 位二进制数送入AL中,再左移AX,将1位二进制数直接移入AH中。即将字节变量中的1位二进制数移入AH中,再将移入的二进制数变为ASCII码。,SB DB 9AHOBUF DB 9 DUP(0),3.3 单重循环程序设计举例,SB DB 9AH O

45、BUF DB 9 DUP(0)MOV CX,8 MOV BX,0;BX为输出缓冲区的地址偏移量 MOV AL,SBAGAIN:MOV AH,0 SHL AX,1 ADD AH,30H MOV OBUFBX,AH INC BX LOOP AGAIN MOV 0BUFBX,$MOV DX,OFFSET OBUF MOV AH,9 INT 21H ret,3.3 单重循环程序设计举例,二进制数显示:,SB DB 8AH OBUF DB 3 DUP(0)MOV CX,0204H;CH中为循环次数,CL中为移位次数 MOV BX,0;BX为输出缓冲区的地址偏移量 MOV AL,SBAGAIN:MOV A

46、H,3;将数码转换为ASCII码 SHL AX,CL CMP AH,39H;确定数码介于0-9或A-F JBE NAD7 ADD AH,7 NAD7:MOV OBUFBX,AH INC BX DEC CH JNZ AGAIN,3.3 单重循环程序设计举例,十六进制数显示:,MOV 0BUFBX,$MOV DX,OFFSET OBUF MOV AH,9INT 21Hret,例14 将键入的十进制数(3276832767)转换为二进制数。,思路:1、数码的输入采用10号系统功能调用,存入的是ASCII码。2、判断数码是正数或负数,若为正数则直接从第一个数码 转至第3步进行转换,若为负数,则移至第2

47、个数码开始 转换。如何判断其正负?将该数码与“-”比较,若结果为0,则标志位Z=1,否则 Z=0,判断时,保留其Z,因为若是负数,需取其补码。3、十进制数码转换为二进制数,采用乘10的方法,此 部分采用循环程序,循环的次数为数码个数。具体为:,3.3 单重循环程序设计举例,算法:十进制数二进制数:反复10+Di循环体 D4D3D2D1D0=D4104D3103 D0(010+D4)10+D3)10+D2)10+D1)10+D0循环次数 输入负数输入数码个数1;输入正数(不带符号)输入数码个数循环体中对其绝对值转换为二进制数,若为负数还应求补,3.3 单重循环程序设计举例,BINARY DW 0

48、OBUF DB INPUT A DECIMAL(3276832767):$IBUF DB 7,0,7 DUP(0)MOV DX,OFFSET IBUF;键入十进制数,存入的ASCII码 MOV AH,10 INT 21H MOV CL,IBUF+1;十进制数位数(含“-”)送CX MOV CH,0 MOV SI,OFFSET IBUF+2;指向键入的第一个字符 CMP BYTE PTRSI,;判是否为负数 PUSHF;保护零标志 JNE SININC;正数跳转至SININC INC SI;越过“-”指向数字 DEC CX;实际字符数少1(“-”号),3.3 单重循环程序设计举例,SININC:

49、MOV AX,0;开始十进制二进制AGAIN:MOV DX,10;(010+a4)10+)10+a0 MUL DX AND BYTE PTRSI,0FH;十进制数ASC转换为BCD数。ADD AL,SI ADC AH,0 INC SI;指向下一位 LOOP AGAIN;计数循环 POPF;恢复零标志 JNZ NNEG;非0即为正数,则不求补 NEG AX;负数对其绝对值求补NNEG:MOV BINARY,AX;存放结果,3.3 单重循环程序设计举例,例15 对多个字符号数求和,结果不超出双字符号数,以十六进制数的形式显示其结果。注意:其结果不超出双字符号数 思路:1、求多个数累加的方法,以0为

50、基础多次累加。2、累加的和即8位十六进制数如何转换为ASCII码?通过循环左移把最高1位(二进制数左移4位)移至最 低位,并用AND指令取出来,再转换为ASCII码,循环 8次。注意:转换过程中,若该数码大于9,则需进行加9修正。,3.3 单重循环程序设计举例,.386stacksegment stack USE16 stack dw 32 dup(0)stackendsdatasegment USE16NUMDW 1111H,2222H,3333H,4444H,5555HDW 6666H,7777H,8888H,9999HCOUNTEQU($-NUM)/2RESULTDD 0OBUFDB 1

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

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


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号