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

下载本文档

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

文档简介

第四章选择和循环

4.1测试和控制指令

4.2选择结构程序

4.3循环结构程序1指令3指令2顺序结构

入口指令1出口分支结构入口满足条件?

分支1出口YN

分支2循环结构入口

指令

修改条件条件满足否?Y出口N结构化程序设计的“基本结构”2IPCS指令存放在内存中,处理器从内存取指令分析执行处理器用CS:IP计算下一条要执行的指令在内存的物理地址

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

4.1测试和转移控制指令4.1.1无条件转移指令4.1.2比较和测试指令4.1.3条件转移指令

44.1.1无条件转移指令转到label指定的目标地址处,执行那里的指令目的地址label的位置有2种情形:和JMP指令在同一个段,叫做段内转移,转移时CPU只改变IP;和JMP指令不在同一个段,叫做段间转移,转移时CPU既要更改IP又要更改CS,目的地址label有两种表示方式:label是目标地址处指令的标号,叫做直接寻址label是寄存器或内存单元,跳转目的地址在寄存器或内存中,叫做间接寻址JMPlabel

⑴段内转移、直接寻址⑵段内转移、间接寻址⑶段间转移、直接寻址⑷段间转移、间接寻址5段内转移、直接寻址JMPlabel

code1segment

……

jmp

again;转到again处执行 ……again:

dec

cx

;again处的指令 ……code1ends执行JMP指令时:CS的内容不变,将以again为标号的指令的偏移地址装入IP。6段内转移、间接寻址JMPr16/m16将16位寄存器或内存字单元内容IP寄存器,CS内容保持不变。例1:假设AX存放了段内某条指令的偏移地址,则

jmpax

;IP←AX例2:假设DS:2000H存放了某条指令的偏移地址,则

jmpwordptr[2000h] ;IP←DS:[2000h]code1segment

…… leaax,again

jmp

ax;转到again处执行 ……again:

dec

cx

;again处的指令 ……code1ends71)JMPONE ;近程直接转移假设ONE是程序中某条指令的标号,并且已在数据段定义字变量“TARGET”如下:

TAEGET DWONE下面四种方法都可以实现同一个代码段中向标号“ONE”的跳转:段内转移举例2)LEADX,ONEJMPDX ;寄存器间接段内转移3)LEABX,TARGETJMPWORDPTR[BX] ;存储器间接段内转移4)JMPTARGET ;存储器间接段内转移8段间转移、直接寻址JMPfarptrlabel

;IP←label的偏移地址 ;CS←label的段地址将标号所在段的段地址CS,标号处指令的偏移地址IP;CPU转移到指定代码段标号处执行code1segmentassumecs:code1

start:movax,20

movbx,10addax,bx

jmpfarptrexitcode1endscode2segmentassumecs:code2

exit:movax,4c00h

int21hcode2endsendstart9段间转移、间接寻址JMPfarptr

mem

;IP←[mem],CS←[mem+2]用一个双字存储单元存储要跳转的目标地址。低位字送IP,高位字送CS例如:让处理器转移到1500h:0取指令执行movwordptr[bx],0movwordptr[bx+2],1500hJMPfarptr[bx]101)JMPFARPTRTWO ;远程直接转移假设TWO是程序中一个代码段中的某条指令的标号,并且已在数据段定义双字变量“FAR_TGT”如下:

FAR_TGT DD TWO下面三组指令都可以实现向远程标号“TWO”的转移:2)LEABX,FAR_TGTJMPDWORDPTR[BX] ;远程间接转移3)JMPFAR_TGT ;远程间接转移11目标地址的范围段内转移:不更改CS,只改变IP,又分:短转移(short):转移范围在段内-128~+127字节近转移(near):在当前代码段64KB范围内转移段间转移——远转移(far)更改CS和IP从当前代码段跳到另一个代码段,可以在1MB范围跳转目标地址是双字(16位偏移地址和16位段地址),叫做32位远指针代码段代码段

实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移程序员可用操作符short、nearptr

或farptr

