[工学]北邮微原软件实验报告.doc

上传人:音乐台 文档编号:1977000 上传时间:2019-01-27 格式:DOC 页数:31 大小:268KB
返回 下载 相关 举报
[工学]北邮微原软件实验报告.doc_第1页
第1页 / 共31页
[工学]北邮微原软件实验报告.doc_第2页
第2页 / 共31页
[工学]北邮微原软件实验报告.doc_第3页
第3页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《[工学]北邮微原软件实验报告.doc》由会员分享,可在线阅读,更多相关《[工学]北邮微原软件实验报告.doc(31页珍藏版)》请在三一文库上搜索。

1、微原软件实验报告班级:2009211119 班 学号:09210550 班内序号:07 姓名:胡易 实验二 分支,循环程序设计一.实验目的: 1.开始独立进行汇编语言程序设计; 2.掌握基本分支,循环程序设计; 3.掌握最简单的 DOS 功能调用.二.实验内容: 1.安排一个数据区,内存有若干个正数,负数和零.每类数的个 数都不超过 9. 2.编写一个程序统计数据区中正数,负数和零的个数. 3.将统计结果在屏幕上显示.开始三.程序流程图 BUFF偏移地址送BX否dh=dh+1(等于0个数)否ah=ah+1(小于0个数)DL=DL+1 (大于0个数)BX是否大于0?BX是否大于等于0 BX值加1

2、否判断完所有的数?是显示结果,结束四.源程序 data segment buff dw 22,11,33,0,55,-11,-32,-45,-56,123,-121count equ $-buffplus db ? ;大于0的个数zero db ? ;等于0的个数minus db ?;小于0的个数string1 db zhengshu:,$ string2 db fushu:,$string3 db 0:,$data endsstack segment stackstack db 100 dup(?)stack endscode segmentassume cs:code,ds:data,ss

3、:stackstart: mov ax,datamov ds,axmov cx,countshr cx,1mov dx,0mov ah,0mov bx,offset buffagain: cmp word ptr bx,0 jge plu ;判断是否大于等于0,是就跳转 inc ah ;小于0的个数加1jmp nextplu:jz zer ;判断是否等于0.是就跳转inc dl;大于0的个数加1jmp nextzer:inc dh ;等于0的个数加1next:inc bxinc bx;修改指针地址loop againmov plus,dl ;将大于0,小于0,等入0个数存入mov zero,d

4、hmov minus,ahcall show1 ;显示最终结果call show2call show3mov ax,4c00hint 21hshow1 proc near ;显示大于0的数 push dx mov ah,09hmov dx,seg string1mov ds,dxmov dx,offset string1int 21hmov al,plusadd al,0-0hmov ah,02hmov dl,alint 21hmov dl,0ahint 21hpop dxretshow1 endpshow2 proc near ;显示小于0的数 push dxmov ah,09hmov dx

5、,seg string2mov ds,dxmov dx,offset string2int 21hmov al,minusadd al,0-0hmov ah,02hmov dl,alint 21hmov dl,0ahint 21hpop dxretshow2 endpshow3 proc near ;显示等于0的数 push dxmov ah,09hmov dx,seg string3mov ds,dxmov dx,offset string3int 21hmov al,zeroadd al,0-0hmov ah,02hmov dl,alint 21hmov dl,0ahint 21hpop

6、dxretshow3 endpcode endsend start五.程序运行结果六.预习题 1.十进制数 0 - 9 所对应的 ASCII 码是什么? 如何将十进制数 0 - 9 在 屏幕上显示出来? 0-9的ascii码为,30h,31h,32h,34h,35h,36h,37h,38h,39h, 将要显示的数加上30h,得到该数的ascii码,再利用DOS功能调用显示单个字符 2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法? 利用cmp指令,利用TEST指令,将该数与0相减,观察标志位。检查最高位,为0是正数,为1时再检查其他位判断是负数或0七.实验心得与体会 这次实验我主

7、要练习了基本的分支结构程序的编写,以及简单的DOS功能调用,并利用debug功能查找程序中的逻辑错误,由于程序比较简单,所以没有花费太多时间,但仍然让我对汇编语言有了一个新的认识 实验三 代码转换程序设计一.实验目的: 1.掌握几种最基本的代码转换方法; 2.运用子程序进行程序设计.二.实验内容: 1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来. 2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明. 3.对输入要有检错措施,以防止非法字符输入,并有适当的提示. 4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.三.程序流程图初始化

8、 调用get1子程序,取第一个数调用get2子程序,取第二个数compare子程序调用get3子程序取第三个字符其他数字判断字符是什么?回车显示结果模块层次图 四.源程序 data segmentminh db 9minl db 9number1db 100 dup(?)number2 db 100 dup(?)error db input error,pleaes input again,0dh,0ah,$welcome db please number:,0dh,0ah,$result db the min is:,0ah,$data endsstack segment stackstac

