北邮-微原软件实验报告.docx

上传人:jian****018 文档编号:9148636 上传时间:2020-04-03 格式:DOCX 页数:18 大小:137.86KB
返回 下载 相关 举报
北邮-微原软件实验报告.docx_第1页
第1页 / 共18页
北邮-微原软件实验报告.docx_第2页
第2页 / 共18页
北邮-微原软件实验报告.docx_第3页
第3页 / 共18页
点击查看更多>>
资源描述
微机原理软件实验报告学院:信息与通信工程学院班级: 班内序号: 姓名: 学号: 实验二 分支,循环程序设计一.实验目的: 1.开始独立进行汇编语言程序设计; 2.掌握基本分支,循环程序设计; 3.掌握最简单的 DOS 功能调用.二.实验内容: 1.安排一个数据区(数据段),内存有若干个正数,负数和零.每类数的个数都不超过 9. 2.编写一个程序统计数据区中正数,负数和零的个数. 3.将统计结果在屏幕上显示.三.预习题: 1.十进制数 0 - 9 所对应的 ASCII 码是什么? 如何将十进制数 0 - 9 在屏幕上显示出来? 答:09对应的ASCII 码是30H39H;在屏幕上显示09,需要将对应字符的ASCII 码赋给DL,并进行DOS的2号功能调用,09的ASCII 码正是其本身的数值加上30H。2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?答:用CMP命令和0比较,如果ZF为1,则该数为零;再用该数和8000H相与,取出符号位判断,可区分正负;用CMP命令和0比较,结果不小于0时用JGE命令进行跳转,否则为负数;用JGE命令跳转后,如果为0再用JZ命令跳转,否则为正数。四.选作题:统计出正奇数,正偶数,负奇数,负偶数以及零的个数.五.实验过程1.流程图2.源代码DATA SEGMENT NUM DW 0,0,1,2,3,4,5,101,-6,-7,-8,-8,-9 ;有2个0,6 个正数,5 个负数 N DW ($-NUM)/2 ;该组数据的个数 Z DB 0 ;0 的个数 P DB 0 ;正数的个数 PO DB 0 ;正奇数的个数 PE DB 0 ;正偶数的个数 M DB 0 ;负数的个数 MO DB 0 ;负奇数的个数 ME DB 0 ;负偶数的个数STR0 DB number of zeros : $ ;STR0-4为用于显示的字符串STR1 DB 0DH, 0AH, number of positive numbers : $ STR2 DB 0DH, 0AH, number of negative numbers : $STR3 DB 0DH, 0AH, odd : $STR4 DB even : $ DATA ENDSSTACK SEGMENT STACK DW 100 DUP(?) STACK ENDSCODE SEGMENT ASSUME DS:DATA, SS:STACK, CS:CODE START: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX ;初始化 DS、SS LEA BX, NUM ;将 NUM 中第一个数字的地址送入 BX MOV CX, N ;将数据个数送入 CX AGAIN: MOV AX, BX ;取出 NUM 中的第一个数字 CMP AX, 0 ;和0比较 JGE PLU ;大于等于0时转PLU INC M ;负数的个数加1 TEST AX, 1 ;检测该数据最低位是否为1,即是否为负奇数 JNZ MINODD ;ZF为0时转MINODD,该数为负奇数 INC ME ;负偶数个数加1 JMP NEXTMINODD: INC MO ;负奇数个数加1 JMP NEXT PLU: JZ ZER ;等于0时转ZER INC P ;正数个数加1 TEST AX, 1 ;检测该数据最低位是否为1,即是否为正奇数 JNZ PLUODD ;ZF为0时转PLUODD,该数为正奇数 INC PE ;正偶数个数加1 JMP NEXTPLUODD: INC PO ;正奇数个数加1 JMP NEXTZER: INC Z ;零的个数加1NEXT: ADD BX,2 ;偏移地址加2,指向下一数字 LOOP AGAIN ;CX自减,CX0时继续循环DISPLAY: ;在屏幕上显示统计结果MOV AH, 09H ;9号功能调用,显示字符串 MOV DX, OFFSET STR0 ;将字符串的首地址的偏移地址送到DX,DS已;是其段基址 INT 21H MOV AH, 02H ;2号功能调用,显示单个字符 MOV DL, Z ;将零的个数送到DL ADD DL, 30H ;09数字本身加上30H即为其ASCII 码 INT 21H MOV AH, 09H ;正数部分统计结果显示,原理同上 MOV DX, OFFSET STR1 INT 21H MOV AH, 02H MOV DL, P ADD DL, 30H INT 21H MOV AH, 09H MOV DX, OFFSET STR3 INT 21H MOV AH, 02H MOV DL, PO ADD DL, 30H INT 21H MOV AH, 09H MOV DX, OFFSET STR4 INT 21H MOV AH, 02H MOV DL, PE ADD DL, 30H INT 21H MOV AH, 09H ;负数部分统计结果显示,原理同上 MOV DX, OFFSET STR2 INT 21H MOV AH, 02H MOV DL, M ADD DL, 30H INT 21H MOV AH, 09H MOV DX, OFFSET STR3 INT 21H MOV AH, 02H MOV DL, MO ADD DL, 30H INT 21H MOV AH, 09H MOV DX, OFFSET STR4 INT 21H MOV AH, 02H MOV DL, ME ADD DL, 30H INT 21H MOV AX, 4C00H ;返回DOS INT 21H CODE ENDS END START 3.运行结果数据为:0,0,1,2,3,4,5,101,-6,-7,-8,-8,-9运行结果:zero表示零的个数,为2;positive number表示正数的个数,为6,其中奇数odd为4个,偶数even为2个;negative number表示负数的个数,为5,其中奇数odd为2个,偶数even为3个。与数据对比,可知输出结果正确。实验三 代码转换程序设计一.实验目的: 1.掌握几种最基本的代码转换方法; 2.运用子程序进行程序设计.二.实验内容: 1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来. 2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明. 3.对输入要有检错措施,以防止非法字符输入,并有适当的提示. 4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.三.预习题: 1.如何将输入的两个字符(0 - 9)变为十进制或二进制数? 答:输入的字符是ASCII码,将其ASCII码减去30H后即为其实际数值;若需将两个字符变为一个两位十进制或二进制数,可将第一个字符ASCII码减去30H后的数乘以10,再和第二个字符ASCII码减去30H后的数相加。 2.如何将选出的最小值(二进制或十进制)变为 ASCII 码再进行显示? 答:将最小值除以10,得到的商为其十位上的数字,余数为其个位上的数字,分别加上30H即为其对应的ASCII码,再进行DOS的2号功能调用进行显示。 3.你觉得采用二进制运算还是十进制运算更适合于这个实验? 答:二进制,因为机器语言就是二进制,使用起来会更方便。四.实验过程1.流程图2.模块划分3.源代码DATA SEGMENTBUFFER DB 100 DB 0 DB 100 DUP (0)MIN DB 99WARNING DB input error ,please input again,0DH,0AH,$ ;错误提示RESULT DB the minimum is $DATA ENDSSTACK SEGMENT STACK STACK DB 100 DUP (?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START:MOV AX,DATA MOV DS,AX CALL INPUT ;调用输入字符串子程序 CALL CHECK ;调用检错子程序 CMP AL,0 ;根据标志AL判断是否有非法输入 JZ ERROR ;有非法输入时跳转 CALL COMP ;调用比较子程序 CMP AL,0 JZ ERROR CALL OUTPUT ;调用显示子程序 MOV AX,4C00H INT 21HERROR:MOV DX,OFFSET WARNING ;错误提示 MOV AH,09H INT 21H JMP START;. INPUT PROC NEAR ;输入子程序 MOV DX,SEG BUFFER MOV DS,DX MOV DX,OFFSET BUFFER MOV AH,0AH INT 21H MOV AL,BUFFER+1 ;将输入字符数赋给AL ADD AL,2 ;加上BUFFER开头两个字节 MOV AH,0 MOV SI,AX MOV BUFFERSI,0DH ;为输入字符串的结尾加上0DH、0AH和$ MOV BUFFERSI+1,0AH MOV BUFFERSI+2,$ LEA DX,BUFFER+2 MOV AH,9 INT 21H RETINPUT ENDP;. CHECK PROC NEAR ;检错子程序,只检验是否输入09和分隔符之外的字符 MOV BX,OFFSET BUFFER MOV CL,BUFFER+1 ;实际输入字符数赋给CL MOV CH,0LOOP1:MOV AL,BX+2 ;判断第一个字符 CMP AL,30H ;不是0-9的字符时跳转到FG1 JB FG1 CMP AL,39H JA FG1NEXT1:ADD BX,1 LOOP LOOP1 ;循环CX次,CX即字符个数 RETFG1: CMP AL,20H ;再判断是否空格 JZ NEXT1 ;是空格跳转到NEXT1,BX加1进行LOOP1循环 MOV AL,0 ;也不是空格时置AL为0,返回 RET CHECK ENDP;.COMP PROC NEAR ;比较子程序,同时判断输入是否全部为两位数 MOV BX,OFFSET BUFFERLOOP2: MOV AL,BX+2 ;从第一个字符开始判断 CMP AL,20H ;判断是否为空格 JZ FG2 CMP AL,0DH ;判断是否为结束符 JZ END;.转换为二进制. SUB AL,30H ;ASCII码减去30H即为其实际数值 ADD AL,AL ;变为2倍 MOV CH,AL MOV CL,2 SHL AL,CL ;左移2位,即变为4倍 ADD AL,CH ;24+2倍,即为原来的10倍 MOV AH,BX+3 ;取个位数 CMP AH,20H ;判断输入是否是数字 JZ FG2 SUB AH,30H ADD AL,AH ;个位数与十位数的10倍相加,即转换为二进制;.比较. CMP AL,MIN ;MIN初值为99 JGE NEXT2 ;不小于最小值时跳转 MOV MIN,AL ;小于最小值时,替换掉最小值;.NEXT2: ADD BX,2 MOV AL,BX+2 ;判断是否有分隔符空格 CMP AL,20H JNZ FG2 INC BX JMP LOOP2 ;输入合法时进行循环 RETFG2: CMP AL,0DH JZ END MOV AL,0END: RETCOMP ENDP;.OUTPUT PROC NEAR ;输出显示子程序 MOV AH,09H MOV DX,SEG RESULT MOV DS,DX MOV DX,OFFSET RESULT INT 21H;.将二进制数变为ASCII码进行显示. MOV AL,MIN CBW MOV BL,10 DIV BL ;除以10得到十位的数字 MOV BH,AH ADD AL,30H ;加30H即为ASCII码 MOV AH,02H MOV DL,AL INT 21H MOV AL,BH ADD AL,30H MOV AH,02H MOV DL,AL INT 21H RETOUTPUT ENDPCODE ENDS END START 4.运行结果分隔符为空格键,结束符为回车键实验四 子程序设计一.实验目的: 1.进一步掌握子程序设计方法; 2.进一步掌握基本的 DOS 功能调用.二.实验内容: 1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入. 2.统计检查每个学生的名次. 3.将统计结果在屏幕上显示. 4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可 能考虑美观. 5.输入要有检错手段.三.预习题: 1.如何确定一个学生在这门科目中的名次? 答:可以将该同学的成绩与其他同学进行比较,统计比他成绩高的同学的人数,即可得其名次;也可将所有同学按成绩进行排序,从而确定其名次。 2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单? 将所有学生按照成绩从高到低进行排序,然后可以得到学生的名次,排序算法有很多种,考虑到数据量较小等因素,本实验采用简单选择排序,即选择成绩最高的一位同学与第一位同学进行交换,然后从第二位同学开始,选择成绩最高的一位与第二位交换,依次类推进行排序。 3.准备好模块层次图. 4.给出输出显示的形式. ID SCORE RANK 5 :0 1 1 90 2 :0表示100,分数用空格隔开,回车表示结束四.实验过程1.流程图2.源代码DATA SEGMENTBUFFER DB 100 DB 0 DB 100 DUP (0)COUNT1 DB 1COUNT2 DB 1COUNT3 DB 1STRING1 DB ID SCORE RANK,0DH,0AH,$ ;用于显示的字符串STRING2 DB ,$TIPS DB Please input the scores of students:( use :0 instead of 100 ),0DH,0AH,$WARNING DB input error ,0DH,0AH,$RANK DB 100 DUP (?) ;排名SCORE DB 100 DUP (?) ;分数ID DB 100 DUP (?) ;学号DATA ENDSSTACK SEGMENT STACK STACK DB 100 DUP (?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATASTART: MOV AX,DATA MOV DS,AX MOV AH,09H ;输入提示 MOV DX,SEG TIPS MOV DS,DX MOV DX,OFFSET TIPS INT 21H CALL INPUT ;调用输入子程序 CALL DA ;调用用于换行的子程序 CALL CHECK ;调用检错子程序 CMP AL,0 ;判断是否有非法输入 JZ ERROR CALL TRANSF ;调用ASCII码转为二进制数的子程序 CMP AL,0 ;判断是否有非法输入 JZ ERROR CALL SORT ;调用排序子程序 CALL DA CALL DISP ;调用显示子程序 MOV AX,4C00H INT 21HERROR:MOV DX,OFFSET WARNING ;错误提示 MOV AH,09H INT 21H JMP START;. INPUT PROC ;输入子程序 MOV DX,SEG BUFFER MOV DS,DX MOV DX,OFFSET BUFFER MOV AH,0AH INT 21H RETINPUT ENDP ;. DA PROC ;用于换行的子程序 MOV AH,02H MOV DL,0DH INT 21H MOV AH,02H MOV DL,0AH INT 21H RETDA ENDP;40;.CHECK PROC NEAR ;检错子程序,检测是否有09、:、空格、回车以外的;字符输入,:和0组合用来代替100 MOV BX,OFFSET BUFFER MOV CL,BUFFER+1 ;实际输入字符数赋给CL MOV CH,0LOOP1:MOV AL,BX+2 ;判断第一个字符 CMP AL,30H ;不是09及:的字符时跳转到FG1 JB FG1 CMP AL,40H JA FG1NEXT1:ADD BX,1 LOOP LOOP1 ;循环CX次,CX即字符个数 RETFG1: CMP AL,20H ;再判断是否空格 JZ NEXT1 ;是空格跳转到NEXT1,BX加1进行LOOP1循环 MOV AL,0 ;也不是空格时置AL为0,返回 RET CHECK ENDP;.TRANSF PROC ;用于ASCII码转换为二进制数的子程序,同时判断输入;是否规范 MOV BX,OFFSET BUFFER MOV DI,OFFSET SCORE MOV SI,OFFSET ID MOV CH,0A1: MOV AL,BX+2 CMP AL,20H ;判断是否为分隔符 JZ FG2 ;60 CMP AL,0DH ;判断是否为结束符 JZ E1;. ASCII码变为二进制 SUB AL,30H ;原理同实验三 ADD AL,AL MOV DH,AL MOV CL,2 SHL AL,CL ADD AL,DH MOV AH,BX+3 SUB AH,30H ADD AL,AH;. MOV DI,AL ;将得到的二进制数保存到SCORE中 INC CH MOV SI,CH ;添加学号到ID中 ADD BX,2 MOV AL,BX+2 ;判断是否有分隔符空格 CMP AL,20H JNZ FG2 INC BX INC DI INC SI JMP A1 ;输入合法时进行循环 RETFG2: CMP AL,0DH ;判断是否结束 JZ E1 MOV AL,0 ;输出错误标志E1: RETTRANSF ENDP;.SORT PROC ;排序子程序;.显示学生人数. MOV AL,CH ADD AL,30H MOV AH,02H MOV DL,AL INT 21H;.简单选择排序. LEA SI,SCORE LEA DI,SCORE LEA BP,ID LEA BX,SCORE+1;100 SUB BP,SI B: MOV AL,COUNT2 MOV COUNT1,ALS: MOV AL,SI ;SI应指向最大的数,初始化为第一个数,比较时有数大于它要;进行改变 MOV AH,BX CMP AH,AL JBE C ;小于等于进行跳转,不改变SI,继续比较 MOV SI,BX ;大于时要更新SI INC BX INC COUNT1 ;用于计数,判断是否比较结束 CMP COUNT1,CH JZ JIAOHUAN ;一轮筛选结束后要交换最大值和乱序区最前面的数 JNZ SC: INC BX INC COUNT1 CMP COUNT1,CH JZ JIAOHUAN JMP S JIAOHUAN: MOV AL,SI ;SI指向最大的数,DI指向乱序区的第一个数,进行交换 MOV AH,DI MOV DI,AL MOV SI,AH MOV AL,DS:BP+SI ;学号同步进行交换 MOV AH,DS:BP+DI MOV DS:BP+DI,AL MOV DS:BP+SI,AH INC DI ;有序区数目加1 INC COUNT2 ;计数,用于判断N-1轮比较是否结束 CMP COUNT2,CH;120 JZ E MOV SI,DI ;初始化下一轮比较的起始位置 MOV BX,DI INC BX JMP B ;跳转到下一轮比较E: RETSORT ENDP;.DISP PROC ;输出显示子程序 LEA SI,ID LEA DI,SCORE;.显示列名. MOV AH,09H MOV DX,SEG STRING1 MOV DS,DX MOV DX,OFFSET STRING1 INT 21H;. 显示ID.N: MOV AL,SI ADD AL,30H MOV AH,02H MOV DL,AL INT 21H;.显示分数 CALL GS ;用于调整格式的子程序 MOV AL,DI ;将二进制数变为ASCII码进行显示 CBW MOV BL,10 DIV BL MOV BH,AH ;个位 ADD AL,30H MOV AH,02H MOV DL,AL INT 21H ;显示十位 MOV AL,BH ADD AL,30H MOV AH,02H MOV DL,AL INT 21H ;显示个位 INC SI INC DI;显示 CALL GS MOV AH,02H ; MOV AL,COUNT3 ADD AL,30H MOV DL,AL INT 21H INC COUNT3 CALL DA DEC CH JNE N ;不为0时转移 JMP E2 ;.空格. GS: MOV AH,09H MOV DX,SEG STRING2 MOV DS,DX MOV DX,OFFSET STRING2 INT 21H RET;.E2: NOP RETDISP ENDP CODE ENDS END START3.运行结果实验总结:实验三我运用了简单选择排序,输出结果是按照排名排列,若需要按照学号进行排列,可使用将一个人的成绩与其他所有人成绩进行比较的方法得到名次,存储到内存中,而不进行排序。通过本次实验,我对汇编语言有了更深的理解,真正将课本上的知识运用了起来,虽然花费了不少时间,但是我觉得是值得的。而且我知道如果想编出更加简短的代码,需要进行更多的练习。
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!