当前位置:文档之家› 北邮微原软件实验报告

北邮微原软件实验报告

2013年微机原理软件实验报告学院:信息与通信工程学院班级:2011211104姓名:实验二分支,循环程序设计一.实验目的:1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的DOS 功能调用二.实验内容:1.安排一个数据区,内存有若干个正数,负数和零.每类数的个数都不超过9.2.编写一个程序统计数据区中正数,负数和零的个数.3.将统计结果在屏幕上显示.三.预习题1.十进制数0 -- 9 所对应的ASCII 码是什么? 如何将十进制数0 -- 9 在屏幕上显示出来?0-9的ACSII码为,30h,31h,32h,34h,35h,36h,37h,38h,39h, 将要显示的数加上30h,得到该数的ACSII码,再利用DOS功能调用显示单个字符2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?利用cmp指令,利用TEST指令,将该数与0相与,将该数与0相减,观察标志位。

四.程序流程图五.源程序DATA SEGMENT ;数据段NUM DB 1,2,-2,3,-3,5,2,4,-6,-11,100,0,0,34,-55,-33,0 ;待处理数据COUNT EQU $-NUM ;数据个数MINUS DB 0 ;小于零的个数ZERO DB 0 ;等于零的个数PLUS DB 0 ;大于零的个数RESULT DB'NEGNUM=',?,0AH,0DH,'ZERONUM=',?,0AH,0DH,'POSNUM=',?,0AH,0DH,'$' ;结果显示字符串DATA ENDSSTACK SEGMENT STACK 'STACK' ;堆栈段DW 50 DUP(?)STACK ENDSCODE SEGMENT ;代码段ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV CX,COUNTMOV SI,OFFSET NUMAGAIN: MOV AL,[SI] ;循环比较CMP AL,0JGE NEXT1INC MINUSJMP DONENEXT1: JZ NEXT2INC PLUSJMP DONENEXT2: INC ZERODONE: INC SILOOP AGAIN ;返回结果MOV DI,OFFSET RESULTMOV AL,MINUSADD AL,30HMOV BYTE PTR[DI+7],ALMOV AL,ZEROADD AL,30HMOV BYTE PTR[DI+18],ALMOV AL,PLUSADD AL,30HMOV BYTE PTR[DI+28],ALMOV AH,09HMOV DX,DIINT 21HMOV AX,4C00HINT 21HCODE ENDSEND START五.程序运行结果正确输出了正数,负数,零的个数七.实验心得与体会这次实验练习了用跳转语句实现分支结构,使我更加熟悉了跳转语句在分支结构中的应用,练习了用DOS功能调用输出字符串。

将课堂的理论应用于实践,体会到了汇编语言编程的特点和魅力。

