第4章 选择与循环_第1页
第4章 选择与循环_第2页
第4章 选择与循环_第3页
第4章 选择与循环_第4页
第4章 选择与循环_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、14.1 4.1 测试和控制指令测试和控制指令 4.2 4.2 选择结构程序选择结构程序4.3 4.3 循环结构程序循环结构程序2指令指令 3指令指令 2顺序结构顺序结构 入口入口指令指令 1 出口出口分支结构分支结构入口入口满足满足条件条件? 分支分支 1 出口出口YN 分支分支 2循环结构循环结构入口入口 指令指令 修改条件修改条件条件满足否?条件满足否?Y 出口出口N结构化程序设计的结构化程序设计的“基本结构基本结构”3IPCSn指令存放在内存中指令存放在内存中,处理器从内存取指令分析执行处理器从内存取指令分析执行n处理器用处理器用CS:IP计算下一条要执行的指令在内存的物理地址计算下一

2、条要执行的指令在内存的物理地址 PA=CS*16+IPn指令一般是从前到后顺序执行的指令一般是从前到后顺序执行的CPU执行当前指令时,执行当前指令时,IP被更改为被更改为下一条指令下一条指令的地址的地址CS和和IP不能用不能用MOV等传送指令直接修改等传送指令直接修改nCPU通过执行通过执行转移控制类指令转移控制类指令改变它们的值,从而改变指令改变它们的值,从而改变指令的顺序执行。的顺序执行。回顾:回顾:8086/8088CPU专用寄存器专用寄存器下一条指令的段地址下一条指令的段地址下一条指令的偏移地址下一条指令的偏移地址44.1.1 4.1.1 无条件转移指令无条件转移指令4.1.2 4.1

3、.2 比较和测试指令比较和测试指令 4.1.3 4.1.3 条件转移指令条件转移指令 54.1.1 无条件转移指令无条件转移指令n转到转到label指定的目标地址处,执行那里的指令指定的目标地址处,执行那里的指令n目的地址目的地址label的位置有的位置有2种情形:种情形:n和和JMP指令在同一个段,叫做指令在同一个段,叫做段内转移,段内转移,转移时转移时 CPU只只改变改变IP;n和和JMP指令不在同一个段,叫做指令不在同一个段,叫做段间转移,段间转移,转移时转移时CPU既要更改既要更改IP又要更改又要更改CS,n目的地址目的地址label有两种表示方式:有两种表示方式:nlabel是目标地

4、址处指令的标号,叫做是目标地址处指令的标号,叫做直接寻址直接寻址nlabel是寄存器或内存单元,跳转目的地址在寄存器或内是寄存器或内存单元,跳转目的地址在寄存器或内存中,叫做存中,叫做间接寻址间接寻址JMP labelJMP label 段内转移、直接寻址段内转移、直接寻址 段内转移、间接寻址段内转移、间接寻址 段间转移、直接寻址段间转移、直接寻址 段间转移、间接寻址段间转移、间接寻址6段内转移、直接寻址段内转移、直接寻址JMP labelJMP labelcode1 segment jmp again ;转到;转到again处执行处执行again: dec cx ;again处的指令处的指令

5、code1 ends执行执行JMP指令时:指令时:CS的内容不变,将以的内容不变,将以again为标号的指令的偏移地址装入为标号的指令的偏移地址装入IP。7段内转移、间接寻址段内转移、间接寻址JMP r16/m16 JMP r16/m16 n将将1616位寄存器或内存字单元内容位寄存器或内存字单元内容IPIP寄存器,寄存器,CSCS内容保持不变。内容保持不变。例例1:假设假设AX存放了段内某条指令的偏移地址,则存放了段内某条指令的偏移地址,则 jmp ax ;IPAX例例2:假设:假设DS:2000H存放了某条指令的偏移地址,则存放了某条指令的偏移地址,则 jmp word ptr 2000h

6、 ;IPDS:2000hcode1 segmentlea ax,again jmp ax ;转到;转到again处执行处执行again: dec cx ;again处的指令处的指令code1 ends81)JMP ONE;近程直接转移;近程直接转移假设假设ONE是程序中某条指令的标号,是程序中某条指令的标号,并且并且已在数据段定义字变量已在数据段定义字变量“TARGET”如下如下 :TAEGETDW ONE下面四种方法都可以实现同一个代码段中向标号下面四种方法都可以实现同一个代码段中向标号“ONE”的跳转:的跳转:段内转移举例段内转移举例2)LEA DX, ONE JMP DX;寄存器间接段内

7、转移;寄存器间接段内转移3)LEA BX, TARGET JMP WORD PTRBX ;存储器间接段内转移;存储器间接段内转移4)JMP TARGET;存储器间接段内转移;存储器间接段内转移9段间转移、直接寻址段间转移、直接寻址JMP far ptr labelJMP far ptr label;IPlabelIPlabel的偏移地址的偏移地址;CSlabelCSlabel的段地址的段地址n将标号所在段的段地址将标号所在段的段地址CS,标号处指令的偏移地址,标号处指令的偏移地址IP;CPU转移到指定代码段标号处执行转移到指定代码段标号处执行code1 segment assume cs:co

