《北京邮电大学_微机原理软件实验报告.docx》由会员分享,可在线阅读,更多相关《北京邮电大学_微机原理软件实验报告.docx(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1/39微机原理软件实验报告学院:信息与通信工程学院班级:XXXXXXXX:XXXXX学号:XXXXXXXX班序号:XXXXX日期:2017 年 11 月 30 日2/39目录目录微 机 原 理 软 件 实 验 报 告.错误!未定义书签。错误!未定义书签。1.实验一.错误!未定义书签。错误!未定义书签。2.实验二.73.实验三.134.实验四.205.实验五.306.总结与结论.397.参考文献.393/39实验一实验一 DEBUGDEBUG 的使用的使用一、一、实验目的实验目的:1.掌握汇编程序的编辑,编译,连接和执行的全过程;2.学习和掌握用 DEBUG 调试程序的方法.二二、实验容、实验
2、容:1.用编辑软件,输入以下汇编语言源程序:DATSEGMENT;默认 ds 段ADB20;(自定)BDB15;(自定)YDB3 DUP(0)ZDB0,0DATENDSSTASEGMENT STACKDW50 DUP(?)STAENDSCOD SEGMENTASSUME CS:COD,DS:DATSTARPROCFARPUSHDSXORAX,AX;AX 清零PUSHAXMOVAX,DATMOVDS,AXMOVAX,STAMOVSS,AXMOVAL,AMOVZ,ALMOVZ+1,ALCALLSUB1;A*AMOVAL,BMOVZ,ALMOVZ+1,ALCALLSUB1;A*A+B*BMOVAL,
3、AMOVZ,AL4/39MOVAL,BMOVZ+1,ALCALLSUB1;A*A+B*B+A*BADDWORD PTR Y,AX;A*A+B*B+A*B+A*B-(A+B)2ADCBYTE PTRY+2,0RETSTARENDPSUB1PROCMOVAL,ZMOVAH,Z+1MULAHADDWORD PTR Y,AXADCBYTE PTRY+2,0RETSUB1ENDPCOD ENDSEND STAR2.通过编译,连接形成可执行文件。3.用 DEBUG 将可执行文件调入,并进行调试。(1)用 D 命令观察数据区在存中的具体容,记录单元 A 和 B 的具体地址。(2)用 U 命令对目标代码反汇编
4、,观察反汇编后的结果.注意发现源程序的起始位置,并记录这个起始地址。(3)用 T 命令作单步跟踪调试.比较每条指令执行后的结果和原来的理解是否一致。得出程序运行的结果:它们是写在什么单元,具体容是什么;并判断结果是否正确。(4)用 E 命令修改单元 A,B 的容,重新执行程序,并记录结果。(5)退出 DEBUG。三、预习题三、预习题:1.熟悉常用的 DEBUG 命令。2.阅读并分析程序的功能。答:程序实现了(A+B)2 的功能。3.若 SS=2000H,SP=FFFFH,向堆栈中压入 4 字节数据后,如何用 D 命令显示压入堆栈的容?答:使用指令“d 2000:0000”即可显示压入堆栈的容,
5、因为SP+1 会溢出,所以变成0000。四、实验过程四、实验过程5/39a.a.通过 masm 和 link 命令使得程序编译成功。b.b.进入 debug 中,用 u 命令查看反编译结果。得出 A 的地址为:076A:0000,值为 14H,即十进制的 20D;B 的地址为:076A:0001,值为 0FH,即十进制的 15D。Y 的偏移地址为 0002H,Z 的偏移地址为 0005H。DATA 段基地址为 076AH。SUB1 子程序段入口地址为003F。c.c.用 e命令将 A 地址和 B 地址的值由 2AH,32H改为23H,24H,通过 d 命令重新查看A 地址,B地址下的数值,发现
6、改变成功。d.d.6/39利用 t 命令单步调试,可发现,每一步程序的执行,会与寄存器与存储器的容的变化是一致的。e.e.退出 debug。五、实验总结五、实验总结由于之前上操作系统时,零散地学过一些汇编相关的容,所以关于 masm、debug 的基本指令的使用还是比较熟悉的,在做实验一的整个过程中也是比较轻松。也希望自己能保持着这种轻松的状态去应对接下来的实验!7/39实验二实验二分支、循环程序设计分支、循环程序设计一、实验目的一、实验目的1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的 DOS 功能调用。二、实验容二、实验容1.安排一个数据区,存有若干个正
7、数,负数和零。每类数的个数都不超过 9。2.编写一个程序统计数据区中正数,负数和零的个数。3.将统计结果在屏幕上显示。4.(选做题)统计出正奇数、正偶数,负奇数、负偶数以与零的个数。三、预习题三、预习题1.十进制数 0 9 所对应的 ASCII 码是什么?如何将十进制数 0 9 在屏幕上显示出来?答:09 分别对应 ASCII 码的 30H39H。因为屏幕上显示的数字是 ASCII 码,所以为了将十进制数 09 显示在屏幕上,需在原有的十进制数值基础上加上 30H 即可。2.如何检验一个数为正,为负或为零?答:本实验中,判断正、负或零是直接用 CMP 命令和 0 比较,然后用 je、jg、jl
8、 等命令进行判断为正、负或零。四、实验流程图四、实验流程图8/39五、实验源代码五、实验源代码;*;*LQ*;*日期:2017/11/20*;*功能:*;*编写一个程序统计数据区中正偶数,正奇数,负奇数,负偶数和零的个数*;*assume cs:code,ds:datadata segment;在 db 数据区,假定数字大小均在-128127 之间,故每个数字用一个字节去存储db-8,-10,-6,-5,-2,-55;给定 6 个负数,其中 4 个偶数,2 个奇数db 4,2,3,78,89,56;给定 6 个正数,其中 4 个偶数,2 个奇数db 0,0;给定 2 个零db$;设定一个结束符
9、data endscode segments1:db 5 dup(0);在代码段设置一块空间用于存储统计的最终数值db Positive Odd:,$;在代码段开出一块空间用于存储显示数据的字符串db Positive Even:,$db Negative Odd:,$db Negative Even:,$db Zero:,$start:mov ax,datamov ds,axxor di,dicall mainmain:mov al,dicmp al,$je showcmp al,00Hjg above0;带符号数的大于比较cmp al,0jl below0;带符号数的小于比较jmp equ
10、al09/39below0:mov bl,2mov ah,0idiv blcmp ah,0je nagative_evenmov ax,csmov cx,dsmov ds,axmov si,offset s1inc byte ptr si+2;负奇数inc dimov ds,cxcall mainnagative_even:;负偶数mov ax,csmov cx,dsmov ds,axmov si,offset s1inc byte ptr si+3inc dimov ds,cxcall mainabove0:mov bl,2mov ah,0idiv blcmp ah,0je positive
11、_evenmov ax,csmov cx,dsmov ds,axmov si,offset s1inc byte ptr si;正奇数inc dimov ds,cxcall mainpositive_even:;正偶数mov ax,csmov cx,dsmov ds,ax10/39mov si,offset s1inc byte ptr si+1inc dimov ds,cxcall mainequal0:mov ax,csmov cx,dsmov ds,axmov si,offset s1inc byte ptr si+4inc dimov ds,cxcall mainshow:;显示数据x
12、or di,dimov ax,0B800Hmov es,axmov ax,csmov ds,axmov si,offset s1add si,5mov dx,0mov bx,0jmp printprint:mov cl,sicmp cl,$je print_datamov byte ptr es:di,clinc dimov byte ptr es:di,07H;07H代表颜色为黑底白字inc diinc sijmp short printprint_data:;打印记录存储的数据值push simov si,offset s1mov cl,bx11/39add cl,48mov byte p
13、tr es:di,clinc dimov byte ptr es:di,71H;71H代表颜色为白底蓝字cmp dx,640je endingadd dx,160mov di,dxpop siinc siinc bxjmp printending:mov ax,04c00Hint 21Hcode endsendstart六、实验过程与解释六、实验过程与解释本次实验要求统计数据区正奇数、正偶数、负奇数、负偶数、零的个数,首先将数据区的数值与 0 比较,按数字的正、负或零的特性分别跳转至处理正数的子程序段、处理负数的子程序段、处理零的子程序段。其中,在处理正、负数的子程序段,对于正负数进行带符号的
14、除二运算,通过判别余数是否为零判别该数是偶数还是奇数,并且判别后将各个对应的正奇数、正偶数、负奇数、负偶数、零的个数进行统计。程序在统计完所有类型的数的个数后,会向显存中写入数字,将统计好的数值以可视化形式呈现出来。编译运行程序结果如下:a.a.通过 masm 和 link 命令使得程序编译成功。12/39b.b.由运行结果可看到与数据区设置的正奇数、正偶数、负奇数、负偶数、零的个数一致。七、实验总结七、实验总结这次实验相较于第一次实验而言,程序需要自己独立设计并且首次涉与到了向屏幕打印数据的程序编写。为了充分理解向屏幕打印数据的细节方面,我没有选择中断的调用去打印数据,而是自己往显存中直接写
15、入数据并且在屏幕上呈现。为了编程实现字符向屏幕端的打印,我需要理解显存的数据存储,如一个 ASCII 码在屏幕端的显示需要两个字节,屏幕通常一行是显示 80 个字符,也即一行对应 160 个字节,同时要使得数据呈现时比较美观,还需要自己设计换行等数值的运算,这些都花了我很多时间去调试,不过这也使得我更完整地理解了显存的工作原理,为之后实验打下了基础。13/39实验三实验三 代码转换程序设计代码转换程序设计一、实验目的一、实验目的1.掌握几种最基本的代码转换方法;2.运用子程序进行程序设计。二、实验容二、实验容1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来。2.两个十进
16、制数之间的分隔符,输入结束标志自定,但要在报告中说明。3.对输入要有检错措施,以防止非法字符输入,并有适当的提示。4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图。三、三、预习题预习题1.如何将输入的两个字符(09)变为十进制或二进制数?答:输入的字符 09 是 ASCII 码表示的,对应于 30H39H,通过减去 30H,可以转换为相应的二进制数。2.如何将选出的最小值(二进制或十进制)变为 ASCII 码再进行显示?答:由于在数据区存储的最小数的数值为二进制数,同时要以十进制易于读的形式转化为 ASCII 码并显示,需要进行除十取商与取余运算,并将取出的二进制形式的
17、商、余数加上 30H,转化为对应的 ASCII 码值。3.你觉得采用二进制运算还是十进制运算更适合于这个实验?答:由于存储器、寄存器中存储的数据形式都是二进制形式的,所以我觉得采用二进制运算更适于本实验,我在程序的设计、编写中也是采用了二进制运算。四、四、程序流程图程序流程图a.a.模块层次图模块层次图14/39b.b.完整程序流程图完整程序流程图五、程序源代码五、程序源代码;*;*LQ*;*日期:2017/11/22*;*功能:*;*输入若干两位十进制数,寻找最小值,并打印至屏幕(默认十进制数均为正数)*;*assume cs:codedata segmentdb Wrong Input!,
18、$db,$;前两行字符串,用于向屏幕打印发生错误时的字符串db 127,0,0;用于存储输入的数字,并且于首位存储着最小的数值data endscode segmentmessage:db The minimum num is:,$;用于最后向屏幕打印最小值的字符串start:mov ax,data15/39mov ds,axxor si,simov di,1AH;1AH 对应着存储数字的区域main:mov ah,0;int 16h 0 编号功能是从键盘缓冲区读取一个键盘值输入int 16h;结果 ah 存储扫描码,al 存储 ascii 码值cmp ah,1cH;1ch 为回车键的扫描码,
19、一旦按下回车表示程序输入结束je print_prog1cmp ah,39H;空格键的扫描键,作为两个十进制数之间的分隔符je comparecmp ah,02Herrorcmp ah,0BHja errorcall showadd si,2jmp short mainshow:inc dimov dx,0b800H;将输入的字符串打印至屏幕mov es,dxmov byte ptr es:si,almov byte ptr es:si+1,07Hsub al,30hmov di,alretcompare:mov dx,0b800H;将输入的字符串打印至屏幕mov es,dxmov byte
20、ptr es:si,almov byte ptr es:si+1,07Hadd si,2mov al,di-1mov bl,10mul bladd al,dicmp al,di-2minimummov di,1AHjmp far ptr main16/39minimum:mov di-2,almov di,1AHjmp far ptr mainprint_prog1:;作为中转,因为 print_prog 程序段超出了 je 跳转的围jmp print_progerror:;调用第 10 号中断的 2 号子程序mov ah,2;置光标mov bh,0mov dh,10;dh 中放行号mov d
21、l,35;dl 中放列号int 10hmov dx,0;ds:dx 指向字符串的首地址mov ah,9;使用 int 21h 号中断例程的 9 号子程序;功能为在光标位置显示字符串 提供要显示的字符串的地址作为参数;要显示的字符串需用$作为结束符int 21hmov cx,10H;设置一个空循环,用于保持错误的提示一段时间empty:loop emptymov ah,2;置光标mov bh,0mov dh,10;dh 中放行号mov dl,35;dl 中放列号int 10hmov dx,0DH;ds:dx 指向字符串的空字符串地址mov ah,9;使用 int 21h 号中断例程的 9 号子程
22、序;功能为在光标位置显示字符串 提供要显示的字符串的地址作为参数;要显示的字符串需用$作为结束符int 21hjmp far ptr mainprint_prog:xor di,diadd di,160;在屏幕的第二行打印输出最小值mov ax,0B800Hmov es,axmov ax,cs17/39mov ds,axmov si,offset messagemov dx,0mov bx,0jmp printprint:mov cl,sicmp cl,$je print_datamov byte ptr es:di,clinc dimov byte ptr es:di,07H;07H代表颜色
23、为黑底白字inc diinc sijmp short printprint_data:;打印记录存储的数据值mov ax,datamov ds,axpush simov si,1AHmov cl,si;取出最小数的数值mov ch,0mov ax,cx;因为该数值在存中是以十六进制存在的,要转化为易于理解的ascii 码十进制的形式,需要进行除十取商和取余操作mov bl,10div blmov cl,al;获取除十取商后的值即十位上的数值并打印add cl,48mov byte ptr es:di,clinc dimov byte ptr es:di,71H;71H代表颜色为白底蓝字inc
24、dimov cl,ah;获取除十取余后的值即个位上的数值并打印add cl,48mov byte ptr es:di,clinc dimov byte ptr es:di,71H;71H代表颜色为白底蓝字ending:mov ax,4c00H;最终程序运行结束int 21Hcode ends18/39end start六、实验过程与解释六、实验过程与解释1.1.本实验已完成的功能是:本实验已完成的功能是:a.a.每次输入一个两位十进制数,按下空格后,会在存储最小值的数据区将刚输入的数值与当前的最小数值进行比对,并时刻在数据区存储当前的最小数。如果想要向屏幕打印当前所有输入的数字中的最小数的数值
25、时,只需按下回车键,会将当前的最小值打印至屏幕。b.b.如果按下错误的按键,屏幕中央会打印出输入错误的提醒,并且这个提醒只会显示几秒钟,类似于弹窗效果,真正起到了提示作用。2.2.程序调试结果:程序调试结果:a a.通过 masm 和 link 命令使得程序编译成功。b.b.正确输入的时候,在此例中,输出了最小数为 02,其中 02 数字的显示为白底蓝字。c.c.输入错误时,会在屏幕中间弹出“wrong Input!”的警告,警告保持几秒后自动消失。七、实验总结七、实验总结本次实验,相较于上一个实验又是一个难度的提升,其中如何得到按键的值,并向屏幕19/39打印出来对应的按键值,还需要了解按键
26、中断触发的工作原理,而这一块在课堂上老师讲解得很浅,还需要自己去查阅相关的资料。本实验中,我在研读了王爽的汇编语言后选中了 int16 中断的 0 号功能,关于此功能的调用与使用我也是花了一些时间去琢磨,但此功能在之后的几个实验中都有着极其重要的意义。此外,还有如何找到最小值,如何在按下不相关按键后提示错误输入并且只显示几秒,这些都用到了一些编程的小技巧,而这些小技巧都是我自己一点一点思索出来的,虽然功能很简单,但是在我看来,这些都是很有趣、很让我满足的。20/39实验四实验四 子程序设计子程序设计一、实验目的一、实验目的:1.进一步掌握子程序设计方法;2.进一步掌握基本的 DOS 功能调用。
27、二、实验容二、实验容:1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入。2.统计检查每个学生的名次。3.将统计结果在屏幕上显示。4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观。5.输入要有检错手段。三、预习题三、预习题:1.如何确定一个学生在这门科目中的名次?答:此程序显然属于排序问题,从简单的排序算法思考,我首先选定使用冒泡排序算法或是插入排序算法,由于插入排序的特性就如同它所介绍的一样-我们在玩纸牌时,每一次抓牌前的纸牌都是排好序的,每一次插牌后也都是排好序的,按照这个特性去设计程序,可以很好地去贴合程序的设计。于是最后我选定
28、插入排序去确定学生在科目中的名次。2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?答:因为本实验我所采取的是插入排序,所以最终输入结束后就已经得到了最终学生的名次,所以输入结束后无需再采用别的算法去确定学生名次。3.准备好模块层次图。21/394.给出输出显示的形式。答:逐行显示,每行依次显示出名次、学号、成绩。四、四、程序设计流程图程序设计流程图五、程序源代码五、程序源代码;*;*LQ*;*日期:2017/11/23*;*功能:*22/39;*输入若干两位十进制数,对应着学生的科目成绩,按照科目成绩进行排序*;*assume cs:codedata segmentdb W
29、rong Input!,$db,$;前两行字符串,用于向屏幕打印发生错误时的字符串db 90 dup(0);假定学生总数不大于 45data endscode segmentmessage:db rank,$start:mov ax,datamov ds,axxor si,simov di,19H;19H 对应着存储数字的区域前面一个区域s:mov ah,0;int 16h 0 编号功能是从键盘缓冲区读取一个键盘值输入int 16h;结果 ah 存储扫描码,al 存储 ascii 码值cmp ah,1cH;1ch 为回车键的扫描码,一旦按下回车表示程序结束je print_prog1cmp a
30、h,39H;空格键的扫描键,作为两个十进制数之间的分隔符je storagecmp ah,02Herrorcmp ah,0BHja errorcall showadd si,2jmp short serror:;调用第 10 号中断的 2 号子程序mov ah,2;置光标mov bh,0mov dh,10;dh 中放行号mov dl,35;dl 中放列号int 10h23/39mov dx,0;ds:dx 指向字符串的首地址mov ah,9;使用 int 21h 号中断例程的 9 号子程序;功能为在光标位置显示字符串 提供要显示的字符串的地址作为参数;要显示的字符串需用$作为结束符int 21
31、hmov cx,10H;设置一个空循环,用于保持错误的提示一段时间empty:loop emptymov ah,2;置光标mov bh,0mov dh,10;dh 中放行号mov dl,35;dl 中放列号int 10hmov dx,0DH;ds:dx 指向字符串的空字符串地址mov ah,9;使用 int 21h 号中断例程的 9 号子程序;功能为在光标位置显示字符串 提供要显示的字符串的地址作为参数;要显示的字符串需用$作为结束符int 21hjmp far ptr sshow:;输入结束后,打印出排名、学号、成绩inc dimov dx,0b800H;将输入的字符串打印至屏幕mov es
32、,dxmov byte ptr es:si,almov byte ptr es:si+1,07Hsub al,30hmov di,alretprint_prog1:;作为中转,因为跳转至 print_prog 的围跨度超过了跳转的围jmp far ptr print_progstorage:;每一次按下空格后,都会把数据存储,同时进行插入排序mov dx,0b800H;将输入的字符串打印至屏幕mov es,dxmov byte ptr es:si,almov byte ptr es:si+1,07H;对已经输入的数据进行处理,有 ascii 码值转化为实际的数值,以与添加其对应的学号24/39
33、add si,2mov al,di-1mov bl,10mul bladd al,dimov di,almov ax,disub al,1bHmov bl,2mov ah,0div blinc almov di-1,alcmp al,1jeoncedec axmov cx,axmov bx,dimov dh,bxcompare:;对插入的数据进行比对,找到该插入的位置sub bx,2cmp dh,bxjna exchangeloop comparejmp exchangeonce:;有些特殊情况:;比如比对位置发现此时的位置最合适,以与第一次插入数据时肯定是有序的;这种情况便不再进行后续比对移
34、动这些操作,直接等待下一次的输入jmp far ptr sexchange:;找到插入的位置后,将数据全部后移,腾出空位让应插入的数据插入sub ax,cxmov cx,ax;元素向后移动的次数为比较的次数mov ax,didec axmov bx,ax25/39mov dh,dimov dl,di-1jcxz oncemove:dec bxmov ah,bxmov bx+2,ahdec bxmov al,bxmov bx+2,alloop movemov bx+1,dhmov bx,dljmp far ptr sprint_prog:xor di,diadd di,160;在屏幕的第二行打印
35、输出最小值mov ax,0B800Hmov es,axmov ax,csmov ds,axmov si,offset messagemov dl,1;显示排名mov bx,0;用于从数据区取出学号,成绩的标识jmp printprint:mov cl,sicmp cl,$je print_datamov byte ptr es:di,clinc dimov byte ptr es:di,07H;07H代表颜色为黑底白字inc diinc sijmp short printprint_data:;打印 数据存储区存储的学号、成绩;打印排名mov cl,dladd cl,4826/39mov by
36、te ptr es:di,clinc dimov byte ptr es:di,07H;07H代表颜色为黑底白字inc di;打印冒号mov cl,58mov byte ptr es:di,clinc dimov byte ptr es:di,07H;07H代表颜色为黑底白字inc di;打印学号值mov ax,datamov ds,axmov cl,bx+1AH;取出学号值mov ch,0mov ax,cx;因为该数值在存中是以十六进制存在的,要转化为易于理解的ascii 码十进制的形式,需要进行除十取商和取余操作mov cl,10div clmov cl,al;获取除十取商后的值即十位上的
37、数值并打印add cl,48mov byte ptr es:di,clinc dimov byte ptr es:di,71H;71H代表颜色为白底蓝字inc dimov cl,ah;获取除十取余后的值即个位上的数值并打印add cl,48mov byte ptr es:di,clinc dimov byte ptr es:di,71H;71H代表颜色为白底蓝字inc di;打印分隔符:mov cl,126mov byte ptr es:di,clinc dimov byte ptr es:di,07H;07H代表颜色为黑底白字inc di;打印成绩inc bxmov cl,bx+1AH;取出
38、成绩mov ch,027/39mov ax,cx;因为该数值在存中是以十六进制存在的,要转化为易于理解的ascii 码十进制的形式,需要进行除十取商和取余操作mov cl,10div clmov cl,al;获取除十取商后的值即十位上的数值并打印add cl,48mov byte ptr es:di,clinc dimov byte ptr es:di,71H;71H代表颜色为白底蓝字inc dimov cl,ah;获取除十取余后的值即个位上的数值并打印add cl,48mov byte ptr es:di,clinc dimov byte ptr es:di,71H;71H代表颜色为白底蓝字
39、inc dlmov al,160mul dlmov di,axinc bxmov cl,bx+1AHmov ax,csmov ds,axmov si,offset messagecmp cl,0jne print1jmp ending;跳转至程序运行结束处print1:;中转程序,jmp 跳转超出围jmp far ptr printending:mov ax,4c00H;最终程序运行结束int 21Hcode endsend start六六实验过程与解释实验过程与解释1.1.本实验已完成的功能是:本实验已完成的功能是:a.a.每次输入一个两位十进制数,按下空格后,会对于存储学号、成绩的数据区进
40、行插入排序,保证每次在数据区存储的数值都是有序的。如果想要向屏幕打印所有学生的成绩与排名,只需按下回车键,会将当前所有学生的成绩与排名打印至屏幕。28/39b.b.如果按下错误的按键,屏幕中央会打印出输入错误的提醒,并且这个提醒只会显示几秒钟,类似于弹窗效果,真正起到了提示作用。2.2.程序调试结果:程序调试结果:a.a.通过 masm 和 link 命令使得程序编译成功。b.b.正确输入时的运行结果:如上图所示,输入的学号为 01 的学生分数为 12,学号为 02 的学生成绩为 98,学号为 03 的学生成绩为 97,学号为 04 的学生成绩为 66,学号为 05 的学生成绩为65,学号为
41、06 的学生成绩为 78。经过排序之后可得第一名为学号为 02 的同学,成绩对应为 98,依次逐行显示。c.c.错误输入时的运行结果:当错误输入时,在屏幕中间会打印出字幕提示输入错误,保持几秒后消失。29/39七、实验总结七、实验总结本次实验初次读题时会觉得难度较大,不好入手,不过认真分析后,会发现此次实验主要考核的就是排序的应用。我们因为在大二已经先修了数据结构这门课,所以对于基本的排序算法有了较好的理解,所以此次实验插入排序的实践上我稍微花了一点时间,在编程中首先需要知道每一次应插入的位置,并且将存储区的数据依次后移腾出应被插入的空间。这些在某种意义上就是数组的插入排序方式,也使得我从汇编
42、层面上理解了数组的工作原理,可以说是收获很大!30/39实验五实验五 中断程序设计中断程序设计一、实验目的一、实验目的:1.初步掌握中断程序的设计方法。2.初步掌握修改 DOS 系统中断,以适应实际使用的方法。二、实验容二、实验容:1.编写一个 32 位二进制数除以 16 位二进制数的除法程序.观察当除数为 0,或超过相应寄存器围时,程序执行的结果。2.修改零号中断服务程序,使它具有以下功能:(1)判断除数是否为 0,当除数为 0 时,显示相应的结果;(2)当除数不为 0 时,采用适当的方法完成商超过 16 位的二进制数的除法运算。3.注意必须保护原有中断服务程序的入口地址,并在程序完毕前加以
43、恢复。三、预习题三、预习题:1.如何保护原有中断向量表中的中断服务程序的入口地址?答:将 0 号中断对应的中断向量表中的中断服务程序的 CS,IP 地址先读入数据区存储,最后程序运行结束后,再恢复回去。2.如何将你的中断服务程序入口地址置入中断向量表?答:知道 0 号中断程序对应的中断向量表的位置,然后直接向中断向量表写入中断服务程序的基址和偏移地址。四、选作题四、选作题:1.用二进制将结果在屏幕上显示.2.从键盘输入二进制数.31/39五、程序设计流程图五、程序设计流程图六、程序源代码:六、程序源代码:;*;*LQ*;*日期:2017/11/25*;*功能:*;*修改 0 号中断处理程序,当
44、除数为 0 时,显示除数不得为 0 的结果*;*当除数不为 0 时,采用适当的方法完成商超过 16 位的运算并以二进制形式打印出来;*assume cs:codesegdata segmentdw 2 dup(0);用于存储原有中断向量表中断服务程序的入口地址data endscodeseg segment32/39message:db Quotient:,$;用于打印商db remainder:,$;用于打印余数start:mov ax,csmov ds,axmov si,offset do0mov ax,0mov es,axmov di,200h;0000:0200 后的 256 个字节通
45、常是空的,可以用来存储中断存储数据load:mov cx,offset do0end-offset do0;-是编译器识别的常数相减运算符号,;设置 cx 为传输长度;将跳转到 do0 的代码全部复制放置于es:di后的存单元中cld;设置传输方向为正;将处理 0 号中断程序的容加载至 0000:0200H 后的存空间rep movsb;mov es:di,byte ptr ds:si;inc siinc dichange0:;修改 0 号中断的中断向量表指向的地址为 0000:0200H 空间mov ax,0mov es,axmov ax,datamov ds,axmov ax,es:0*4
46、mov ds:0,axmov ax,es:0*4+2mov ds:2,axmov word ptr es:0*4,200Hmov word ptr es:0*4+2,0 xor cl,cl;用于标识除法运算是否进入了中断中;做除法mov dx,3mov ax,2mov bx,1div bx;除法溢出,相当于触发了 0 号中断cmp cl,1jne restore1;如果除法运算没有产生溢出,则不将除法运算结果打印jmp print_prog33/39restore1:;中转,用于处理 jmp 跳转超出围jmp far ptr restore;除法溢出运算结束后,打印出除法运算的值print_p
47、rog:xor di,dimov cx,0B800Hmov es,cxmov cx,csmov ds,cxxor ch,ch;增设一个标识,用于决定打印的是余数还是商mov si,offset messagejmp printprint:mov cl,sicmp cl,$je print_datamov byte ptr es:di,clinc dimov byte ptr es:di,07H;07H代表颜色为黑底白字inc diinc sijmp short printprint_data:;打印商与余数的数值cmp ch,1je s1mov cx,16high_16:rol BX,1;输出
48、商的高十六位jc onejmp zeroone:mov byte ptr es:di,49inc dimov byte ptr es:di,07H;07H代表颜色为黑底白字inc diloop high_16jmp szero:mov byte ptr es:di,4834/39inc dimov byte ptr es:di,07H;07H代表颜色为黑底白字inc diloop high_16jmp ss:mov cx,16low_16:rol ax,1;输出商的低十六位jc one1jmp zero1one1:mov byte ptr es:di,49inc dimov byte ptr
49、es:di,07H;07H代表颜色为黑底白字inc diloop low_16mov byte ptr es:di,66;添上 B 代表二进制的后缀inc dimov byte ptr es:di,07H;07H代表颜色为黑底白字inc simov di,160inc chjmp printzero1:mov byte ptr es:di,48inc dimov byte ptr es:di,07H;07H代表颜色为黑底白字inc diloop low_16mov byte ptr es:di,66;添上 B 代表二进制的后缀inc dimov byte ptr es:di,07H;07H代表
50、颜色为黑底白字inc simov di,160inc chjmp prints1:mov cx,16remainder:rol dx,1;输出余数jc one2jmp zero235/39one2:mov byte ptr es:di,49inc dimov byte ptr es:di,07H;07H代表颜色为黑底白字inc diloop remaindermov byte ptr es:di,66;添上 B 代表二进制的后缀inc dimov byte ptr es:di,07H;07H代表颜色为黑底白字jmp restorezero2:mov byte ptr es:di,48inc d