实验三代码转换程序设计一.实验目的:1.掌握几种最基本的代码转换方法;2.运用子程序进行程序设计.二.实验内容:1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来.2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明.3.对输入要有检错措施,以防止非法字符输入,并有适当的提示.4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.三.预习题1如何将输入的两个字符(0 -- 9)变为十进制或二进制数?将输入的字符减去30H,可得到对应十进制数,将第一个数乘10,加上第二个数,即为最后结果2如何将选出的最小值(二进制或十进制)变为ASCII 码再进行显示?说明:输入的字符以空格间隔,以回车结束,且仅允许输入两位十进制数,输入其他字符,或者输入多位,都会报错将输入的字符串先转化成数串,选出其中的最小值,转化为对应十位和个位,分别加上30H,输出显示3你觉得采用二进制运算还是十进制运算更适合于这个实验?十进制四.程序流程图五.模块层次图六.源程序DATA SEGMENT;数据段BUFFER DB 100 ;存放带输入的数据DB 0DB 100 DUP(0)NUM DB 100 DUP(0) ;存放将输入的数据转化为对应的数MIN DB 100 ;存放最小数RESULT DB 0AH,0DH,'MINNUM=',?,?,0AH,0DH,'$';显示结果ERRMSG DB 0AH,0DH,'INPUT ERROR',0AH,0DH,'$';显示错误信息DATA ENDSSTACK SEGMENT STACK 'STACK';堆栈段DW 50 DUP(?)STACK ENDSCODE SEGMENT ;代码段ASSUME CS:CODE,DS:DATA,SS:STACK;将两位十进制字符转化为对应数的子程序;入口参数:AX,AH存放十位的ACSII码,AL存放个位的ACSII ;出口参数:AL,存放转化后的数值TRANSFER PROC NEARPUSHFPUSH CXSUB AH,30HSUB AL,30HSHL AH,1MOV CH,AHSHL AH,CLADD AH,CHADD AL,AHMOV AH,0POP CXPOPFRETTRANSFER ENDP;找最小数的子程序;入口参数:DI,指向带比较数的最后一个数的下一位;出口参数:MIN,得到最小数FINDMIN PROC NEARPUSHFPUSH AXLOOP1: DEC DIMOV AL,NUM[DI]CMP AL,MINJAE NEXTMOV MIN,ALNEXT: CMP DI,0JZ DONEJMP LOOP1DONE: POP AXPOPFRETFINDMIN ENDP;显示最小数的子程序SHOWMIN PROC NEARPUSHFPUSH AXPUSH BXMOV AL,MINMOV AH,0MOV BL,10DIV BLADD AH,30HMOV RESULT[10],AHADD AL,30HMOV RESULT[9],ALMOV AH,09HMOV DX,OFFSET RESULTPOP BXPOP AXPOPFRETSHOWMIN ENDPSTART: MOV AX,DATA ;程序开始MOV DS,AXMOV DX,OFFSET BUFFERMOV AH,0AHINT 21HMOV AX,0MOV BX,0MOV DI,0MOV SI,1MOV CL,BYTE PTR BUFFER[SI]MOV CH,0INC CXINC SIAGAIN: CMP BYTE PTR BUFFER[SI],20H ;处理输入的字符串JZ NEXT1CMP BYTE PTR BUFFER[SI],0DHJZ NEXT1CMP BYTE PTR BUFFER[SI],30HJB ERRSHOWCMP BYTE PTR BUFFER[SI],39HJA ERRSHOWINC BLCMP BL,2JZ SECMOV AH,BYTE PTR BUFFER[SI]JMP NEXT2SEC: MOV AL,BYTE PTR BUFFER[SI]JMP NEXT2NEXT1: CMP BL,0JZ NEXT2CMP BL,2JNZ ERRSHOWMOV BL,0CALL TRANSFER ;将字符转化为数,并存入NUMMOV NUM[DI],ALINC DINEXT2: INC SILOOP AGAINCALL FINDMINCALL SHOWMINJMP EXITERRSHOW:MOV DX,OFFSET ERRMSGMOV AH,09HINT 21HEXIT: MOV AX,4C00HINT 21HCODE ENDSEND START七.程序运行结果八.实验心得与体会这次实验相较实验二增加了很大的难度,在ASCII码和数值之间的转化部分,花了我不少的时间来编写,也花了不少时间调试,最后能成功,觉得很有成就感,也觉得自己编程更加熟练了,也了解了几个汇编错误码的含义。

练习了子程序的使用,0AH号DOS功能调用等。

体会到了汇编语言粒度很难小的特点,所以实现起来比较麻烦,但也不失乐趣。

实验四子程序设计一.实验目的:1.进一步掌握子程序设计方法;2.进一步掌握基本的DOS 功能调用.二.实验内容:1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入.2.统计检查每个学生的名次.3.将统计结果在屏幕上显示.4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观.5.输入要有检错手段.三.预习题1.如何确定一个学生在这门科目中的名次?对学生的成绩进行排序,并记录对应的学号,最后得到由低到高的成绩序列及对应的学号,即得到学生的排名2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?我认为应该采用选择排序,每次选出最高的分数,并记录学号,输出学号和分数。