8、de1 start:mov ax,20 mov bx,10 add ax,bx jmp far ptr exitcode1 endscode2 segment assume cs:code2 exit:mov ax,4c00h int 21hcode2 ends end start10段间转移、间接寻址段间转移、间接寻址JMP far ptr memJMP far ptr mem;IPmemIPmem,CSmem+2CSmem+2n用一个双字存储单元存储要跳转的目标地用一个双字存储单元存储要跳转的目标地址。低位字送址。低位字送IPIP,高位字送,高位字送CSCS例如:例如: 让处理器转移到让处

9、理器转移到1500h:0取指令执行取指令执行mov word ptr bx,0mov word ptr bx+2,1500hJMP far ptr bx111)JMP FAR PTR TWO;远程直接转移;远程直接转移假设假设TWO是程序中一个代码段中的某条指令的标号,是程序中一个代码段中的某条指令的标号,并且已在数据段定义双字变量并且已在数据段定义双字变量“FAR_TGT”如下:如下:FAR_TGTDDTWO下面三组指令都可以实现向远程标号下面三组指令都可以实现向远程标号“TWO”的转移:的转移:2)LEA BX, FAR_TGT JMP DWORD PTRBX;远程间接转移;远程间接转移3

10、)JMP FAR_TGT;远程间接转移;远程间接转移12目标地址的范围目标地址的范围n段内转移:不更改段内转移:不更改CS,只改变只改变IP,又分:,又分:l短转移(短转移(short):转移范围在段内):转移范围在段内128127字节字节l近转移(近转移(near):在当前代码段):在当前代码段64KB范围内转移范围内转移n段间转移段间转移远转移(远转移(far)n更改更改CS和和IPn从当前代码段跳到另一个代码段,可以在从当前代码段跳到另一个代码段,可以在1MB范围跳转范围跳转n目标地址是双字目标地址是双字(16位偏移地址和位偏移地址和16位段地址位段地址),叫做,叫做32位远指针位远指针

11、代码段代码段代码段代码段 实际编程时,汇编程序会根据目标地址的距实际编程时,汇编程序会根据目标地址的距离,离,自动处理自动处理成短转移、近转移或远转移成短转移、近转移或远转移 程序员可用操作符程序员可用操作符short、near ptr 或或far ptr 强制指明或改变转移的属性强制指明或改变转移的属性最常用格式:最常用格式:JMP 语句标号语句标号代码段代码段代码段代码段134.1.2 4.1.2 比较和测试指令比较和测试指令目的操作数目的操作数dest:8位位/16位的寄存器位的寄存器/存储器操作数。存储器操作数。源操作数源操作数src:与:与dest同类型的寄存器同类型的寄存器/存储器

12、存储器/立即数。立即数。功能功能:运算后影响标志位,但运算后影响标志位,但不保留运算结果不保留运算结果。用途:用途:CMP比较两个数的大小关系,但不改变它们的值。比较两个数的大小关系,但不改变它们的值。AX?=BXTEST 判断目的操作数中个别二进制位,但不改变它的值。判断目的操作数中个别二进制位,但不改变它的值。判断一个数的奇偶性判断一个数的奇偶性指令操作码指令操作码指令格式指令格式功能描述功能描述CMPCMP dest, src(dest) (src),不存结果,不存结果TESTTEST dest, src(dest) (src),不存结果,不存结果144.1.3 4.1.3 条件转移指令

13、条件转移指令“J”-Jump“xx”是转移的条件是转移的条件“label”只能只能为目标指令的标为目标指令的标号。号。都属于段内短转移。都属于段内短转移。Jxxlabel操作码助记符操作码助记符条件条件指令功能指令功能JZ/JEZF=1相等或为相等或为0转移转移JNZ/JNEZF=0不相等或不为不相等或不为0转移转移JSSF=1结果是负数,则转移结果是负数,则转移JNSSF=0结果不是负数,则转移结果不是负数,则转移JOOF=1结果溢出,则转移结果溢出,则转移JNOOF=0结果没有溢出,则转移结果没有溢出,则转移JP/JPEPF=1低位字节有偶数个低位字节有偶数个1,则转移,则转移JNP/JP

14、OPF=0低位字节有奇数个低位字节有奇数个1,则转移,则转移JB/JNAE/JCCF=1有进借位或,则转移有进借位或,则转移JAE/JNB/JNCCF=0无进借位或无进借位或,则转移,则转移JBE/JNACF=1或或ZF=1,则转移,则转移JA/JNBECF=0且且ZF=0,则转移,则转移JL/JNGESFOF,则转移,则转移JGE/JNLSF=OF,则转移,则转移JLE/JNGSFOF或或ZF=1 ,则转移,则转移JG/JNLESF=OF且且ZF=0 ,则转移,则转移JCXZCX=0CX=0,则转移则转移15(1)根据两个有符号数比较结果的条件转移指令)根据两个有符号数比较结果的条件转移指令