9、kdb 100 dup(?)stack endscode segment assume cs:code,ds:data,ss:stackstart: mov bx,0mov ax,datamov ds,axmov si,offset number1mov di,offset number2call welcloop1:call get1cmp bl,01jz startloop2:mov si,alcall get2cmp bl,02jz start call compareinc siinc dicall get3cmp al,0dh jz overcmp al,0jb startcmp a

10、l,9jb loop2 jmp startover: mov ah,02hmov dl,0dhint 21hmov bx,offset minhmov ah,bxadd ah,0-0mov bx,ahmov bx,offset minlmov al,bxadd al,0-0mov bx,almov ah,09hmov dx,seg resultmov ds,dxmov dx,offset resultint 21hmov ah,02hmov bx,offset minhmov dl,bxint 21h ;显示十位数mov bx,offset minlmov dl,bxint 21h ;显示个位

11、数mov ax,4c00hint 21hcompare proc near push axpush bxmov ah,simov al,di sub ah,0-0sub al,0-0mov bx,offset minhcmp ah,bxjb e1 ;十位小于现存数,直接将AH,AL,赋给minh,minlja e2 ;大于现存数,返回主程序mov bx,offset minlcmp al,bx ;比较个位,大于就直接跳到返回主程序ja e2e1:mov bx,offset minhmov bx,ahmov bx,offset minlmov bx,ale2:pop axpop bxretcom

12、pare endp welc proc near mov ah,09hmov dx,seg welcomemov ds,dxmov dx,offset welcomeint 21hretwelc endpget1 proc near ;取第一个数字mov ah,01hint 21hcmp al,0jbe error1cmp al,9jae error1jmp endpperror1: mov bl,01h mov ah,09hmov dx,seg errormov ds,dxmov dx,offset errorint 21hendpp: retget1 endpget2 proc near

13、;取第二个数字mov ah,01hint 21hcmp al,0jb error2cmp al,9jae error2mov di,almov ah,02hmov dl,int 21hjmp endpp2error2: mov bl,02hmov ah,09hmov dx,seg errormov ds,dxmov dx,offset errorint 21hendpp2: retget2 endpget3 proc near ;判断结束或空格mov ah,01hint 21hretcode endsend start程序分析:在该实验中,我总共定义了4个子程序,get1用于输入第一个字符,在

14、输入后检测输入的是否是0-9的数,不是则报错重新输入,是则存储到相应内存中,get2用于输入第二个字符,检测如果是数字的话则存入相应内存,并且输出“,”表示一个两位十进制数输入完毕,再调用get3函数,若为数字则继续调用get2输入数字,若为回车则进入最后输出结果,若为其他字符则报错重新输入。 输入完毕后按回车键显示最终结果五.程序运行结果六.预习题1如何将输入的两个字符(0 - 9)变为十进制或二进制数? 将输入的字符减去30H,可得到十进制数 2如何将选出的最小值(二进制或十进制)变为 ASCII 码再进行显示? 先定义一个字节的数据,分为十位和低位,每次将输入的数十位和已存的十位相比较,

15、若小于则将输入的字符和已存的交换,大于则不交换,等于时比较个位,若小于则交换,最后将十位和个位分别加上30H变为相应的ascii码输出 3你觉得采用二进制运算还是十进制运算更适合于这个实验? 十进制七.实验心得与体会 这次的实验相较于上次复杂了很多,光编写代码的时间就用了2个小时,期间不断的思考如何输入,如何储存,如何比较,最后又参考了同学的代码才写完,写完后一编译发现又有很多错,于是乎不断的在debug环境下用t命令G命令D命令调试,查错,找到一个错改过来再重新编译继续debug,这个过程一共持续了3个小时才最终将所有的逻辑错误改好,也终于输出了正确的结果。这次实验主要是考察了进制转换的相关

16、知识,认识到了输入的ascii码和数值之间的关系,也学会了DOS功能调用。在该程序中共定义了4个子程序,在写完后觉得还有很多地方也可以定义子程序完成,但是由于急于求成就没有再花心思,导致程序在最后有些冗长,这些是以后需要避免的,总的来说,这次实验是第一次遇到比较多的挑战,但自己都慢慢的解决了,很有成就感。实验四 子程序设计 一.实验目的: 1.进一步掌握子程序设计方法; 2.进一步掌握基本的 DOS 功能调用.二.实验内容: 1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入. 2.统计检查每个学生的名次. 3.将统计结果在屏幕上显示. 4.为便于观察,输入学生数目不宜太