而后,将该同学的分数置0,再重复以上操作,直到输出所有学生的学号和成绩五.模块层次:六.源程序DATA SEGMENT ;数据段BUFFER DB 200 ;存放输入的成绩DB 0DB 200 DUP(0)NUM DB 200 DUP(0) ;存放输入字符转化后的成绩数值MAX DB 0 ;存放排序每次最高的成绩MAXNUM DW -1 ;存放每次最高成绩的学生的学号RESULT DB 0AH,0DH,' R N G',0AH,0DH, ;显示结果DB 200 DUP(10 DUP(0),0AH,0DH)ERRMSG DB 0AH,0DH,'INPUT ERROR',0AH,0DH,'$';错误信息DATA ENDSSTACK SEGMENT STACK 'STACK' ;堆栈段DW 50 DUP(?)STACK ENDSCODE SEGMENT ;代码段ASSUME CS:CODE,DS:DATA,SS:STACK;将字符转化为对应数值的子程序;入口参数:BH,AX,分别存放百,十,个位;出口参数:AL,转化后的分数值TRANSFER PROC NEARPUSHFPUSH CXSUB BH,30HCMP BH,0JNZ GOODSUB AH,30HSUB AL,30HSHL AH,1MOV CH,AHMOV CL,2SHL AH,CLADD AH,CHADD AL,AHJMP EXIT1GOOD: MOV AL,100EXIT1: MOV AH,0POP CXPOPFRETTRANSFER ENDP;选择排序子程序;入口参数:DI,指向带排序数组的最后一个数的下一位;出口参数:显示成绩单SORT PROC NEARPUSHFPUSH AXPUSH BXPUSH CXPUSH DXMOV DX,0MOV SI,13MOV CX,DIMOV BX,DILOOP2: MOV DI,BXLOOP1: DEC DIMOV AL,BYTE PTR NUM[DI]CMP AL,MAXJBE NEXTMOV MAX,ALMOV MAXNUM,DIINC MAXNUMNEXT: CMP DI,0JZ DONEJMP LOOP1DONE: MOV DI,MAXNUMMOV BYTE PTR NUM[DI-1],0INC DXCALL SHOWNUMMOV MAX,0MOV MAXNUM,-1LOOP LOOP2EXIT2: POP DXPOP CXPOP BXPOP AXPOPFRETSORT ENDP;将数值转化为对应的ASCII码,存入RESULT待显示TRANSNUM PROC NEARPUSHFPUSH BXMOV BL,10DIV BLADD AL,30HMOV BYTE PTR RESULT[SI],' 'INC SIMOV RESULT[SI],ALINC SIADD AH,30HMOV RESULT[SI],AHINC SIPOP BXPOPFRETTRANSNUM ENDP;显示排名,学号,成绩;入口参数:DX,DI,MAX,分别表示排名、成绩和学号;出口参数:RESULT,显示结果SHOWNUM PROC NEARPUSHFPUSH AXMOV AX,DXCALL TRANSNUMMOV AX,DICALL TRANSNUMCMP MAX,100JZ GREATMOV BYTE PTR RESULT[SI],' 'INC SIMOV AL,MAXMOV AH,0CALL TRANSNUMJMP EXIT3GREAT: MOV BYTE PTR RESULT[SI],31HINC SIMOV BYTE PTR RESULT[SI],30HINC SIMOV BYTE PTR RESULT[SI],30HINC SIEXIT3: ADD SI,2POP AXPOPFRETSHOWNUM ENDP;将结果RESULT显示出来SHOWRESULT PROC NEARPUSHFPUSH AXPUSH DXMOV BYTE PTR RESULT[SI],0AHINC SIMOV BYTE PTR RESULT[SI],0DHINC SIMOV BYTE PTR RESULT[SI],'$'MOV DX,OFFSET RESULTMOV AH,09HINT 21HPOP DXPOP AXPOPFRETSHOWRESULT ENDPSTART: MOV AX,DATAMOV DS,AXMOV DX,OFFSET BUFFERMOV AH,0AHINT 21HMOV AX,3030HMOV BX,3000HMOV DI,0MOV SI,1MOV CL,BYTE PTR BUFFER[SI]MOV CH,0INC CXINC SIAGAIN: CMP BYTE PTR BUFFER[SI],20HJZ NEXT1CMP BYTE PTR BUFFER[SI],0DHJZ NEXT1CMP BYTE PTR BUFFER[SI],30HJB ERRSHOWCMP BYTE PTR BUFFER[SI],39HJA ERRSHOWINC BLCMP BL,3JZ THIRDCMP BL,2JZ SECMOV AL,BYTE PTR BUFFER[SI]JMP NEXT2THIRD: MOV BH,AHMOV AH,ALMOV AL,BYTE PTR BUFFER[SI]JMP NEXT2SEC: MOV AH,ALMOV AL,BYTE PTR BUFFER[SI]JMP NEXT2NEXT1: CMP BL,0JZ NEXT2CMP BL,3JA ERRSHOWCALL TRANSFERMOV NUM[DI],ALMOV BX,3000HMOV AX,3030HINC DINEXT2: INC SILOOP AGAINCALL SORTCALL SHOWRESULTJMP EXITERRSHOW:MOV DX,OFFSET ERRMSGMOV AH,09HINT 21HEXIT: MOV AX,4C00HINT 21HCODE ENDSEND START七.程序运行结果八.实验心得与体会这次实验和实验三比较类似,但又比实验三难了不少,主要是因为增加了排序的部分,在对成绩排序的同时还要保存相应的学号,增加了代码的复杂度。

相关主题