15、两个有符号数的比较结果通过两个有符号数的比较结果通过OF,SF,ZF反映出来。反映出来。 G (Greater,大于,大于) L (Less,小于,小于) E (Equal,等于,等于) N (Not,否,否)指令助记符指令助记符 指令功能指令功能转移条件转移条件JG, JNLE大于(不小于等于)时转移大于(不小于等于)时转移OFSF= 0且且ZF=0JGE, JNL大于等于(不小于)时转移大于等于(不小于)时转移OFSF= 0JZ, JE为零(相等)时转移为零(相等)时转移ZF= 1JNZ, JNE不为零(不相等)时转移不为零(不相等)时转移ZF=0JL, JNGE小于(不大于等于)时转移小

16、于(不大于等于)时转移OFSF= 1JLE, JNG小于等于(不大于)时转移小于等于(不大于)时转移OFSF= 1或或ZF=116(2)根据两个无符号数比较结果的条件转移指令)根据两个无符号数比较结果的条件转移指令 两个无符号数的比较结果通过两个无符号数的比较结果通过CF,ZF反映出来。反映出来。 A(Above,高于),高于) B(Below,低于),低于) E(Equal,等于),等于)指令助记符指令助记符指令功能指令功能转移条件转移条件JA, JNBE高于(不低于等于)时转移高于(不低于等于)时转移CF= 0且且ZF=0JAE, JNB, JNC高于等于(不低于)时转移高于等于(不低于)

17、时转移CF= 0JZ, JE为零(相等)时转移为零(相等)时转移ZF= 1JNZ, JNE不为零(不相等)时转移不为零(不相等)时转移ZF=0JB, JNAE, JC低于(不高于等于)时转移低于(不高于等于)时转移CF= 1JBE, JNA低于等于(不高于)时转移低于等于(不高于)时转移CF= 1或或ZF=117(3)根据单个标志位的条件转移指令)根据单个标志位的条件转移指令 JS和和JNS: 利用符号标志利用符号标志SF,判断结果是正是负,判断结果是正是负 JO和和JNO: 利用溢出标志利用溢出标志OF,判断结果是否产生溢出,判断结果是否产生溢出 JP/JPE和和JNP/JPO: 利用奇偶标

18、志利用奇偶标志PF,判断结果中,判断结果中“1”的个数的个数 JC/JB/JNAE和和JNC/JNB/JAE: 利用进位标志利用进位标志CF,判断结果是否进位或借位,判断结果是否进位或借位 JZ/JE和和JNZ/JNE: 利用零标志利用零标志ZF,判断结果是否为零(或相等),判断结果是否为零(或相等)18JCXZ Label ;若;若CX=0,转移到,转移到Label(4)根据)根据CX寄存器值的条件转移指令寄存器值的条件转移指令19JNGSkipJMPLabelSkip: 条件转移指令的条件转移指令的转移范围在以下一条指令地址为中心的转移范围在以下一条指令地址为中心的128127字节之间字节

19、之间。 JG Label ;如果标号;如果标号“Label”超出范围,汇编时将出错超出范围,汇编时将出错如果跳转超出范围可以把上面指令修改为下面的指令:如果跳转超出范围可以把上面指令修改为下面的指令:条件转移指令跳转范围限制条件转移指令跳转范围限制204.2.1 4.2.1 基本选择结构基本选择结构4.2.2 4.2.2 单分支选择结构单分支选择结构4.2.3 4.2.3 复合选择结构复合选择结构4.2.4 4.2.4 多分支选择结构多分支选择结构214.2.1 4.2.1 基本选择结构基本选择结构if(条件条件)程序段程序段A;else程序段程序段B;22CODESEGMENTASSUMEC

20、S: CODESTART:JMPBEGINXDB?; 被测试的数,汇编之前置入被测试的数,汇编之前置入YESDB0AH, 0DH, “Its a even number.”, 0AH, 0DH, $NODB0AH, 0DH, “Its a odd number.”, 0AH, 0DH, $BEGIN:PUSHCSPOPDSTESTX, 1;测试;测试X的最低位,确定是否为偶数的最低位,确定是否为偶数JZEVN;ZF=1,该数是偶数,转向,该数是偶数,转向“EVN”ODD:LEADX, NO;否则,该数是奇数;否则,该数是奇数 MOV AH, 9 INT 21HJMPDONE;跳过偶数的处理;跳

21、过偶数的处理EVN:LEADX, YES MOVAH, 9INT21H;输出偶数的相关信息;输出偶数的相关信息DONE: MOVAX, 4C00HINT21HCODEENDSENDSTART例例4-2 判断变量判断变量X的值是否为的值是否为“偶数偶数”23CODESEGMENTASSUMECS: CODEXDB?; 被测试的数,汇编之前置入被测试的数,汇编之前置入YESDB0AH, 0DH, “Its a even number.”, 0AH, 0DH, $NODB0AH, 0DH, “Its a odd number.”, 0AH, 0DH, $BEGIN:PUSHCSPOPDSTESTX,