强制指明或改变转移的属性最常用格式:JMP语句标号代码段代码段124.1.2比较和测试指令目的操作数dest:8位/16位的寄存器/存储器操作数。源操作数src:与dest同类型的寄存器/存储器/立即数。功能:运算后影响标志位,但不保留运算结果。用途:CMP——比较两个数的大小关系,但不改变它们的值。AX?=BXTEST——判断目的操作数中个别二进制位,但不改变它的值。判断一个数的奇偶性指令操作码指令格式功能描述CMPCMPdest,src(dest)-(src),不存结果TESTTESTdest,src(dest)∧(src),不存结果134.1.3条件转移指令“J”----Jump“xx”是转移的条件“label”只能为目标指令的标号。都属于段内短转移。Jxx label操作码助记符条件指令功能JZ/JEZF=1相等或为0转移JNZ/JNEZF=0不相等或不为0转移JSSF=1结果是负数,则转移JNSSF=0结果不是负数,则转移JOOF=1结果溢出,则转移JNOOF=0结果没有溢出,则转移JP/JPEPF=1低位字节有偶数个1,则转移JNP/JPOPF=0低位字节有奇数个1,则转移JB/JNAE/JCCF=1有进借位或<,则转移JAE/JNB/JNCCF=0无进借位或≥,则转移JBE/JNACF=1或ZF=1≤,则转移JA/JNBECF=0且ZF=0>,则转移JL/JNGESF≠OF<,则转移JGE/JNLSF=OF≥,则转移JLE/JNGSF≠OF或ZF=1≤,则转移JG/JNLESF=OF且ZF=0>,则转移JCXZCX=0CX=0,则转移14(1)根据两个有符号数比较结果的条件转移指令两个有符号数的比较结果通过OF,SF,ZF反映出来。

G(Greater,大于)L(Less,小于)E(Equal,等于)N(Not,否)指令助记符

指令功能转移条件JG,JNLE大于(不小于等于)时转移OF⊕SF=0且ZF=0JGE,JNL大于等于(不小于)时转移OF⊕SF=0JZ,JE为零(相等)时转移ZF=1JNZ,JNE不为零(不相等)时转移ZF=0JL,JNGE小于(不大于等于)时转移OF⊕SF=1JLE,JNG小于等于(不大于)时转移OF⊕SF=1或ZF=115(2)根据两个无符号数比较结果的条件转移指令两个无符号数的比较结果通过CF,ZF反映出来。

A(Above,高于)

B(Below,低于)

E(Equal,等于)指令助记符指令功能转移条件JA,JNBE高于(不低于等于)时转移CF=0且ZF=0JAE,JNB,JNC高于等于(不低于)时转移CF=0JZ,JE为零(相等)时转移ZF=1JNZ,JNE不为零(不相等)时转移ZF=0JB,JNAE,JC低于(不高于等于)时转移CF=1JBE,JNA低于等于(不高于)时转移CF=1或ZF=116(3)根据单个标志位的条件转移指令⑴

JS和JNS:利用符号标志SF,判断结果是正是负⑵JO和JNO:利用溢出标志OF,判断结果是否产生溢出⑶JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数⑷JC/JB/JNAE和JNC/JNB/JAE:利用进位标志CF,判断结果是否进位或借位⑸

JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)17JCXZ Label

;若CX=0,转移到Label(4)根据CX寄存器值的条件转移指令18 JNG Skip JMP LabelSkip: ……条件转移指令的转移范围在以下一条指令地址为中心的-128~+127字节之间。

JG Label;如果标号“Label”超出范围,汇编时将出错如果跳转超出范围可以把上面指令修改为下面的指令:条件转移指令跳转范围限制194.2.1基本选择结构4.2.2单分支选择结构4.2.3复合选择结构4.2.4多分支选择结构4.2选择结构程序204.2.1基本选择结构if(条件){程序段A;}else{程序段B;}×√21CODE SEGMENT ASSUME CS:CODESTART: JMP BEGIN X DB ? ;被测试的数,汇编之前置入

YES DB 0AH,0DH,“It’saevennumber.”,0AH,0DH,‘$’ NO DB 0AH,0DH,“It’saoddnumber.”,0AH,0DH,‘$’BEGIN:PUSH CS POP DS

