微机实验三分支和循环程序设计实验一、分支程序设计实验1.实验目的1.掌握分支程序的结构。
2掌握分支程序的设计、调试方法。
2.实验设备微机一台3.内容设计一数据块间的搬移程序设计思想:程序要求把内存中一数据区(称为源数据块)传送到另一存贮区(称为目的数据块)。
源数据块和目的数据块在存贮中可能有三种情况。
对于两个数据块分离的情况,数据的传送从数据块的首址开始,或者从数据块的末址开始均可,但对于有部分重叠的情况,则要加以分析,否则重叠部分会因“搬移”而遭破坏。
可以得出以下结论:当源数据块首址〉目的块首址时,从数据块首址开始传送数据。
当源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
流程图:结果:在源数据块中存入6个数,分别使SI大于、等于、小于DI均发觉数据正确传送。
可见程序正确。
实现代码如下:DATA SEGMENTORG 3500HSRC_MESS DB 1,2,3,4,5,6ORG 3510HNEW_LOC DB 20 DUP(0)DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,SRC_MESSLEA DI,NEW_LOCMOV CX,6CLD ;DF置0CMP SI,DI ;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
JL NEXT1 ;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2) NEXT2: REP MOVSBNEXT1: ADD SI,CX ; SI=SI+CX-1 从末地址开始传递数据DEC SI ;ADD DI,CX ;DI+=DI+CX-1DEC DI ;STD ; DF置1JMP NEXT2 ;CODE ENDSEND START结果显示:将3500H开始的1,2,3,4,5,6复制到3510H开始的地址。
DATA SEGMENTORG 3500HSRC_MESS DB 1,2,3,4,5,6DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART:MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,SRC_MESSMOV DI,3502HMOV CX,6CLD ;DF置0CMP S I,DI ;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
JL NEXT1 ;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2)NEXT2: REP MOVSBMOV AH,4CHINT 21HNEXT1: ADD SI,CX ; SI=SI+CX-1 从末地址开始传递数据DEC SI ;ADD DI,CX ;DI+=DI+CX-1DEC DI ;STD ; DF置1JMP NEXT2 ;CODE ENDSEND START结果显示:将3500H开始的连续的1,2,3,4,5,6复制搬移到3502H开始的地址。
此时,搬移过程应当从数组的最后一个数字6开始搬移,一直到最前面的3500H对应的的数字01搬移到3502H地址为止。
DATA SEGMENTORG 3502HSRC_MESS DB 1,2,3,4,5,6DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART:MOV AX,DATAMOV DS,AXMOV ES,AXLEA SI,SRC_MESSMOV DI,3500HMOV CX,6CLD ;DF置0CMP S I,DI ;源数据块首址〈目的块首址时,从数据块末地址开始传送数据。
JL NEXT1 ;如果SI小于DI,则跳转到NEXT1(否则直接执行NEXT2)NEXT2: REP MOVSBMOV AH,4CHINT 21HNEXT1: ADD SI,CX ; SI=SI+CX-1 从末地址开始传递数据DEC SI ;ADD DI,CX ;DI+=DI+CX-1DEC DI ;STD ; DF置1JMP NEXT2 ;CODE ENDSEND START结果显示:将3502H开始的1,2,3,4,5,6搬移到3500H开始的地址,应该从3502H地址开始传数据到3500H,依次往后搬移。
二、循环程序设计实验1.实验目的(1)加深对循环结构的理解。
(2)掌握循环结构程序设计的方法。
(3)熟练掌握调试循环程序的方法。
2.实验设备TDS-MD微机一台3.内容(1)编制程序使S=1+2*3+3*4+4*5+……N(N+1),直到N(N+1)项大于200为止。
流程图:实现代码:DATA SEGMENTORG 3500HHELLO DB 32 DUP(0)DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV DX,1 ;DX存储总和MOV BL,2 ;BL存储被乘项NEXT: MOV AL,BL; AL存储被乘项INC BL ;MUL BL ; 结果存储在AXADD DX,AXCMP AX,200JL NEXTMOV BX,3500HMOV [BX],DXMOV BX,3510HMOV [BX],AXMOV AH,4CHINT 21HCODE ENDSEND START结果与分析:运行结果为045FH,与实际相符,程序正确。
(2)求某个数据区内负数的个数设数据区的第一单元存放区内数据的个数,从第二单元开始存放数据,在区内最后一个单元存放结果。
为统计数据区内负数的个数,需要逐个判断区内的每一个数据,然后将所有数据中凡是符号位为1的数据的个数累加起来,即得区内所包含负数的个数。
流程图:实现代码:DATA SEGMENTORG 3500HHELLO DB 6,3,-58,-34,7,-2,29 ;6是数据的个数,共有6个数据ORG 3510HNUM_T DB 16 DUP(0) ;3510H单元存结果DATA ENDS;CODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA ;初始化数据段MOV DS,AXMOV DI,3500H ;数据区的首地址给DIMOV CL,[DI] ;数据的个数给CL,作为NEXT1循环的个数INC DI ;DI指向第一个需要比较的数据MOV CH,0MOV BL,0NEXT1: MOV AL,[DI]AND AL,80H ;AL与1000(B)做按位与操作,如果是负数,AL存储的是1000(B),否则存储的是0CMP AL,80H ;如果是负数,AL与80H相等JE NEXT2 ;如果是负数,跳转到NEXT2GOGO: INC DILOOP NEXT1MOV DI,3510HMOV [DI],BLMOV AX,4C00H ;返回DOSINT 21HNEXT2: INC BLJMP GOGOCODE ENDSEND START结果与分析:输入数据个数为6输入3,-58,-34,7,-2,29得结果03,存放在3510H地址。
其中3500H地址对应的数字6是原始数据的个数。
结果与实际相符,程序正确。
输入数据个数为6输入3,-58,-34,7,-2,-29得结果04,存放在3510H地址。
其中3500H地址对应的数字6是原始数据的个数。
结果与实际相符,程序正确。
实验四子程序设计一.实验目的1、学习子程序的定义和调用方法。
2、掌握子程序、子程序嵌套的结构。
3、掌握子程序的程序设计、编制及调试方法。
二.实验内容程序采用菜单式选择,可接收用户输入的命令(1~5),各命令如下:按1键完成字符串小写字母变大写字母用户输入一由英文大小写字母或数字0~9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母变成大写字母,其它字符不变,并在屏幕上显示。
用户按任一键,重做,按ESC键,返回主菜单。
按2键完成找最大值(二选一)1、接收用户输入的可显示字符串(以回车结束),程序将其中ASCII码值最大的字符显示出来。
2、接收用户输入若干无符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按3键完成排序(二选一)1、接收用户输入的可显示字符串,以回车结束。
程序按ASCII码值大小由大到小排序并输出显示。
2、接收用户输入若干个有符号8位数(以空格逗号为分隔符,以回车结束)。
程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按4键显示时间首先提示用户对时,即用户输入时,分,秒(以空格或冒号分隔,以回车结束),然后,在屏幕上不断显示时间,格式为:××(时):××(分):××(秒),最好定点显示。
用户按任一键,重新对时,按ESC键,返回主菜单。
按5键,结束程序运行,返回系统提示符。
三.程序与流程图主程序的简略流程子程序一的简略流程图子程序二的简略流程图子程序三的简略流程图子程序4,显示时间流程图实现代码:DATA SEGMENTORG 3500HBUF DB 100 ;从3500H开始定义缓冲区DB ?DB 100 DUP(0)MYNAME DB 'Programed by ali ...',0DH,0AH,'$'BUF1 DB '1. Input a string,then convert the small letter to big letter.',0DH,0AH,'$' BUF2 DB '2. Find the character whose ASCII code is biggest.',0DH,0AH,'$'BUF3 DB '3. Sort the character by ASCII code by decreasing order .',0DH,0AH,'$' BUF4 DB '4. Display the ticking time.',0DH,0AH,'$'BUF5 DB '5. End the program.',0DH,0AH,'$'STRING1 DB 'Please input a string:',0DH,0AH,'$'STRING2 DB 'Enter any character to play again or Esc to quit...',0DH,0AH,'$' STRING3 DB 0DH,0AH,'$'DATA E NDS;CODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV A X,DATA ;DATA初始化MOV D S,AXHELLO: CALL CHILD0 ;显示菜单MOV A X,0100H ;从键盘输入一个数字的ASCII,AL存储输入的数字的ASCII INT 21HCMP AL,31HJE NEXT1CMP AL,32HJE NEXT2CMP AL,33HJE NEXT3; CMP AL,34H; JE NEXT4CMP AL,35HJE NEXT5NEXT1: CALL CHILD1JMP HELLONEXT2: CALL CHILD2JMP HELLONEXT3: CALL CHILD3JMP H ELLO;NEXT4: CALL CHILD4; JMP H ELLONEXT5: CALL CHILD5;显示菜单子程序CHILD0 PROC NEARMOV D X,OFFSET MYNAMEMOV A H,9H ;显示INT 21HMOV DX,OFFSET BUF1MOV A H,9H ;显示INT 21HMOV DX,OFFSET BUF2MOV A H,9H ;显示INT 21HMOV DX,OFFSET BUF3MOV A H,9H ;显示INT 21HMOV DX,OFFSET BUF4MOV A H,9H ;显示INT 21HMOV DX,OFFSET BUF5MOV A H,9H ;显示INT 21HRETCHILD0 ENDP;CHILD1 PROC NEARHELLO_1:MOV DX,OFFSET STRING1 MOV A H,9HINT 21HLEA DX,BUFMOV AH,10INT 21HMOV D X,OFFSET STRING3 ;换行MOV A H,9HINT 21HMOV B X,3501HMOV C L,[BX]MOV C H,0MOV B X,3502HNEXT1_1: MOV A L,[BX]CMP AL,97JL DADACMP AL,122JG DADASUB AL,32 ;是小写字符DADA: MOV D L,ALMOV A H,02HINT 21HINC BXLOOP NEXT1_1MOV D X,OFFSET STRING3 ;换行MOV A H,9HINT 21HMOV D X,OFFSET STRING2MOV A H,9HINT 21HMOV A H,08HINT 21HCMP AL,27 ;跟ESC的ASCII比较JE BYBYJMP HELLO_1BYBY: RETCHILD1 ENDP;CHILD2 PROC NEARMOV D X,OFFSET STRING1MOV A H,9HINT 21HLEA DX,BUFMOV AH,10INT 21HMOV DI,3501HMOV CL,[DI]DEC CL ;循环次数MOV CH,0LOOP1:MOV DX,CXMOV B X,3502HLOOP2:MOV AL,[BX]CMP AL,[BX+1]JAE NO_CHANGEXCHG AL,[BX+1]MOV [BX],ALNO_CHANGE:ADD BX,1LOOP LOOP2MOV C X,DXLOOP LOOP1MOV D X,OFFSET STRING3 MOV A H,9HINT 21HMOV DI,3502HMOV DL,[DI]MOV AH,02HINT 21HMOV D X,OFFSET STRING3 ;换行MOV A H,9HINT 21HRETCHILD2 ENDPCHILD3 PROC NEARMOV D X,OFFSET STRING1MOV A H,9HINT 21HLEA DX,BUFMOV AH,10INT 21HMOV DI,3501HMOV CL,[DI]DEC CL ;循环次数MOV CH,0LOOP11:MOV DX,CXMOV B X,3502HLOOP22:MOV AL,[BX]CMP AL,[BX+1]JAE NO_CHANGE1XCHG AL,[BX+1]MOV [BX],ALNO_CHANGE1:ADD BX,1LOOP LOOP22MOV C X,DXLOOP LOOP11MOV DX,OFFSET STRING3MOV A H,9HINT 21HMOV CH,0MOV BX,3501HMOV CL,[BX]MOV DI,3502HPETER:MOV DL,[DI]MOV AH,02HINT 21HINC DILOOP PETERMOV D X,OFFSET STRING3 ;换行MOV A H,9HINT 21HRETCHILD3 ENDP;返回DOSCHILD5 PROC NEARMOV A X,4C00HINT 21HRETCHILD5 ENDPCODE ENDSEND START结果显示:选择1号功能,输入字符串,将字符串转换成大写形式,并显示到屏幕上。