22、 1;测试;测试X的最低位,确定是否为偶数的最低位,确定是否为偶数JZEVN;ZF=1,该数是偶数,转向,该数是偶数,转向“EVN”ODD:LEADX, NO;否则,该数是奇数;否则,该数是奇数JMPDONE;跳过偶数的处理;跳过偶数的处理EVN:LEADX, YESDONE: MOVAH, 9INT21H;输出偶数的相关信息;输出偶数的相关信息MOVAX, 4C00HINT21HCODEENDSENDBEGIN例例4-2 判断变量判断变量X的值是否为的值是否为“偶数偶数”244.2.2 单分支选择结构单分支选择结构n合理选用合理选用Jcc指令所使用的转移条件,可以使程序更加简洁流畅。指令所使

23、用的转移条件,可以使程序更加简洁流畅。例如:当求绝对值时,应选用例如:当求绝对值时,应选用JGE指令而不用指令而不用JL指令指令(图图4-3)25例例: X、Y、Z均为有符号字节变量,将均为有符号字节变量,将X、Y中绝对值较中绝对值较大的数存入大的数存入Z。 mov al, x cmp al, 0 jge skip1 neg alskip1: mov bl, y cmp bl, 0 jge skip2 neg blskip2: cmp al, bl jae xtoz mov al, y jmp save xtoz:mov al, x save:mov z, al hlt26例例: 在显示器以在

24、显示器以16进制形式显示进制形式显示al中的值。中的值。将一个将一个16进制数位(进制数位(0F)调整为对应)调整为对应ASCII码的方法:码的方法:方法方法1(基本选择):(基本选择): MOV DL, ? ;015 CMP DL, 9 JA ALPH ADD DL, 30H JMP DONEALPH:ADD DL, 37HDONE: 写出该例题的源程序片段。写出该例题的源程序片段。方法方法2(单分支选择):(单分支选择): MOV DL, ? ;015 ADD DL, 30H CMP DL, 9 JBE DONE ADD DL, 7DONE:27例例4-6 计算计算Y=SGN(X)X0X=

25、0Y=0Y=1YNNY=-1X0X=0Y=0Y=1YYNNY=-1Y(a)(b);方法;方法a,逐项排除,逐项排除 CMPX, 0 JGEUN_MINUSMINUS: MOVY, -1 JMPDONEUN_MINUS: JEZERO MOVY, 1 JMPDONEZERO: MOVY, 0DONE: ;方法;方法b,逐项确认,逐项确认 CMPX, 0 JGPLUS JE ZEROMINUS: MOVY, -1 JMPDONEPLUS: MOVY, 1 JMPDONEZERO: MOVY, 0DONE: 4.2.3 复合选择结构复合选择结构 1(X0)Y = 0 (X=0) -1(X0) 284

26、.2.4 4.2.4 多分支选择结构多分支选择结构CONDITIONF1C1(a)(b)F2F3F1-=C1=C2=C3=CnC2CnF2FnFnYYN-其它处理YNN- 在选择结构程序里,如果可供选择的程序块多于两个,这样在选择结构程序里,如果可供选择的程序块多于两个,这样的结构称为的结构称为多分支选择结构多分支选择结构,如图,如图 (a)所示,图所示,图 (b)是刚讲过的复是刚讲过的复合选择结构的实现方法。合选择结构的实现方法。29CODESEGMENTASSUME CS: CODE, DS: DATASTART: MOVAX, DATAMOVDS, AXMOVAX, 4C00HINT21

27、HCODEENDSENDSTART 例例4-7 从键盘上输入数字从键盘上输入数字“1”到到“3”,根据输入选择显示不同的信息。,根据输入选择显示不同的信息。DATASEGMENTPROMPTDB0DH, 0AH, “Input a number (13): $”MSG1DB0DH, 0AH, “FUNCTION 1 EXECUTED . $”MSG2DB0DH, 0AH, “FUNCTION 2 EXECUTED . $”MSG3DB0DH, 0AH, “FUNCTION 3 EXECUTED . $”DATAENDSC1(b)F1C2CnF2FnYYN-其它处理YNN-30INPUT: LE

28、ADX, PROMPTMOVAH, 9INT21H;输出提示信息;输出提示信息MOVAH, 1INT21H;等待从键盘输入一个数字;等待从键盘输入一个数字CMPAL, 1JBINPUT;是;是“0”或非数字,重新输入或非数字,重新输入JEF1;数字;数字“1”,转,转F1CMPAL, 2JEF2;数字;数字“2”,转,转F2CMPAL, 3JEF3;数字;数字“3”,转,转F3JMPINPUT;大于;大于“3”,重新输入,重新输入F1:LEADX, MSG1;F1程序块程序块JMPOUTPUTF2:LEADX, MSG2;F2程序块程序块JMPOUTPUTF3:LEADX, MSG3;F3程序