TEST X,1 ;测试X的最低位,确定是否为偶数

JZ EVN ;ZF=1,该数是偶数,转向“EVN”ODD: LEA DX,NO

;否则,该数是奇数

MOVAH,9INT21H

JMP DONE ;跳过偶数的处理EVN: LEA DX,YES MOV AH,9 INT 21H ;输出偶数的相关信息DONE: MOV AX,4C00H INT 21HCODE ENDS END START[例4-2]判断变量X的值是否为“偶数”22CODE SEGMENT ASSUME CS:CODE X DB ? ;被测试的数,汇编之前置入

YES DB 0AH,0DH,“It’saevennumber.”,0AH,0DH,‘$’ NO DB 0AH,0DH,“It’saoddnumber.”,0AH,0DH,‘$’BEGIN:PUSH CS POP DS

TEST X,1 ;测试X的最低位,确定是否为偶数

JZ EVN ;ZF=1,该数是偶数,转向“EVN”ODD: LEA DX,NO

;否则,该数是奇数

JMP DONE ;跳过偶数的处理EVN: LEA DX,YESDONE: MOV AH,9 INT 21H

;输出偶数的相关信息

MOV AX,4C00H INT 21HCODE ENDS END BEGIN[例4-2]判断变量X的值是否为“偶数”234.2.2单分支选择结构合理选用Jcc指令所使用的转移条件,可以使程序更加简洁流畅。例如:当求绝对值时,应选用JGE指令而不用JL指令(图4-3)24例:X、Y、Z均为有符号字节变量,将X、Y中绝对值较大的数存入Z。

moval,x

cmpal,0

jgeskip1

negalskip1:

mov

bl,y

cmp

bl,0

jgeskip2

neg

blskip2:

cmpal,bl

jae

xtoz

moval,y

jmpsave

xtoz:moval,x

save:movz,al

hlt25例:在显示器以16进制形式显示al中的值。将一个16进制数位(0~F)调整为对应ASCII码的方法:方法1(基本选择):

MOVDL,?;0~15CMPDL,9JAALPHADDDL,30HJMPDONEALPH:ADDDL,37HDONE:

写出该例题的源程序片段。方法2(单分支选择):

MOVDL,?;0~15ADDDL,30HCMPDL,‘9’JBEDONEADDDL,7DONE:26[例4-6]计算Y=SGN(X);方法a,逐项排除

CMP X,0JGE UN_MINUSMINUS:MOV Y,-1JMP DONEUN_MINUS:JE ZEROMOV Y,1JMP DONEZERO: MOV Y,0DONE: ……;方法b,逐项确认

CMP X,0JG PLUSJEZEROMINUS:MOV Y,-1JMP DONEPLUS:MOV Y,1JMP DONEZERO:MOV Y,0DONE: ……4.2.3复合选择结构

1 (X>0)Y=0(X=0)

-1(X<0)

274.2.4多分支选择结构在选择结构程序里,如果可供选择的程序块多于两个,这样的结构称为多分支选择结构,如图(a)所示,图(b)是刚讲过的复合选择结构的实现方法。28CODE SEGMENT ASSUMECS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,4C00H INT 21HCODE ENDS END START[例4-7]从键盘上输入数字“1”到“3”,根据输入选择显示不同的信息。DATA SEGMENT PROMPT DB 0DH,0AH,“Inputanumber(1~3):$” MSG1 DB 0DH,0AH,“FUNCTION1EXECUTED.$” MSG2 DB 0DH,0AH,“FUNCTION2EXECUTED.$” MSG3 DB 0DH,0AH,“FUNCTION3EXECUTED.$”DATA ENDSC1(b)F1C2CnF2FnYYN---其它处理YNN---29INPUT: LEA DX,PROMPT MOV AH,9 INT 21H ;输出提示信息

MOV AH,1 INT 21H ;等待从键盘输入一个数字

CMP AL,‘1’ JB INPUT ;是“0”或非数字,重新输入