17、多,以不超过一屏为宜.输出应便于阅读.尽可 能考虑美观. 5.输入要有检错手段.开始三.程序流程图 调用get1子程序,取第一个数调用get2子程序,取第二个数compare子程序调用get3子程序取第三个字符其他数字判断字符是什么?回车调用排序子程序显示结果模块层次: 四.源程序 data segmentminh db 9minl db 9number1db 100 dup(?);存储十位number2 db 100 dup(?);存储个位error db input error,pleaes input again,0dh,0ah,$welcome db please input numb

18、er:,0dh,0ah,$result db the minist is:,0ah,$data endsstack segment stackstack db 100 dup(?)stack endscode segment assume cs:code,ds:data,ss:stackstart: mov bx,0mov cx,0mov ax,datamov ds,axmov si,offset number1mov di,offset number2call welcloop1:call get1cmp bl,01jz startloop2:mov si,alcall get2cmp bl

19、,02jz start call compare inc siinc dicall get3cmp al,0dh jz overcmp al,41hjz Acmp al,0jb startcmp al,9jbe loop2 jmp startover: mov ah,02hmov dl,0dhint 21hmov dl,0ahint 21hmov bx,offset minhmov ah,bxadd ah,0-0mov bx,ahmov bx,offset minlmov al,bxadd al,0-0mov bx,almov ah,09hmov dx,seg resultmov ds,dxm

20、ov dx,offset resultint 21hmov ah,02hmov bx,offset minhmov dl,bxint 21hmov bx,offset minlmov dl,bxint 21hmov ah,02hmov dl,0dhint 21hmov dl,0ahint 21hcall sortmov si,offset number1mov di,offset number2mov ah,02hdisplay:mov dl,siint 21hmov dl,diint 21hmov dl,0dh int 21hmov dl,0ahint 21hinc siinc diloop

21、 displayA:mov ax,4c00hint 21hcompare proc near push axpush bxmov ah,simov al,di sub ah,0-0sub al,0-0mov bx,offset minhcmp ah,bxjb e1 ;十位小于现存数,直接将AH,AL,赋minh,minlja e2 ;大于现存数,返回主程序mov bx,offset minlcmp al,bx ;比较个位,大于就直接跳到返回主程序ja e2e1:mov bx,offset minhmov bx,ahmov bx,offset minlmov bx,ale2:pop axpop

22、bxretcompare endp welc proc near mov ah,09hmov dx,seg welcomemov ds,dxmov dx,offset welcomeint 21hretwelc endpget1 proc near ;取第一个数字mov ah,01hint 21hcmp al,0jb error1cmp al,9ja error1jmp endpperror1: mov bl,01hmov ah,09hmov dx,seg errormov ds,dxmov dx,offset errorint 21hendpp: retget1 endpget2 proc

23、near ;取第二个数字mov ah,01hint 21hcmp al,0jb error2cmp al,9ja error2mov di,almov ah,02hmov dl,int 21hinc cxjmp endpp2error2: mov bl,02hmov ah,09hmov dx,seg errormov ds,dxmov dx,offset errorint 21hendpp2: retget2 endpget3 proc near ;判断结束或空格mov ah,01hint 21hretget3 endpsort proc near ;对成绩排序push cx push bxp

24、ush axmov bl,clmov al,clst1:mov cl,almov si,offset number1mov di,offset number2st2:mov ah,simov bh,si+1cmp ah,bhjb exchja last mov ah,dimov bh,di+1cmp ah,bhjbexchjmp lastexch: mov ah,simov bh,si+1xchg ah,bhmov si,ahmov si+1,bhmov ah,dimov bh,di+1xchg ah,bhmov di,ahmov di+1,bhlast:inc siinc diloop st

25、2dec bxcmp bl,0ja st1pop axpop bxpop cx retsort endpcode endsend start五.程序运行结果六.预习题 1.如何确定一个学生在这门科目中的名次?有两种基本思路,一是抽取每个学生的成绩和其他所有学生的成绩进行比较,然后统计比其分数高的学生,得出该学生的名次;二是把学生成绩存入连续内存区域,即数组方式,取得每个学生的成绩偏移量,即成绩指针。然后比较指针所指的成绩的大小,根据比较结果移动指针完成排序。具体排序时可以采用诸多的方式,比如冒泡法,快速排序法等等,均是可行的。本实验采用第二种方式,用冒泡法予以具体实现。 2.你觉得输入结束后,

26、采用什么方法进行比较以得到学生的名次最为简单?利用排序算法,将学生的成绩排序,同时学生的学号也随着成绩的排序而改变在内存中的位置,当排序结束后,学号的顺序也随之改变,最后学后的顺序即为名次 七.实验心得与体会 这次的实验相比上次更加复杂,尤其是排序那里,之前在数据结构中学过的排序算法现在用上了,由于汇编语言没有高级语言那么方便,所以在编写排序算法时花了很长的时间。等做完后看题目要求才发现和题目的要求有出入,题目要求要给出名次,但是我只是将成绩从大到小排了序而没有给出名次,这个时候也没再想继续修改,以后有时间我会考虑将程序补全。这次实验同样花了一下午的时间在debug上,整个程序完成后感觉非常的