29、块程序块JMPOUTPUTOUTPUT:MOV AH, 9INT21HC1(b)F1C2CnF2FnYYN-其它处理YNN-31 把完成各分支的程序块入口地址放在一张表格中,这个表叫地把完成各分支的程序块入口地址放在一张表格中,这个表叫地址表,根据输入,计算出应该执行的分支程序块入口地址址表,根据输入,计算出应该执行的分支程序块入口地址在表在表中的中的位置,通过存储器间接转移转入对应位置执行。位置,通过存储器间接转移转入对应位置执行。方法方法2:按照流程:按照流程a的方法实现的方法实现CONDITIONF1(a)F2F3-=C1=C2=C3=CnFn32CODESEGMENT ASSUMECS

30、: CODE, DS: DATASTART:MOV AX, DATA MOV DS, AXINPUT: LEA DX, PROMPT MOV AH, 9 INT 21H MOV AH, 1 INT 21H CMP AL, 1 JB INPUT CMP AL, 3 JA INPUT SUB AL, 1 MOV AX, 4C00H INT 21HCODEENDSENDSTARTSHLAL, 1;转换为;转换为0,2,4MOVBL, ALMOVBH, 0;转入;转入BXJMPADDTBLBX;间接寻址,转移到对应程序块;间接寻址,转移到对应程序块F1:LEADX, MSG1;F1程序块程序块JMPO

31、UTPUTF2:LEADX, MSG2;F2程序块程序块JMPOUTPUTF3:LEADX, MSG3;F3程序块程序块JMP OUTPUTOUTPUT:MOVAH, 9INT21H多分支核心实现多分支核心实现DATASEGMENT PROMPTDB 0DH, 0AH, “Input a number (13): $”MSG1DB 0DH, 0AH, “FUNCTION 1 EXECUTED . $”MSG2DB 0DH, 0AH, “FUNCTION 2 EXECUTED . $”MSG3DB 0DH, 0AH, “FUNCTION 3 EXECUTED . $”ADDTBLDW F1, F

32、2, F3DATAENDS33 3X-5, |x|3 MOV AX, X CMP AX, 3 JG GREATER CMP AX, -3 JL GREATER MOV BX, AX SAL AX, 1 ADD AX, BX SUB AX, 5 JMP SAVEGREATER: MOV AX, 6 SAVE: MOV Y, AX HLT34补充例题:求有符号字变量补充例题:求有符号字变量X、Y、Z中的极值。中的极值。(1)将最大值存入)将最大值存入MAX(2)将最大值存入)将最大值存入MAX,最小值存入,最小值存入MIN MOV AX, X MOV BX, Y MOV CX, Z CMP AX,

33、 BX JG GOON XCHG AX, BXGOON: CMP AX, CX JG ISAX MOV MAX, CX JMP EXIT ISAX: MOV MAX, AX EXIT: HLT JL GOOD MOV MAX,AX CMP BX,CX JL BMIN MOV MIN,CX JMP QUIT BMIN: MOV MIN,BX QUIT: JMP EXITGOOD: MOV MIN,BX MOV MAX,CX EXIT: HLT351、统计成绩数组中各分数段的人数;、统计成绩数组中各分数段的人数;2、从键盘输入一个字符串,统计其中数字字符、字母字、从键盘输入一个字符串,统计其中数字

34、字符、字母字符和其它类型字符的个数;符和其它类型字符的个数;3、求有、求有/无符号数组中的最大、最小值。无符号数组中的最大、最小值。练习:练习:364.3.1 4.3.1 循环指令循环指令4.3.2 4.3.2 计数循环计数循环4.3.3 4.3.3 条件循环条件循环4.3.4 4.3.4 多重循环多重循环37计数循环计数循环:循环的次数事先已知循环的次数事先已知,用一个变量(寄存器,用一个变量(寄存器或存储器单元)记录循环的次数(称为或存储器单元)记录循环的次数(称为“循环计循环计数数器器”)。)。条件循环条件循环:循环的次数事先并不确定循环的次数事先并不确定,每次循环开始时,每次循环开始时

35、或结束后测试某个条件,根据这个条件是否满足或结束后测试某个条件,根据这个条件是否满足来决定是否继续下一次循环。来决定是否继续下一次循环。按照循环结束的条件,有以下两类循环:按照循环结束的条件,有以下两类循环:38初始化部分工作部分修改部分控制部分初始化部分工作部分修改部分控制部分YNYN(a) WHILE结构循环(b) DO-WHILE结构循环两种结构的循环:两种结构的循环:394.3.1 4.3.1 循环指令循环指令它们都不影响标志位;它们都不影响标志位;转移范围:转移范围:Label距离距离LOOP指令的下一条指令必须在指令的下一条指令必须在-128+127B之内。之内。指令操作码指令操作