JE F1 ;数字“1”,转F1 CMP AL,‘2’ JE F2 ;数字“2”,转F2 CMP AL,‘3’ JE F3 ;数字“3”,转F3 JMP INPUT ;大于“3”,重新输入F1: LEA DX,MSG1 ;F1程序块

JMP OUTPUTF2: LEA DX,MSG2 ;F2程序块

JMP OUTPUTF3: LEA DX,MSG3 ;F3程序块

JMP OUTPUTOUTPUT:MOV AH,9 INT 21HC1(b)F1C2CnF2FnYYN---其它处理YNN---30把完成各分支的程序块入口地址放在一张表格中,这个表叫地址表,根据输入,计算出应该执行的分支程序块入口地址在表中的位置,通过存储器间接转移转入对应位置执行。方法2:按照流程a的方法实现CONDITIONF1(a)F2F3---=C1=C2=C3=CnFn31CODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXINPUT:LEADX,PROMPTMOVAH,9INT21H MOVAH,1INT21H CMPAL,‘1’JBINPUT CMPAL,‘3’JAINPUT SUBAL,‘1’ MOVAX,4C00HINT21HCODE ENDS END START SHL AL,1 ;转换为0,2,4 MOV BL,AL MOV BH,0 ;转入BX

JMP ADDTBL[BX] ;间接寻址,转移到对应程序块F1: LEA DX,MSG1 ;F1程序块 JMP OUTPUT F2: LEA DX,MSG2 ;F2程序块 JMP OUTPUTF3: LEA DX,MSG3 ;F3程序块

JMPOUTPUTOUTPUT: MOV AH,9 INT 21H多分支核心实现DATA SEGMENT PROMPT DB0DH,0AH,“Inputanumber(1~3):$” MSG1 DB0DH,0AH,“FUNCTION1EXECUTED.$” MSG2 DB0DH,0AH,“FUNCTION2EXECUTED.$” MSG3 DB0DH,0AH,“FUNCTION3EXECUTED.$”

ADDTBL DWF1,F2,F3DATA ENDS32

3X-5,|x|<=3【例4-4】计算分段函数Y=6,|x|>3MOVAX,X

CMPAX,3

JGGREATER

CMPAX,-3

JLGREATER

MOVBX,AX

SALAX,1

ADDAX,BX

SUBAX,5

JMPSAVE

GREATER:MOVAX,6

SAVE:MOVY,AX

HLT33补充例题:求有符号字变量X、Y、Z中的极值。(1)将最大值存入MAX(2)将最大值存入MAX,最小值存入MINMOVAX,XMOVBX,YMOVCX,ZCMPAX,BXJGGOONXCHGAX,BXGOON:CMPAX,CXJGISAXMOVMAX,CXJMPEXITISAX:MOVMAX,AXEXIT:HLTJLGOODMOVMAX,AXCMPBX,CXJLBMINMOVMIN,CXJMPQUITBMIN:MOVMIN,BXQUIT:JMPEXITGOOD:MOVMIN,BXMOVMAX,CXEXIT:HLT341、统计成绩数组中各分数段的人数;2、从键盘输入一个字符串,统计其中数字字符、字母字符和其它类型字符的个数;3、求有/无符号数组中的最大、最小值。练习:354.3.1循环指令4.3.2计数循环4.3.3条件循环4.3.4多重循环4.3循环结构程序36计数循环:循环的次数事先已知,用一个变量(寄存器

或存储器单元)记录循环的次数(称为“循环计数

器”)。条件循环:循环的次数事先并不确定,每次循环开始时 或结束后测试某个条件,根据这个条件是否满足 来决定是否继续下一次循环。按照循环结束的条件,有以下两类循环:37两种结构的循环:384.3.1循环指令它们都不影响标志位;转移范围:Label距离LOOP指令的下一条指令必须在-128~+127B之内。指令操作码指令格式功能描述LOOPLOOPlabelCX←CX-1,若(CX)≠0,转移到LabelLOOPZ/LOOPELOOPZ/LOOPElabelCX←CX-1,若(CX)≠0且ZF=1,转移到LabelLOOPNZ/LOOPNELOOPNZ/LOOPNElabelCX←CX-1,若(CX)≠0且ZF=0,转移到LabelLOOPLabel与下面两条指令功能相近:DEC CX ;CX←CX-1JNZ Label ;若(CX)≠0(也就是ZF=0),转移到Label39[例4-8]从键盘上输入一个字符串(不超过80个字符),将它逆序后输出。4.3.2计数循环DATA SEGMENTBUFFERDB 81,?,81DUP(?)MESSDB 0AH,0DH,“Inputastringplease:$”DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA DX,MESS MOV AH,09H INT 21H ;输出提示信息

