1、2.4 循环程序设计实验2.4.1 实验目的1、掌握循环程序的设计方法。2、掌握比较指令、转移指令和循环指令的使用方法。3、进一步掌握调试工具的使用方法。2.4.2 实验预习要求1、复习比较指令、条件转移指令和循环指令。2、复习循环程序的结构、循环控制方法等知识。3、读懂“2.4.3 实验内容”中给出的将十进制数转换为二进制数以及将二进制数转换为十进制数的程序。4、根据“2.4.3 实验内容”中给出的流程图和程序框架编写源程序,以便上机调试。5、从“2.4.4 实验习题”中任选一道题目,编写源程序,以便上机调试。2.4.3 实验内容计算 1+2+n=?,其中 n 通过键盘输入。要求在屏幕上提供
2、如下信息:Please input a number(1627): ;出现此信息后通过键盘输入一个小于 628 的无符号整数1+2+n=sum ;其中 n 为用户输入的数,sum 为所求的累加和程序运行情况如下图所示(说明:图中所运行程序允许累加和不大于一个 32 位二进制数所能表示的范围) 。1、编程指导(1)键盘输入的十进制数如 368 在计算机中是以33H,36H,38H 形式存放的,如何将它们转换为一个二进制数 101110000B,以便对累加循环的循环次数进行控制是本程序首先要解决的问题。将键盘输入的十进制数转换为二进制数的程序清单如下:DATA SEGMENTINF1 DB “Pl
3、ease input a number (0-65535):$“IBUF DB 7,0,6 DUP(?)DATA ENDSCODE SEGMENTASSUME CS: CODE, DS:DATASTART: MOV AX, DATAMOV DS, AXMOV DX, OFFSET INF1MOV AH, 09HINT 21HMOV DX, OFFSET IBUF ;键入一个十进制数(65535)MOV AH, 0AHINT 21HMOV CL, IBUF+1 ;十进制数的位数送 CXMOV CH, 0MOV SI, OFFSET IBUF+2 ;指向输入的第一个字符(最高位)MOV AX, 0
4、 ;开始将十进制数转换为二进制数AGAIN: MOV DX, 10 ; (010+a4) 10+) 10+a0MUL DXAND BYTE PTR SI, 0FHADD AL, SIADC AH, 0INC SILOOP AGAINMOV AH, 4CHINT 21HCODE ENDSEND START本程序功能:从键盘接收一个无符号十进制整数(小于 65535) ,将其转换为二进制数,转换结果存在 AX 寄存器中。(2)累加结果为一个 16 位的二进制数,为了显示结果,必需把它们转换为十进制数。将二进制数转换为十进制数的程序清单如下:DATA SEGMENTOBUF DB 6 DUP(?)D
5、ATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATASTART: MOV AX, DATAMOV DS, AXMOV BX, OFFSET OBUF+5MOV BYTE PTR BX,$MOV CX, 10 ;做(DX):(AX)/10 运算LOOP1: MOV DX, 0 ;被除数高 16 位清 0DIV CXADD DL, 30H ;将 DL 中的一位十进制数转换为 ASCII 码DEC BXMOV BX, DLOR AX, AXJNZ LOOP1;判断商是否为 0,不为 0 继续MOV DX, BXMOV AH, 09HINT 21H;显示转换得到的
6、十进制数MOV AH, 4CHINT 21HCODE ENDSEND START本程序功能:将存储在 AX 寄存器中的二进制数转换为十进制数并显示。2、 流程图及程序(1)流程图(2)实验代码:DATA SEGMENT从键盘输入一个十进制数,并将其转换为二进制数,存放在 AX 中开始结束素、(CX)-1=0累加循环次数送 CX(MOV CX,AX )AX 清 0(AX 中存放累加和)BX 送 1(BX 存放每次循环累加的数,每循环一次,BX 值加 1)ADD AX,BXINC BX累加和(在 AX 中)转换为十进制数并显示YNINF1 DB “Please input a number (0-
7、65535):$“IBUF DB 7,0,6 DUP(?)OBUF DB 6 DUP (?)DATA ENDSCODE SEGMENTASSUME CS: CODE, DS: DATASTART:MOV AX,DATAMOV DS,AXMOV DX,OFFSET INF1MOV AH,09HINT 21HMOV DX,OFFSET IBUFMOV AH,0AHINT 21HMOV CL,IBUF+1MOV CH,0MOV SI,OFFSET IBUF+2MOV AX,0AGAIN:MOV DX,10MUL DXAND BYTE PTRSI,0FHADD AL,SIADC AH,0INC SIL
8、OOP AGAINMOV CX,AXMOV AX,0MOV BX,1LOOP2:ADD AX,BXINC BXLOOP LOOP2MOV BX,OFFSET OBUF+5MOV BYTE PTRBX,$MOV CX,0AHLOOP1:MOV DX,0DIV CXADD DL,30HDEC BXMOV BX,DLOR AX,AXJNZ LOOP1MOV DL,0AHMOV AH,02HINT 21HMOV DX,BXMOV AH,09HINT 21HMOV AH,4CHINT 21HCODE ENDSEND START(3)实验结果:2.4.4 实验习题1、 从自然数 1 开始累加,直到累加和大
9、于 60000 为止,显示累加的自然数的个数和累加和。显示格式为:1+2+n=sum其中 n 为累加个数,sum 为累加和。(1) 实验代码:DATA SEGMENTOBUF DB 6 DUP(?)EU DB +,$EB DB 0DH,=,0DH,$DATA ENDS DISPLAY MACRO STRINGMOV DX,OFFSET STRINGMOV AH,09HINT 21HENDMCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV AX,1MOV CX,0LOOP1:ADC CX,A
10、XCMP AX,1JE ALLPUSH AXDISPLAY EUPOP AXALL:CALL EXCHANGEINC AXCMP CX,60000JC LOOP1PUSH AXPUSH CXDISPLAY EBMOV AX,CXCALL EXCHANGEPOP CXPOP AXMOV AH,4CHINT 21HRETMAIN ENDPEXCHANGE PROC NEARPUSH AXPUSH BXPUSH CXMOV BX,OFFSET OBUF+5MOV BYTE PTR BX,$MOV CX,10LOOP2:MOV DX,0DIV CXADD DL,30HDEC BXMOV BX,DLOR AX,AXJNZ LOOP2MOV DX,BXMOV AH,09HINT 21HPOP CXPOP BXPOP AXRETEXCHANGE ENDPCODE ENDSEND START(2)实验结果:2.4.5 实验总结通过本次实验,我掌握了汇编循环程序的设计方法,加深了循环程序的结构、循环控制方法的知识。实验中遇到了一些问题,例如:输入源代码时,一定要按照语句格式与语法来写,并且少了空格会导致编译错误;一个完整的汇编程序只能返回一次 DOS 等,返回 DOS 语句后面的汇编程序不会执行等。