36、码指令格式指令格式功能描述功能描述LOOPLOOP labelCXCX-1,若,若(CX)0,转移,转移到到LabelLOOPZ/LOOPELOOPZ/LOOPE labelCXCX-1,若,若(CX)0且且ZF=1,转移到转移到LabelLOOPNZ/LOOPNELOOPNZ/LOOPNE labelCXCX-1,若,若(CX)0且且ZF=0,转移到转移到LabelLOOP Label 与下面两条指令功能相近:与下面两条指令功能相近:DECCX; CXCX-1JNZLabel; 若若(CX)0(也就是(也就是ZF=0),转移到),转移到Label40例例4-8 从键盘上输入一个字符串(不超过

37、从键盘上输入一个字符串(不超过80个字符),将它逆序后输出。个字符),将它逆序后输出。4.3.2 计数循环计数循环DATASEGMENT BUFFER DB 81, ?, 81 DUP(?) MESS DB 0AH, 0DH, “Input a string please : $”DATAENDSCODESEGMENTASSUME CS:CODE, DS:DATASTART:MOV AX, DATAMOVDS, AXLEADX, MESSMOVAH, 09HINT21H; 输出提示信息输出提示信息MOVAH, 0AHLEADX, BUFFERINT21H; 输入字符串输入字符串LEABX, B

38、UFFER; 缓冲区首地址送缓冲区首地址送BXMOVCL, BUFFER+1MOVCH, 0; 输入字符个数送输入字符个数送CX(循环次数)(循环次数)41JCXZ EXIT ADDBX, CXINCBX; 计算字符串末地址送计算字符串末地址送BX(指针)(指针)DISP:MOV DL, BXMOVAH, 02HINT21H; 逆序输出一个字符逆序输出一个字符DECBX; 修改指针修改指针LOOP DISP; 计数循环计数循环EXIT: MOVAX, 4C00HINT21HCODEENDSENDSTART42例例4-9 在显示器以十六进制形式显示在显示器以十六进制形式显示BX寄存器的内容寄存器

39、的内容 BX是一个是一个16位寄存器位寄存器二进制二进制 1010 1001 0011 1110 用十六进显示时,每用十六进显示时,每4位用一个字符显示,共位用一个字符显示,共4个个其中其中: 0000 0 30H , 1010 A 41H 0001 1 31H , 1011 B 42H 、 、 1001 9 39H , 1111 F 46H?十六进制十六进制 A 9 3 E 屏幕上的显示屏幕上的显示 A 9 3 E 对应的对应的ASCII 41H 39H 33H 45H43例例4-9 算法算法n取出要显示的某取出要显示的某4位,转换为对应的位,转换为对应的ASCII码码,再调用再调用DOS系

40、统功能进行显示。系统功能进行显示。 BX A 9 3 E9 3 E A A 9 3 E 3 E A 9 E A 9 3 44(1) 对于对于00001001(09), 先扩展成一个字节,高先扩展成一个字节,高4位清位清0, 加上加上30H后后, 即可得字符即可得字符09对应的对应的ASCII码。码。 0000 0001B + 30H= 31H 0000 1001B + 30H=39H 0001B 1 1001B 9 (2) 对于对于10101111(AF), 先扩展成一个字节,高先扩展成一个字节,高4位清位清0, 加上加上30H后后, 还要再加上还要再加上07H,才能得到,才能得到AF 对应的

41、对应的ASCII码码 0000 1010B+30H+07H = 41H 0000 1111B+30H+07H =46H 1010B A 1111B Fcode SEGMENT ASSUME CS:codestart: MOV BX,1234H MOV CH, 4 ;字符个数字符个数 MOV CL, 4 ;循环移位次数循环移位次数 next: ROL BX, CL ;取显示位的值取显示位的值 MOV DL, BL ;保存在保存在DL中中 AND DL, 0FH ;清除高清除高4位位 ADD DL, 30H ;转变为数字的转变为数字的ASCII CMP DL, 39H ;大于大于39H, 则应转变

42、则应转变 JBE print ;为字母为字母AF的的ASCII ADD DL, 07H print: MOV AH, 2H ;显示显示DL中的字符中的字符 INT 21H DEC CH ;显示结束?显示结束? JNZ next MOV AH, 4CH ;返回返回DOS INT 21Hcode ENDS END start显示字符个数显示字符个数CH=4循环移位次数循环移位次数CL=4BX循环左移循环左移4位,将要显示的值位,将要显示的值移至低移至低4位,保存在位,保存在DL中中清清DL 的高的高4位,位,只保留要显示位的值只保留要显示位的值DL DL+30H完成数值完成数值09的的ASCII码

43、转换码转换YNDLDL+07H完成数值完成数值AF的的ASCII码转换码转换用用02功能显示功能显示DL中的字符中的字符YN返回返回DOSDL 超出超出39H?CH CH-1转换结束?转换结束?开始开始例例4-9 程序程序计数控制法46思考思考n例例4-9采用的是大写字母采用的是大写字母AF进行显示,进行显示,若采用小写字符若采用小写字符a f 进行显示,程序如进行显示,程序如何改写?何改写?1010 0011 1001 1110 A39E 或或 a39en小写小写a f的的ASCII码在码在616FH,比,比大写字大写字母母AF的的ACII码多码多20H,判断是字母的,判断是字母的数字后,数

44、字后,加加27H即可即可。n也可以用查表的方法形成十六进制数位的也可以用查表的方法形成十六进制数位的ASCII码。码。(参见教材例参见教材例4.9)47DATASEGMENTSTRING DB “A string for testing . ”, 0LENGTH DW ?DATAENDS例例4-10 字符串字符串STRING以代码以代码0结束,求它的长度(字符个数)。结束,求它的长度(字符个数)。4.3.3 条件循环条件循环CODESEGMENTASSUME CS: CODE, DS: DATASTART:MOV AX, DATAMOV DS, AXLEASI, STRING;装载字符串指针;