MOV AH,0AH LEA DX,BUFFER INT 21H ;输入字符串

LEA BX,BUFFER ;缓冲区首地址送BX MOV CL,BUFFER+1 MOV CH,0 ;输入字符个数送CX(循环次数)40

JCXZEXIT

ADD BX,CX

INC BX ;计算字符串末地址送BX(指针)DISP: MOV DL,[BX] MOV AH,02H INT 21H ;逆序输出一个字符

DEC BX ;修改指针

LOOP DISP ;计数循环EXIT:MOV AX,4C00H INT 21HCODE ENDS END START41[例4-9]在显示器以十六进制形式显示BX寄存器的内容

BX是一个16位寄存器二进制1010100100111110

用十六进显示时,每4位用一个字符显示,共4个其中:0000→’0’30H,1010→’A’41H

0001→’1’31H

,1011→’B’42H

、、、、

1001→’9’39H

,1111→’F’46H?十六进制A93E屏幕上的显示‘A’‘9’‘3’‘E’对应的ASCII41H39H33H45H42例4-9算法取出要显示的某4位,转换为对应的ASCII码,再调用DOS系统功能进行显示。

BXA93E93EAA93E

3EA9EA9343(1)对于0000~1001(0~9),先扩展成一个字节,高4位清0,加上30H后,即可得字符’0’~’9’对应的ASCII码。

00000001B+30H=31H00001001B+30H=39H

0001B‘1’1001B‘9’(2)对于1010~1111(A~F),先扩展成一个字节,高4位清0,

加上30H后,还要再加上07H,才能得到’A’~’F’对应的ASCII码

00001010B+30H+07H=41H00001111B+30H+07H=46H

1010B‘A’1111B‘F’44codeSEGMENT

ASSUMECS:codestart:MOVBX,1234HMOVCH,4;字符个数

MOVCL,4;循环移位次数

next:ROLBX,CL

;取显示位的值

MOVDL,BL

;保存在DL中

ANDDL,0FH;清除高4位

ADDDL,30H;转变为数字的ASCIICMPDL,39H;大于39H,则应转变

JBEprint;为字母A~F的ASCIIADDDL,07Hprint:MOVAH,2H;显示DL中的字符

INT21H

DECCH;显示结束?

JNZnext

MOVAH,4CH;返回DOSINT21HcodeENDSENDstart显示字符个数CH=4循环移位次数CL=4BX循环左移4位,将要显示的值移至低4位,保存在DL中清DL的高4位,只保留要显示位的值DL←DL+30H完成数值0~9的ASCII码转换YNDL←DL+07H完成数值A~F的ASCII码转换用02功能显示DL中的字符YN返回DOSDL超出39H?CH←CH-1转换结束?开始例4-9程序计数控制法45思考例4-9采用的是大写字母A~F进行显示,若采用小写字符a~f进行显示,程序如何改写?1010001110011110‘A39E’或‘a39e小写a~f的ASCII码在61~6FH,比大写字母A~F的ACII码多20H,判断是字母的数字后,加27H即可。也可以用查表的方法形成十六进制数位的ASCII码。(参见教材例[4.9])46DATA SEGMENT STRING DB“Astringfortesting.”,0 LENGTH DW?DATA ENDS[例4-10]字符串STRING以代码0结束,求它的长度(字符个数)。4.3.3条件循环CODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX LEA SI,STRING ;装载字符串指针

MOV CX,0 ;设置计数器初值TST: CMP BYTEPTR[SI],0;比较

