总汇编语言程序设计报告材料五.doc
汇编语言程序设计报告 五五、 数据处理与输入输出 实验1. 实验目的与要求目的:1) 全面掌握输入和输出的中断功能调用键盘和显示器2) 掌握子程序的定义和调用3) 学会编制良好风格的汇编语言程序要求:1) 在实验四的根底上,在屏幕上开设二个窗口如左右或上下2) 定义输入缓冲区最多输入50个字符3) 在第一个窗口输入要求有输入提示4) 后台程序完成实验四的工作5) 结果显示在第二个窗口要求有输出提示6) 所有程序必须以子程序方式表现除了初始化和程序结尾7) 必须在程序中做好子程序的功能说明以与参数说明8) 注意调试结果,并做好记录。2. 实验源代码.model small.386.model small.386DATAS SEGMENTSTRING1DB'Please input a string:$' STRING2DB'Please input a character:$' SORT_STRDB'SORTED STRING:$' FIRST_STRDB'FIRST LOCATION:$' LAST_STRDB'LAST LOCATION:$' SUM_STRDB'SUM:$' BUFA DB80,?,80 dup(?) BUFB DB80,?,80 dup(?)CRLF DB13,10,'$'FLAG DB0FLOC DB0LLOC DB0TEN DB10SUMDB0LFLAG DB 0DATAS ENDS;定义宏指令 清屏CLEAR MACRO A,B,C,D MOV AH,6MOV AL,0 MOV CH,A MOV CL,B MOV DH,C MOV DL,D MOV BH,7 INT 10H ENDM;宏指令 向上卷动SCROLL MACRO T,ULROW,ULCOL,LRROW,LRCOL MOV AH,7MOV AL,T MOV CH,ULROW MOV CL,ULCOL MOV DH,LRROW MOV DL,LRCOL MOV BH,70H INT 10H ENDM;宏指令 光标定位POSTC MACRO X,Y MOV AH,2MOV DH,X MOV DL,Y MOV BH,0 INT 10H ENDMCODES SEGMENTSTART:MAIN PROC ASSUME CS:CODES,DS:DATASPUSH DSXOR AX,AXPUSH AXMOV AX,DATASMOV DS,AX CLEAR 0,0,24,79 SCROLL 5,3,5,8,70 SCROLL 5,10,5,15,70 POSTC 3,5BEGIN:;输入字符串MOVAH,09HLEADX,STRING1INT21HLEADX,BUFAMOVAH,0AHINT21HLEADX,CRLFMOVAH,09HINT21H ;排序CALL POP_SORT;传送CALL MOVE_TO_NEW;输入查找字符POSTC 4,5LEADX,STRING2MOVAH,09HINT 21HMOVAH,01HINT 21H;查找字符CALL FIND_CHAR;求和CALL GET_SUM;输出排序结果CALL PRINT_SORTED;输出查找结果CALL PRINT_LOCATIONMOV AH,4CH INT 21HMAIN ENDP;=冒泡排序=POP_SORT PROC NEARMOV BL,BUFA1DECBLLOOP1:MOV CH,BLLEASI,BUFA2LOOP2:MOVAL,SICMPAL,SI+1JLEEXTXCHG AL,SI+1MOVSI,ALEXT:INCSIDECCHJNZLOOP2DECBLJNZLOOP1RETPOP_SORT ENDP;=移动=MOVE_TO_NEW PROC NEARLEASI,BUFA1LEADI,BUFB1MOVCH,BUFA1INCCHMOVE:MOVAL,SIMOVDI,ALINCDIINCSIDECCHJNZMOVERETMOVE_TO_NEW ENDP;=查找=FIND_CHAR PROC NEARLEASI,BUFB2MOVCH,0FIND:CMPAL,SIJZFOUNDJMPNEXTFOUND:CMPFLAG,1JNZFIRSTJMPLASTFIRST:INCFLAGMOVFLOC,CHINCFLOCJMPNEXTLAST:INC LFLAGMOVLLOC,CHINCLLOCCMPAL,SI+1JNZFENDJMPNEXTNEXT:INCSIINCCHCMPCH,BUFB1JNAE FINDFEND:LEADX,CRLFMOVAH,09HINT 21HRETFIND_CHAR ENDP;=求和GET_SUM PROC NEARXORAL,AL ;清零ALADDAL,FLOCADDAL,LLOCMOVSUM,AL ;求和RETGET_SUM ENDP;=输出排序结果PRINT_SORTED PROC NEARPOSTC 10,5LEADX,SORT_STRMOV AH,09H INT 21H MOV AH,09HLEA DX,BUFB2 INT 21HLEA DX,CRLFMOV AH,09HINT 21HRETPRINT_SORTED ENDP;=输出查找结果PRINT_LOCATION PROC NEARPOSTC 12,5LEADX,FIRST_STRMOVAH,09HINT21HMOVAL,FLOC;第一个位置SUBAH,AHDIVTENADDAX,3030HMOVBL,AHMOVDL,ALMOVAH,2INT 21HMOVDL,BLMOVAH,2INT21HLEADX,CRLFMOVAH,09HINT21HCMPLFLAG,0 JZFIN ;假如只找到一个,跳转到末尾;找到不止一个,输出最后一个位置与位置和 PLAST:POSTC 13,5LEADX,LAST_STRMOVAH,09HINT21HMOVAL,LLOC;最后一个位置SUBAH,AHDIVTENADDAX,3030HMOVBL,AHMOVDL,ALMOVAH,2INT 21HMOVDL,BLMOVAH,2INT21HLEADX,CRLFMOVAH,09HINT21HPOSTC 14,5LEADX,SUM_STRMOVAH,09HINT21HMOVAL,SUM;位置之和SUBAH,AHDIVTENADDAX,3030HMOVBL,AHMOVDL,ALMOVAH,2INT 21HMOVDL,BLMOVAH,2INT21HLEADX,CRLFMOVAH,09HINT21HFIN: RETPRINT_LOCATION ENDPCODESENDSENDSTART3. 输出结果:只找到一个位置:找到多个位置:4. 体会这次实验根本上沿用了上次实验的代码,难点是开设两个窗口,这需要用到BIOS显示中断,对屏幕进展一系列的操作。