45、装载字符串指针MOVCX, 0;设置计数器初值;设置计数器初值TST:CMPBYTE PTR SI, 0;比较;比较JEDONE;字符串结束;字符串结束,转向转向DONE保存结果保存结果INCSI;修改指针;修改指针INCCX ;计数;计数JMPTST;转向;转向TST,继续循环,继续循环DONE:MOVLENGTH, CX;保存结果;保存结果MOVAX, 4C00HINT21HCODEENDSENDSTART48例题例题4-11 从键盘以从键盘以10进制格式输入一个无符号进制格式输入一个无符号字节数(字节数(0255)存入)存入result,回车结束输入。,回车结束输入。方法方法1:先利用:

46、先利用0AH号号dos功能调用获得各个数据位和结束标功能调用获得各个数据位和结束标志(回车键),然后调用算法将数据位组合成十进制数。属志(回车键),然后调用算法将数据位组合成十进制数。属于计数控制的循环。于计数控制的循环。方法方法2:利用:利用01H号号dos功能调用,每输入一个数位时调用一功能调用,每输入一个数位时调用一次算法,直到输入回车键。属于条件控制的循环。次算法,直到输入回车键。属于条件控制的循环。 (编写汇编语言程序)(编写汇编语言程序)思考思考1:通过方法:通过方法2,从键盘输入一个无符号字整数,保存到字变,从键盘输入一个无符号字整数,保存到字变量量NUM。当检测到非法字符或超出