JE DONE ;字符串结束,转向DONE保存结果

INC SI ;修改指针

INC CX ;计数

JMP TST

;转向TST,继续循环DONE: MOV LENGTH,CX ;保存结果

MOV AX,4C00H INT 21HCODE ENDS END START47[例题4-11]从键盘以10进制格式输入一个无符号字节数(0~255)存入result,回车结束输入。方法1:先利用0AH号dos功能调用获得各个数据位和结束标志(回车键),然后调用算法将数据位组合成十进制数。属于计数控制的循环。方法2:利用01H号dos功能调用,每输入一个数位时调用一次算法,直到输入回车键。属于条件控制的循环。

(编写汇编语言程序)思考1:通过方法2,从键盘输入一个无符号字整数,保存到字变量NUM。当检测到非法字符或超出范围时重新输入。

思考2:通过方法2,从键盘输入一个有符号字整数,保存到字变量NUM。当检测到非法字符时重新输入。(参考教材例4.15)

48[例题4-12]向显示器以10进制格式输出一个无符号字节数(0~255)。方法:先利用除法指令从低位开始分离出各个数据位并保存,分离结束后再利用02号dos功能调用逆序显示。

1。计数控制循环的次数:已介绍

2。条件控制循环的次数:当某次除法结束后商为0,结束循环。

思考:如何输出一个有符号数据?

49[例题4-13]统计字变量var中二进制位‘1’的个数方法1:计数控制的循环(已讲解)方法2:条件控制的循环50有时循环的控制既需要次数控制,又需要条件控制(如等长字符串的比较),但通过设置辅助变量后可以简化。编写程序时的技巧:51[例4-14]将变量var中的正数插入一个已整序的字数组(各元素均为正数)的正确位置。

xdw?array_headdw3,5,15,23,37,49,52,65,78,99array_enddw105

var

dw32

-1x

movax,var

movarray_head-2,0ffffh

mov

si,0Compare:

cmp

array_end[si],ax

jleinsert

mov

bx,array_end[si]

movarray_end[si+2],bxsubsi,2

jmpcompareInsert:movarray_end[si+2],ax

32

3

5

49

15

52

23

37

105

99

78

65vararray_headarray_end52[例4-15]逻辑尺的用法设有数组x(x1,…,x10)和y(y1,…,y10),编程计算

z1=x1+y1z2=x2+y2z3=x3-y3z4=x4-y4z5=x5-y5z6=x6+y6z7=x7-y7z8=x8-y8z9=x9+y9z10=x10+y10

逻辑尺:0011011100

1减法

0加法53xdwx1,x2,x3,x4,x5,x6,x7,x8,x9,x10ydwy1,y2,y3,y4,y5,y6,y7,y8,y9,y10zdwz1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_ruledw00dch

mov

bx,0

mov

cx,10

mov

dx,logic_rulenext:movax,x[bx]

shr

dx,1

jcsubtractaddax,y[bx]

jmp

result;向前引用subtract:subax,y[bx]

result:mov

z[bx],axaddbx,2loopnext

逻辑尺程序54用总分减去最高分、最低分,最后除以5,得到需要的成绩。求N个数据中最大值的方法:

预设一个“最大值”,

取出一个数据与这个“最大值”进行比较,

如果数据大于“最大值”,则将该数据作为新的“最大值”。

进行N次比较之后留下的就是这N个数据的最大值。预设的“最大值”的初值可以从N个数据中任取一个,也可以根

据数据的范围,取一个该范围内的最小的数。计算最小值的方法与此类似。[例4-16]从键盘上输入七名裁判的评分(0~10),扣除一个最

高分,一个最低分,计算出其它五项评分的平均值(保留

一位小数),在显示器上输出。55INCLUDE YLIB.HDATA SEGMENT MESS1 DB 0DH,0AH,“Inputascore(0~10):$” MESS2 DB 0DH,0AH,“Thefinalscoreis:$” C5 DB 5 MAX DB ? MIN DB ? SUM DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX56

MOV SUM,0 ;累加器清零