27、累,但也觉得比较高兴,因为毕竟是自己亲手完成的实验。通过这次实验也深深的觉得自己的编程能力又提升了一个档次实验五 中断程序设计一.实验目的: 1.初步掌握中断程序的设计方法: 2.初步掌握修改 DOS 系统中断,以适应实际使用的方法.二.实验内容: 1.编写一个 32 位二进制数除以 16 位二进制数的除法程序.观察当除数为 0,或 超过相应寄存器范围时,程序执行的结果. 2.修改零号中断服务程序,使它具有以下功能: (1)判断除数是否为 0,当除数为 0 时,显示相应的结果; (2)当除数不为 0 时,采用适当的方法完成商超过 16 位的二进制数的除法运算. 3.注意必须保护原有中断服务程序

28、的入口地址,并在程序完毕前加以恢复.三.程序流程图四.源程序 DATA SEGMENTmessage db 0AH,0DH,divisor equals 0.,0dh,0ah,$message1 DB 0AH,0DH, input error,0DH,0AH,$message2 DB PLEASE INPUT THE DIVIDEND (32),0AH,0DH,$message3 DB 0AH,0DH,PLEASE INPUT THE DIVISOR (16),0AH,0DH,$message4 DB 0AH,0DH,THE QUOTIENT IS:,$message5 DB 0AH,0DH,

29、THE REMAINDER IS:,$ DATA ENDSSTACK SEGMENT STACK STACK STACK ENDSCODE SEGMENT;代码段ASSUME CS:CODE, SS:STACK ,DS:DATAstartproc farpush dsmov ax,0push axmov ax,datamov ds,axsti;TF中断标志置1mov al,0;保存原中断向量mov ah,35hint 21hpush espush bxpush dx;写中断向量mov ax,seg int00mov ds,axmov dx,offset int00mov al,0mov ah,

30、25hint 21hpop ds mov ah,09hmov dx,seg message2;提示输入32位二进制0或1mov ds,dxmov dx,offset message2int 21hmov cx,10hmov ax,0000hpush axa1:mov ah,01hint 21hcmp al,0;输入数字与0比较jz a2cmp al,1;输入数字与1比较jnz error1;输入有误则跳错误显示程序stc;为1则将CF置1rcl dx,1;dx左移,移进一个1loop a1jmp a3a2:clc;为0则将CF置0rcl dx,1;dx左移,移进一个0loop a1a3: mo

31、v cx,10ha4:mov ah,01hint 21hcmp al,0jz a5cmp al,1jnz error2stcpop axrcl ax,1push axloop a4jmp a6a5:pop axclcrcl ax,1push axloop a4a6:mov ah,09hmov dx,seg message3;提示输入16位0或1除数mov ds,dxmov dx,offset message3int 21hmov cx,10ha7:mov ah,01hint 21hcmp al,0jz a8cmp al,1jnz error2stcrcl bx,1loop a7jmp a9a8

32、:clcrcl bx,1loop a7jmp a9error1: mov ah,09h;输入错误提示mov dx,seg message1mov ds,dxmov dx,offset message1int 21hjmp a1error2: mov ah,09hmov dx,seg message1mov ds,dxmov dx,offset message1int 21hjmp a6a9:mov cx,0000hpop axdiv bxcmp bx,20hjz a14push dxpush axmov ah,09hmov dx,seg message4mov ds,dxmov dx,offs

33、et message4int 21hmov bx,08h call xianshimov bx,08h pop cxcall xianshimov ah,09hmov dx,seg message5mov ds,dxmov dx,offset message5int 21h mov bx,08hpop cxcall xianshi a14: pop dx;恢复中断向量表pop cxpush dsmov ds,cxmov al,0mov ah,25hint 21hpop dsretstart endpxianshi proc neara11:test cx,10000000bjz a10mov

34、ah,02hmov dl,1int 21hsal cx,1dec bxjnz a11 jmp a12a10:mov ah,02hmov dl,0int 21hsal cx,1dec bxjnz a11 a12: retxianshi endp int00proc far;修改后的中断服务子程序pop cx;修改返回地址add cx,2push cxcmp bx,0jne nextmov ah,09hmov dx,seg message;除数为0,显示错误信息mov ds,dxmov dx,offset messageint 21hmov bx,20hjmp finish;退出next:push ax;做除法,被除数低16位AX暂存于堆栈mov dx,ax;被除数高16位改为低16位mov dx,0;被除数高16位为0div bx;第一次除法mov cx,ax;保存高16位的商于CX pop ax;恢复低16位被除数,高16位是上次的余数div bx;商是CX:AX,余数是

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1