47、范围时重新输入。当检测到非法字符或超出范围时重新输入。思考思考2:通过方法:通过方法2,从键盘输入一个有符号字整数,保存到字变,从键盘输入一个有符号字整数,保存到字变量量NUM。当检测到非法字符时重新输入。当检测到非法字符时重新输入。 (参考教材例(参考教材例4.15)49例题例题4-12 向显示器以向显示器以10进制格式输出一个无符进制格式输出一个无符号字节数(号字节数(0255)。)。方法:先利用除法指令从低位开始分离出各个数据位并保存,分方法:先利用除法指令从低位开始分离出各个数据位并保存,分离结束后再利用离结束后再利用02号号dos功能调用逆序显示。功能调用逆序显示。1。计数控制循环的

48、次数:已介绍。计数控制循环的次数:已介绍2。条件控制循环的次数:当某次除法结束后商为。条件控制循环的次数:当某次除法结束后商为0,结束循环,结束循环。思考:如何输出一个有符号数据?思考:如何输出一个有符号数据?50例题例题4-13统计字变量统计字变量var中二进制位中二进制位1的个的个数数n方法方法1:计数控制的循环(已讲解):计数控制的循环(已讲解)n方法方法2:条件控制的循环:条件控制的循环51 有时循环的控制既需要次数控制,又需要条件有时循环的控制既需要次数控制,又需要条件控制(如等长字符串的比较),但通过设置辅助变控制(如等长字符串的比较),但通过设置辅助变量后可以简化。量后可以简化。

49、编写程序时的技巧:编写程序时的技巧:52 例例4-14 4-14 将将变量var中的正数插入一个已整序的字数组插入一个已整序的字数组(各元素均为正数)的正确位置。的正确位置。 x dw ?x dw ? array_head dw 3,5,15,23,37,49,52,65,78,99 array_head dw 3,5,15,23,37,49,52,65,78,99 array_end dw 105 array_end dw 105 var dw 32 var dw 32 -1x mov ax, varmov ax, var mov array_head-2, 0ffffh mov array

50、_head-2, 0ffffh mov si, 0 mov si, 0CompareCompare: cmp array_endsi, axcmp array_endsi, ax jle insertjle insert mov bx, array_endsi mov bx, array_endsi mov array_endsi+2, bx mov array_endsi+2, bx sub si, 2 sub si, 2 jmp compare jmp compareInsertInsert: mov array_endsi+2, axmov array_endsi+2, ax 32 3

51、5 49 15 52 23 37 105 99 78 65vararray_headarray_headarray_endarray_end53例例4-15 逻辑尺的用法逻辑尺的用法n设有数组设有数组x(x1, , x10)和和y(y1, , y10),编程计算编程计算 z1=x1 + y1 z2=x2 + y2 z3=x3 - y3 z4=x4 - y4 z5=x5 - y5 z6=x6 + y6 z7=x7 - y7 z8=x8 - y8 z9=x9 + y9 z10=x10 + y10 逻辑尺逻辑尺:0 0 1 1 0 1 1 1 0 0 1 减法减法 0 加法加法54x dw x1,x

52、2,x3,x4,x5,x6,x7,x8,x9,x10 x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule dw 00dchlogic_rule dw 00dch mov bx, 0mov bx, 0 mov cx, 10 mov cx, 10 mov dx, logic_rule

53、mov dx, logic_rule next: mov ax, xbx next: mov ax, xbx shr dx, 1 shr dx, 1 jc subtract jc subtract add ax, ybx add ax, ybx jmp jmp result result ; ; 向前引用向前引用subtract: sub ax, ybxsubtract: sub ax, ybx resultresult: mov zbx, ax: mov zbx, ax add bx, 2 add bx, 2 loop next loop next 逻辑尺程序逻辑尺程序55 用总分减去最高分

54、、最低分,最后除以用总分减去最高分、最低分,最后除以5,得到需要的成绩。,得到需要的成绩。 求求N个数据中最大值的方法:个数据中最大值的方法:预设一个预设一个“最大值最大值”,取出一个数据与这个取出一个数据与这个“最大值最大值”进行比较,进行比较, 如果数据大于如果数据大于“最大值最大值”,则将该数据作为新的,则将该数据作为新的“最大最大值值”。进行进行N次比较之后留下的就是这次比较之后留下的就是这N个数据的最大值。个数据的最大值。 预设的预设的“最大值最大值”的初值可以从的初值可以从N个数据中任取一个,也可以根个数据中任取一个,也可以根据数据的范围,取一个该范围内的最小的数。据数据的范围,取

55、一个该范围内的最小的数。 计算最小值的方法与此类似。计算最小值的方法与此类似。例例4-16 从键盘上输入七名裁判的评分(从键盘上输入七名裁判的评分(010),扣除一个最),扣除一个最高分,一个最低分,计算出其它五项评分的平均值(高分,一个最低分,计算出其它五项评分的平均值(保留保留一位小数一位小数),在显示器上输出。),在显示器上输出。56INCLUDEYLIB.HDATASEGMENTMESS1 DB0DH, 0AH, “Input a score ( 010 ) : $”MESS2 DB0DH, 0AH, “The final score is : $”C5DB5MAXDB?MINDB?S

56、UMDB?DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX, DATAMOVDS, AX57MOVSUM, 0; 累加器清零累加器清零MOVMAX, 0; “最大值最大值”预设为预设为0MOVMIN, 255; “最小值最小值”预设为预设为255MOVCX, 7; 循环计数器,初值循环计数器,初值7ONE:LEADX, MESS1CALLREADDEC; 键盘输入一个分数键盘输入一个分数ADDSUM, AL; 累加累加CMPMAX, AL; 与与“最大值最大值”比较比较JAL1MOVMAX, AL; 大于大于“最大值最大值”则保留则保

57、留L1:CMPMIN, AL; 与与“最小值最小值”比较比较JBL2MOVMIN, AL; 小于小于“最小值最小值”则保留则保留L2:LOOP ONE; 计数循环计数循环58MOVAL, SUMSUBAL, MAXSUBAL, MIN; 从总分中减去最大、最小值从总分中减去最大、最小值MOVSUM, ALXORAH, AH; 高高8位清零位清零DIVC5; 求平均值求平均值PUSHAX; 保留余数(在保留余数(在AH中)中)MOVAH, 0; 清余数清余数LEADX, MESS2CALLWRITEDEC; 输出结果的整数部分输出结果的整数部分 59MOVDL, .MOVAH, 2INT21H;

58、 输出小数点输出小数点POPAX; 从堆栈弹出余数从堆栈弹出余数SHLAH, 1; 计算小数部分:计算小数部分:(AH5)10=AH2MOVDL, AHORDL, 30H; 转换成转换成ASCII代码代码MOVAH, 2INT21H; 输出结果的小数部分输出结果的小数部分CALLCRLF; 输出回车换行,结束本行输出回车换行,结束本行MOVAX, 4C00HINT21HCODEENDSENDSTART60LOOPZ/LOOPE及及LOOPNZ/LOOPNE的功能及应用的功能及应用指令操作码指令操作码指令格式指令格式功能描述功能描述LOOPLOOP labelCXCX-1,若,若(CX)0,转移

59、,转移到到LabelLOOPZ/LOOPELOOPZ/LOOPE labelCXCX-1,若,若(CX)0且且ZF=1,转移到转移到LabelLOOPNZ/LOOPNELOOPNZ/LOOPNE labelCXCX-1,若,若(CX)0且且ZF=0,转移到转移到Label61例例4-17 判断两个字符串是否完全匹配。判断两个字符串是否完全匹配。Data segment mess1 db 0dh,0ah, “Please input string1:$” string1 db 20, ? , 20 dup(?) mess2 db 0dh,0ah, “Please input string2:$”

60、 string2 db 20, ? , 20 dup(?) yes db 0dh,0ah, “string1=string2$” no db 0dh,0ah, “string1!=string2$”Data ends62用用LOOP指令控制循环:指令控制循环:代码段:代码段: MOV AX, DATA MOV DS, AX LEA DX, MESS1 MOV AH, 9 INT 21H LEA DX, STRING1 MOV AH, 0AH INT 21H LEA DX, MESS2 MOV AH, 9 INT 21H LEA DX, STRING2 MOV AH, 0AH INT 21H M

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论