MOV MAX,0 ;“最大值”预设为0 MOV MIN,255 ;“最小值”预设为255 MOV CX,7 ;循环计数器,初值7ONE: LEA DX,MESS1 CALL READDEC ;键盘输入一个分数

ADD SUM,AL ;累加

CMP MAX,AL ;与“最大值”比较

JA L1 MOV MAX,AL ;大于“最大值”则保留L1: CMP MIN,AL ;与“最小值”比较

JB L2 MOV MIN,AL ;小于“最小值”则保留L2: LOOP ONE ;计数循环57

MOV AL,SUM SUB AL,MAX SUB AL,MIN ;从总分中减去最大、最小值

MOV SUM,AL XOR AH,AH ;高8位清零

DIV C5 ;求平均值

PUSH AX ;保留余数(在AH中)

MOV AH,0 ;清余数

LEA DX,MESS2 CALL WRITEDEC ;输出结果的整数部分58

MOV DL,‘.’ MOV AH,2 INT 21H ;输出小数点

POP AX ;从堆栈弹出余数

SHL AH,1 ;计算小数部分:(AH÷5)×10=AH×2 MOV DL,AH OR DL,30H ;转换成ASCII代码

MOV AH,2 INT 21H ;输出结果的小数部分

CALL CRLF ;输出回车换行,结束本行

MOV AX,4C00H INT 21HCODE ENDS END START59LOOPZ/LOOPE及LOOPNZ/LOOPNE的功能及应用指令操作码指令格式功能描述LOOPLOOPlabelCX←CX-1,若(CX)≠0,转移到LabelLOOPZ/LOOPELOOPZ/LOOPElabelCX←CX-1,若(CX)≠0且ZF=1,转移到LabelLOOPNZ/LOOPNELOOPNZ/LOOPNElabelCX←CX-1,若(CX)≠0且ZF=0,转移到Label60[例4-17]判断两个字符串是否完全匹配。Datasegmentmess1db0dh,0ah,“Pleaseinputstring1:$”string1db20,?,20dup(?)mess2db0dh,0ah,“Pleaseinputstring2:$”string2db20,?,20dup(?)yesdb0dh,0ah,“string1=string2$”nodb0dh,0ah,“string1!=string2$”Dataends61用LOOP指令控制循环:代码段:

MOVAX,DATAMOVDS,AXLEADX,MESS1MOVAH,9INT21HLEADX,STRING1MOVAH,0AHINT21HLEADX,MESS2MOVAH,9INT21HLEADX,STRING2MOVAH,0AHINT21HMOVCL,STRING1+1MOVAL,STRING2+1CMPCL,ALJNZNMATMOVCH,0JCXZMATMOVBX,2NEXT:MOVAL,STRING1[BX]CMPAL,STRING2[BX]JNZNMATINCBXLOOPNEXTMAT:LEADX,YESJMPDISPNMAT:LEADX,NO

DISP:MOVAH,9INT21HMOVAH,4CHINT21H用LOOPZ指令控制循环:MOVCL,STRING1+1MOVAL,STRING2+1CMPCL,ALJNZNMATMOVCH,0JCXZMATMOVBX,1NEXT:INCBX

MOVAL,STRING1[BX]CMPAL,STRING2[BX]LOOPZNEXTJNZNMATMAT:LEADX,YESJMPDISPNMAT:LEADX,NO

DISP:MOVAH,9INT21HMOVAH,4CHINT21H62DATA SEGMENT STRING DB“Thisisastringforexample.”LENDW$-STRINGPOSITION DW ?MESSDB“Thefirstpositionofais:$”FLAGDB0DATA ENDS[例4-18]以十进制形式输出字母’a’在字符串STRING中第一次出现的位置,如果未出现,则位置为-1。方法1:用LOOP指令控制循环,请自己编程实现.63

MOV AX,DATA MOV DS,AX MOV SI,-1 ;SI用作字符串字符指针

MOV CX,LEN ;字符串长度L0: INC SI ;修改指针

CMP STRING[SI],‘a’ ;一个字符与’a’进行比较

LOOPNZ L0 ;字

温馨提示

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

评论

0/150

提交评论