微机原理软件实验报告_第1页
微机原理软件实验报告_第2页
微机原理软件实验报告_第3页
微机原理软件实验报告_第4页
微机原理软件实验报告_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.微机原理软件实验报告信息与通信工程学院微机原理软件实验报告班级: 姓名: 班内序号: 学号: 日期: 2012年11月.;第38页实验一 DEBUG的使用一、 实验目的: 1.掌握汇编程序的编辑,编译,连接和执行的全过程; 2.学习和掌握用DEBUG调试程序的方法.二 、实验内容: 1.用编辑软件,输入以下汇编语言源程序: DAT SEGMENT A DB 20 ;(自定) B DB 15 ;(自定) Y DB 3 DUP(0) Z DB 0,0 DAT ENDS STA SEGMENT STACK DW 50 DUP(?) STA ENDS COD SEGMENT ASSUME CS:CO

2、D,DS:DAT STAR PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DAT MOV DS,AX MOV AX,STA MOV SS,AX MOV AL,A MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,B MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,A MOV Z,AL MOV AL,B MOV Z+1,AL CALL SUB1 ADD WORD PTR Y,AX ADC BYTE PTRY+2,0 RET STAR ENDP SUB1 PROC MOV AL,Z MOV AH,Z+1 MUL

3、 AH ADD WORD PTR Y,AX ADC BYTE PTRY+2,0 RET SUB1 ENDP COD ENDS END STAR 2.通过编译,连接形成可执行文件. 3.用 DEBUG 将可执行文件调入,并进行调试. (1)用 D 命令观察数据区在内存中的具体内容,记录单元 A 和 B 的具体地址. (2)用 U 命令对目标代码反汇编,观察反汇编后的结果.注意发现源程序的起始 位置, 并记录这个起始地址. (3)用 T 命令作单步跟踪调试.比较每条指令执行后的结果和原来的理解是否 一致.得出程序运行的结果:它们是写在什么单元,具体内容是什么; 并判断结果是否正确. (4)在子程序

4、 SUB1 的入口处设一断点,用 G 命令执行程序. 在断点处观察堆 栈的内容,比较堆栈的内容和程序返回地址是否一致. (5)用 E 命令修改单元 A,B 的内容,重新执行程序,并记录结果. (6)用 M 命令和 A 命令对程序进行修改: 将主程序中最后两条指令 (ADD 和 ADC) 修改为一条 CALL SUB1 指令,重新执行程序. (7)退出 DEBUG.4.重新使用编辑软件,把源程序最后一句中的 STAR 去掉.再次生成可执行文件, 并用 DEBUG 调入内存.当使用 U 命令时,显示的结果与前一次(未加 STAR) 的结果有何不同? 三、预习题:1.熟悉常用的 DEBUG 命令.

5、2.阅读并分析程序的功能. 3.若 SS=2000H,SP=FFFFH, 向堆栈中压入 4 字节数据后,如何用 D 命令显示压入堆栈的内容?答:使用debug 指令“d 2000:0000”即可显示压入堆栈的内容,这是因为SP+1 会溢出,变成0000。四、实验过程 如上图,通过masm和link命令程序编译连接成功。进入debug中,用u命令查看反编译结果。得出A的地址为:0B88:0000,值为1BH,即十进制的27D;B的地址为:0B88:0001,值为33,即十进制的51D。Y的偏移地址为0002H,Z的偏移地址为0005H。DATA段基地址为0B88H。SUB1子程序段入口地址为00

6、3F。如上图所示,用E命令将A和B的值由1EH,33H改为10H,20H,通过d命令重新查看A,B的数值,发现改变成功。通过U命令查看反汇编结果,在CALL SUB1即CALL 003F处设置一个断点,单步调试。上图为用t命令单步运行结果,执行SUB1之后返回主程序时CS为0B88,IP为001A,压入堆栈的IP值已经弹出,CS,IP已经指向下一条指令。上图为用用 M 命令和 A 命令对程序进行修改: 将主程序中最后两条指令 (ADD 和ADC) 修改为一条 CALL SUB1 指令,重新执行程序.如上图所示,将源代码中最后一句END STAR改成EDN,发现编译连接均可通过,但是DEBUG时

7、出现了严重的错误,没有END STAR语句,编译器将不知道代码段的入口地址是多少,导致从数据段开始译码,后续译码全部紊乱。END STAR的作用是指示编译器程序结束,同时告诉编译器程序执行时代码段的入口地址。五、实验总结本次实验我初步了解了汇编语言的调试过程。实验之前我还觉得汇编语言过于抽象,难以看懂。实验中我使用-t与-d相结合的方法,逐步调试并查看该步对寄存器及内存的影响,终于对汇编语言有了入门的认识。实验中应注意以下几点:在debug 过程中,任何存储器单元都无法用标号来识别,要使用它们,只能使用物理地址调用。使用u 指令修改asm 代码时要对照反汇编的结果,若要删去某条指令,可以找到那

8、条指令在代码段的偏移地址,再用u 指令将其修改为NOP(从该指令开始到下一条指令开始的地址-1 处)。可以结合r 指令、t 指令、已经用g 指令设置断点来诊断问题。实验二 分支、循环程序设计一、实验目的1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的 DOS 功能调用。二、实验内容1.安排一个数据区,内存有若干个正数,负数和零。每类数的个数都不超过 9。2.编写一个程序统计数据区中正数,负数和零的个数。3.将统计结果在屏幕上显示。4.(扩展题)统计出正奇数、正偶数,负奇数、负偶数以及零的个数。三、预习思考1. 十进制数 0 9 所对应的 ASCII 码是什么?

9、 如何将十进制数 0 9 在屏幕上显示出来?答:09分别对应ASCII码的30H39H。欲将十进制数09显示在屏幕上,只需要用二进制数09分别加上30H即可。2. 如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?答:方法有多种,现举出两种。一是直接用CMP命令和0比较,然后用JZ等命令进行判断;二是和0相比是否相等,然后用该数(假设为8位)和10000000相与,取出符号位判断,可区分正负。其余方法大同小异,核心的思想是要么直接和0相比,要么使用逻辑或移位运算,取出符号为进行判断。四、实验流程图五、实验源代码DATA SEGMENTBUFF DB -1,-4,0,1,2,3,4,-

10、1,-2,-3,-4,-5,-8,-10 COUNT EQU $-BUFFCOUNT1 DB 0;正奇数COUNT2 DB 0;正偶数COUNT3 DB 0;负奇数COUNT4 DB 0;负偶数COUNT5 DB 0;0的个数BUF1 DB POSITIVE ODD:$BUF2 DB POSITIVE ENEN:$BUF3 DB NEGATIVE ODD:$BUF4 DB NEGATIVE ENEN:$BUF5 DB ZERO:$CR DB 0DH,0AH,$DATA ENDSSTACK SEGMENT STACK STACKDB 100 DUP(?)STACK ENDSCODE SEGMEN

11、TASSUME CS:CODE,DS:DATA,SS:STACKBEGIN:MOV AX,DATAMOV DS,AXMOV CX,COUNTMOV SI,OFFSET BUFFAGAIN:MOV AL,SIMOV AH,0MOV BL,2CMP AL,00HJGE PLU;如果大于或等于0 则进入PLUIDIV BLOR AH,0JZ MO;如果余数为0,则为负偶数JNZ MJ;如果余数不为0,则为负奇数MO:INC COUNT4;负偶数JMP EXITMJ:INC COUNT3;负奇数JMP EXITPLU:JZ ZER;为0跳转IDIV BLOR AH,0JZ PO;如果余数为0,则为正偶

12、数JNZ PJ;如果余数不为0,则为正奇数ZER:INC COUNT5;0的个数加一JMP EXITPO:INC COUNT2;正偶数JMP EXITPJ:INC COUNT1;正奇数JMP EXITEXIT:INC SILOOP AGAIN MOV DX, OFFSET BUF1 MOV AH, 09HINT 21HMOV DL, COUNT1ADD DL,30H MOV AH, 02H INT 21H MOV DX, OFFSET CR MOV AH, 09HINT 21H MOV DX, OFFSET BUF2 MOV AH, 09HINT 21HMOV DL, COUNT2ADD DL

13、,30H MOV AH, 02H INT 21H MOV DX, OFFSET CR MOV AH, 09HINT 21H MOV DX, OFFSET BUF3 MOV AH, 09HINT 21HMOV DL, COUNT3ADD DL,30H MOV AH, 02H INT 21H MOV DX, OFFSET CR MOV AH, 09HINT 21H MOV DX, OFFSET BUF4 MOV AH, 09HINT 21HMOV DL, COUNT4ADD DL,30H MOV AH, 02H INT 21H MOV DX, OFFSET CR MOV AH, 09HINT 21

14、H MOV DX,OFFSET BUF5 MOV AH, 09HINT 21HMOV DL, COUNT5ADD DL,30H MOV AH, 02H INT 21H MOV DX, OFFSET CR MOV AH, 09HINT 21HMOV AX,4C00HINT 21HCODE ENDSEND BEGIN六、实验思路本次实验要求统计一组8位16进制数中的正负奇偶数以及零的个数,我采取了先与0比较,得出正负数和零,然后分别对于正负数进行带符号的除法运算,通过判断余数是否为零判断该数是偶数还是奇数。执行IDIV指令(带符号数的除法指令)后,8位数除以4位数的余数存放在AX寄存器的高8位AL

15、中,通过比较AL与0的关系判断出奇偶数。编译运行程序结果如下: 七、实验总结这是第一次正式做微原软件的实验,还是遇到了不少困难的。首先就是对代码的不熟悉以及对编程环境的不习惯。总是习惯用C语言编程的习惯来写代码,所以采用了除法判断余数的方法区分奇偶数。程序写完之后一直提示out of memery,百度了之后发现原来是不小心把单引号写成了中文默示里面的引号。程序编译通过之后,运行结果一直不对,就用了debug命令查错。发现判断到负数的时候总是进入正数的程序里,自习检查程序,原来是用AL存放8位数的时候,最高位是符号位,但是AH是全0的,导致了AX和0比较的时候不会出现小于0的情况。更改为AL与

16、00H比较就解决了这一问题。下次实验会更加仔细,尽量采用硬件的思想去编程,像本题的判断奇偶数如果用最后位是否为0判断会更简单。实验三 代码转换程序设计一、实验目的 1.掌握几种最基本的代码转换方法; 2.运用子程序进行程序设计.二、实验内容1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来. 2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明. 3.对输入要有检错措施,以防止非法字符输入,并有适当的提示. 4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.三、预习思考1. 如何将输入的两个字符(09)变为十进制或二进制数?答:输入的字

17、符09是ASCII码表示的,对应于30H39H,通过减去30H,可以转换为相应的计算机数。2. 如何将选出的最小值(二进制或十进制)变为 ASCII 码再进行显示?答:如果采用输入时把ASCII码转换为数字,然后比较数字的大小再输出,那么输出时还需要把数字再次转换为ASCII码。这样比较麻烦,ASCII码也可以直接比较大小。可以直接读入并存储数字的ASCII码,然后直接输出ASCII码即可。3. 你觉得采用二进制运算还是十进制运算更适合于这个实验?答:采用二进制或者十进制都需要进行ASCII码到数字的转换和其反向转换,都比较麻烦,增大了代码复杂度。可以直接使用数字对应的ASCII比较,分别比较

18、十位和个位,最后直接输出字符即可。四、程序流程图图一 总程序流程图图二 获取键盘输入子程序图三 寻找最小数五、程序源代码及解释DATA SEGMENTERROR1 DB error: the number is not valido,$ERROR2 DB error: the input number must contains two digits,$ERROR3 DB error: empty,$ERROR4 DB error: lack of kongge,$RESULT DB error: the smallest num is:,$CR DB 0DH,0AH,$; 回车换行COUNT

19、 DB 0;存放数的总数NUM DB 100 DUP(?);存放输入的数字 MIN DB 9-30H,9-30H;存放最小的数字SIG DB 0D;错误标志位DATA ENDSSTACK SEGMENT STACK STACKDB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME DS:DATA,CS:CODE,SS:STACKMAIN PROC FARMOV AX,DATAMOV DS,AXCALL GETNUMCMP SIG,1JZ EXIT0;出现输入错误则直接返回D0SCALL FINDMINLEA DX,RESULTCALL SHOWMOV AH,02HM

20、OV DL,MIN ;将最小数的高位数赋给DL,加上30H输出ADD DL,30HINT 21HMOV AH,02HMOV DL,MIN1 ;将最小数的低位数赋给DL,加上30H输出ADD DL,30HINT 21HEXIT0: MOV AX,4C00H INT 21HMAIN ENDP;显示字符串子程序SHOW PROCPUSH AXMOV AH,09HINT 21HPOP AX;恢复参数保护现场RETSHOW ENDP;从键盘获取输入子程序GETNUM PROCPUSH AXPUSH BXPUSH CXPUSH DXPUSH DIMOV DI,0MOV CX,0NEXT:MOV AH,1;

21、调用DOS命令输入单个字符INT 21HCMP AL,0DH;判断是否是回车符,如果是回车则结束获取JZ EXITCMP CX,0JZ LOOP1CMP CX,1JZ LOOP2CMP CX,2JZ LOOP3LOOP1:CMP AL,20H ;比较当前输入的是否是空格,如果是直接忽略JZ CUOWU3JMP GETLOOP2: CMP AL,20H ;当前已经输入了一位,如果再输入空格,则出错JZ CUOWU2JMP GETLOOP3: CMP AL,20HJNE CUOWU4 ;如果当前已经输入了两位数,却没有输入空格,则出错XOR CX,CX ;如果当前已经输入了两位数并输入了空格,则将

22、CX清JMP NEXT ;进入下一次读取键盘操作GET:SUB AL,30H ;将读入的字符减去30HJL CUOWU1 ;比较输入的数是否超出界限CMP AL,9JG CUOWU1MOV NUMDI,ALINC COUNT INC CXINC DIJMP NEXTCUOWU1: MOV SIG,1MOV DX,OFFSET ERROR1CALL SHOWJMP RETURNCUOWU2: MOV SIG,1MOV DX,OFFSET ERROR2CALL SHOWJMP RETURNCUOWU3: MOV SIG,1MOV DX,OFFSET ERROR3CALL SHOWJMP RETUR

23、NCUOWU4: MOV SIG,1MOV DX,OFFSET ERROR4CALL SHOWJMP RETURNEXIT:MOV BL,COUNTCMP BL,0JZ CUOWU3;如果输入的数字个数为0,则是第三种错误AND BL,01H;输入的数字是否是两位数CMP BL,0JNZ CUOWU2;输入的数字不是两位的时候,是第二种错误RETURN: POP DIPOP DXPOP CXPOP BXPOP AXRETGETNUM ENDP;寻找最小数的子程序FINDMIN PROCPUSH DIPUSH AXPUSH CXMOV DI,-2MOV CL,COUNTMOV AL,CLCBWM

24、OV CX,AXLOOPA:ADD DI,2CMP CX,DIJZ JIESHUMOV AH,NUMDIMOV AL,NUMDI+1CMP AH,MIN;如果十位数比临时的最小数的高位大不改变minJA LOOPAJZ HIGH1;如果十位数相等则进入个位数比较BIANHUA:MOV MIN,AH;改变最小数MOV MIN1,ALJMP LOOPA;继续比较下一个数HIGH1:CMP AL,MIN1JNB LOOPA;比较个位数JMP BIANHUAJIESHU: POP CXPOP AXPOP DIRETFINDMIN ENDPCODE ENDSEND MAIN用了子程序调用的方法,大大缩短

25、了代码的长度和复用度,写了四个PROC,主过程,显示字符串的子程序,从键盘获取输入的子程序和求最小数的子程序。规定了每个两位数之间用空格隔开,结束符定位空格键,规定了四种错误:(1)输入数字无效,即输入的一位数字比0小,或者比9大。(2)输入的数字不是两位的,即输入一位数之后就输入空格键了。(3)输入的数字为空,即直接按下了空格键。(4)两个两位数之间没有用空格隔开。本程序比较数字大小是直接用ASCII码比较的,先将输入的减去30H,再两位分开比较,先比较十位,如果当前数字的十位ASCII比当前最小数大,则比较下一个两位数。如果小于,则用该两位数代替当前的最小数。如果等于,则继续比较各位的AS

26、CII码的大小。出现错误的时候调用SHOW子程序,提示输入的错误类型。正确输入的时候,输出了最小数为014:一下是四种输入错误的截图:六、实验总结通过本次实验,我掌握了ASCII码和十进制数之间的转换;熟悉了子程序的编写及调用。子程序大大缩短了代码的长度和冗余度,不仅更加美观,也使逻辑更加清晰。同时输入检错这一部分让我感受到了逻辑思考严密的重要性,一不小心就会出错,做实验严谨的态度显得非常重要。再者就是理解键盘输入进的是ASCII码,而比较的时候可以分成十位,个位分别比较,需要先减去30H。而输出的时候需要再把30H加上,分十位和个位输出才是对的。硬件编程和软件编程的差别在本次实验里更加体现出

27、来了,如果光用软件编程的思想去控制硬件编程会出现很多奇怪的错误。像开始的时候,我就没有想到在硬件程序里比较两个数可以十位个位分开比较,而是把ASCII转换成十进制比较,再转回来输出,这样很麻烦,而且容易出错。所以联系硬件实际情况和计算器内部运行原理来想编程的思路,才是硬件编程正确的方向。实验四 子程序设计一.实验目的: 1.进一步掌握子程序设计方法; 2.进一步掌握基本的 DOS 功能调用.二.实验内容: 1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入. 2.统计检查每个学生的名次. 3.将统计结果在屏幕上显示.4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.

28、输出应便于阅读.尽可能考虑美观. 5.输入要有检错手段.三.预习题: 1.如何确定一个学生在这门科目中的名次?答:有如下两种思路:(1)抽取每个学生的成绩和其他所有学生的成绩进行比较,然后统计比其分数高的学生,得出该学生的名次;(2)冒泡法,将学生根据输入的成绩进行一次排序,成绩高的交换到前面,成绩低的交换到后面,此时学生的次序即为学生的名次。 2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?答:冒泡法。每次比较相邻的两个数据,大的放在前面,这样一轮以后,最小值就移到了数据表的末尾,再次冒泡以此类推。其实这里的“冒泡排序”是倒着的冒泡排序,因为结果是将最高分排到了开头但是基

29、本思想是一致的。3.准备好模块层次图. 4.给出输出显示的形式. 答:名次 学号 成绩四、程序设计流程图五、程序源代码及解释PRINT MACRO X ;打印字符的宏 PUSH DX MOV DL,X MOV AH,2 INT 21H POP DXENDM;回车空格子程序ENTER MACRO MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21HENDMDATA SEGMENTBUFFER DB 100 DB ? DB 100 DUP (?)STR1 DB Please input the score of the studen

30、ts:,0DH,0AH,$STR2 DB Error,please input the score again:,0DH,0AH,$VAR1 DW ?VAR2 DW ? CK DB ? TAB DB 100 DUP(?)DATA ENDSSTACK SEGMENT STACK stack DB 100 DUP (?)STACK ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTA PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA DX,STR1 MOV AH,09H ;显示

31、字符串,输出提示输入 INT 21HINPUT:LEA DX,BUFFER ;10号功能调用,输入字符串 MOV AH,0AH INT 21H LEA DI,TAB XOR CX,CX MOV AH,30H ;赋学号第一位的AscII码 MOV DH,31H LEA BX,BUFFER+2 CALL CHECK CMP CK,1 ;若CK=1,则数据不合格 JZ INPUT CALL SORT ENTER CALL DISPY RETSTA ENDP;检验输入是否合法的子程序CHECK PROCNEXT1: MOV CK,0 MOV DI,AH ;将学号第一位的AscII码存入指定内存区域 I

32、NC DI MOV DI,DH ;将学号第二位的AscII码存入指定内存区域 INC DI CMP DH,39H JZ L1 INC DH JMP L2 L1: MOV DH,30H INC AH L2: MOV AL,BX ;检查分数的AscII码 CMP AL,30H ;若小于30h,则报错 JB ERROR CMP AL,39H ;若大于39h,则报错 JA ERROR MOV DI,AL ;若正确,则存储 INC DI INC BX MOV AL,BX CMP AL,30H ;检查第二位的AscII码 JB ERROR CMP AL,39H JA ERROR MOV DI,AL ;若正

33、确,则存储 INC DI INC BX INC CX MOV AL,BX ;判断是否为回车符 CMP AL,0DH JZ FINISH1 ;是回车,则转入冒泡排序 INC BX ;不是,则bx+1后继续检查 JMP NEXT1ERROR:LEA DX,STR2 ;报错 MOV AH,9 INT 21H MOV CK,1FINISH1: RETCHECK ENDP;排序子程序SORT PROC COMP1: PUSH CX ;先通过运算得到两个需要的常量 MOV VAR1,CX SHL CX,1 SHL CX,1 SUB CX,4 MOV VAR2,CX POP CX DEC DI DEC DI

34、 ;di指向最后一个分数的十位的AscII码 JMP COTICOMP2: ADD DI,VAR2 ;比较完一轮后,使di指向最后一个分数的十位的AscII码COTI: MOV BL,0 ;建立标志 MOV CX,VAR1 DEC CX ;此时cx为比较次数AGAN: MOV AL,DI CMP AL,DI-4 JA GOON1 ;大于,则交换 JB GOON3 INC DI MOV AL,DI CMP AL,DI-4 PUSHF DEC DI POPF JA GOON1 JBE GOON3GOON1:MOV BL,-1 ;若要交换,修改标志 PUSH CX MOV CX,4 DEC DI D

35、EC DI ;使DI指向该分数对应的学号的第一位的AscII码GOON2:MOV AL,DI ;交换 XCHG AL,DI-4 MOV DI,AL INC DI LOOP GOON2 POP CX DEC DI DEC DI ;修改DI,使DI指向高地址分数的十位的AscII码GOON3:DEC DI DEC DI DEC DI DEC DI ;使DI指向高地址分数的十位,以便进行下次比较 LOOP AGAN CMP BL,0 ;若标志没被修改,则排序完成 JNZ COMP2 DEC DI DEC DI ;修改DI,使DI指向最高分对应的学号 MOV CX,VAR1 ;CX为显示次数 MOV

36、BH,30H ;赋名次十位的AscII码 MOV BL,31H ;赋名次个位的AscII码 RETSORT ENDP;显示子程序DISPY PROCDISPY1: PRINT BH ;先输出名次 PRINT BL PRINT PRINT DI ;再输出学号 INC DI PRINT DI INC DI PRINT PRINT DI ;输出分数 INC DI PRINT DI INC DI MOV DL,0DH ;回车并换行,准备下一轮输出 ENTER CMP BL,39H ;若标号超过9,跳到L3,置回0 JZ L3 INC BL JMP NEXT2L3: MOV BL,30H INC BHN

37、EXT2: LOOP DISPY1 RETDISPY ENDPCODE ENDS END STA整个程序有一个主程序,为FAR类型的STA PROC,在STA中通过调用DOS功能输入学号按升序排列的由01开始的若干学生的成绩,然后调用CHECK PROC,检查输入格式以及字符是否合法,检查通过之后,调用整个程序中最为核心的SORT PROC,即冒泡排序法子程序对输入的成绩进行冒泡排序,最后通过调用DISPLAY PROC按规定格式输出排名的结果(包括名次,学号,成绩)。冒泡排序的思想在数据结构总已经学过,基本思路为:对尚未排序的各元素从头到尾依次比较相邻的两个元素是否逆序(与欲排顺序相反),若

38、逆序就交换这两元素,经过第一轮比较排序后便可把最大(或最小)的元素排好,然后再用同样的方法把剩下的元素逐个进行比较,就得到了你所要的顺序。可以看出如果有 n 个元素,那么一共要进行 n-1 轮比较,第 i 轮要进行 j=n-i 次比较。如上图所示,输入的学号为01的学生分数为23,学号为02的学生成绩为12,学号为03的学生成绩为99,学号为04的学生成绩为43。经过排序之后可得第一名为学号为03的同学,成绩对应为99,依次类推。输出格式为:第几名,学号,成绩六、实验总结这次实验的难度比较大,我在冒泡排序这个子程序上花了很多时间。汇编程序的寄存器是有限的,必须进行合理的规划,需要复用时必须把寄

39、存器原来的数据保存起来。实验使用宏与子程序相结合的方式,精简了代码,也使思路更加清晰。程序设计的一个技巧是使用一个变量作为标志,当检测该变量为1时程序跳出循环继续执行,该变量为0时继续循环。这个技巧可以简化程序,避免过多的jump和进入死循环。实验五 中断程序设计一.实验目的: 1.初步掌握中断程序的设计方法: 2.初步掌握修改 DOS 系统中断,以适应实际使用的方法.二.实验内容: 1.编写一个 32 位二进制数除以 16 位二进制数的除法程序.观察当除数为 0,或 超过相应寄存器范围时,程序执行的结果. 2.修改零号中断服务程序,使它具有以下功能: (1)判断除数是否为 0,当除数为 0

40、时,显示相应的结果; (2)当除数不为 0 时,采用适当的方法完成商超过 16 位的二进制数的除法运算. 3.注意必须保护原有中断服务程序的入口地址,并在程序完毕前加以恢复.三.预习题: 1.如何保护原有中断向量表中的中断服务程序的入口地址?答:先使用35号功能读中断表,此时ES为原中断程序段地址,BX为原中断偏移地址。再把原来的中断地址分别储存起来,关闭中断。程序结束前将原中断地址传回去,恢复原中断 2.如何将你的中断服务程序入口地址置入中断向量表? 答:使用25号功能,将新中断程序入口的偏移地址和段地址分别写入DX和DS,开启中断。也可以用直接写入法将中断服务程序入口地址的IP写入n*4的

41、位置,CS写入n*4+2的位置。具体如下:PUSHDS;DS要作为入口参数,因此先入栈保护 MOVAX,SEGINT00;中断服务程序入口的段地址给AX MOVDS,AX;中断服务程序入口的段地址给DS LEADX,INT00;中断服务程序入口的偏移地址给DX MOVAL,0;中断类型号为0 MOVAH,25H;25号功能调用,写中断向量表 INT21H POPDS;DS出栈,恢复原来的值四.选作题: 1.用二进制将结果在屏幕上显示. 2.从键盘输入二进制数.五、程序设计流程图六、程序源代码及解释:DATA SEGMENTSTR01 DB PLEASE INPUT A BINARY DIVID

42、ENT,AT MOST 32 DIGITED!,0DH,0AH,$STR02 DB 0DH,0AH,PLEASE INPUT A BINARY DIVISOR,AT MOST 16 DIGITED!,0DH,0AH,$STR0 DB 0DH,0AH,ILLEGAL INPUT,PLEASE INPUT AGAIN!,0DH,0AH,$STR1 DB 0DH,0AH,DIVISOR SHOULD NOT BE 0!$STR3 DB 0DH,0AH,QUOTIENT:$STR4 DB 0DH,0AH,RESIDUAL:$DIVIDENT_H DW 0DIVIDENT_L DW 0DIVISOR D

43、W 0QUOTIENT DW 2 DUP(0)RESIDUAL DW 0KEEPIP DW 0KEEPCS DW 0DATA ENDSSTACK SEGMENT STACK STACK DB 100 DUP(?)STACK ENDSCODE SEGMENT PARA CODE ASSUME CS:CODE,SS:STACK,DS:DATA,ES:DATASTA PROC FAR PUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV ES,AXMOV AX,3500H ;读中断向量表INT 21HMOV KEEPIP,BX ;保存中断入口地址MOV KEE

44、PCS,ESCLI ;关中断PUSH DS ;中断程序装载MOV AX,SEG MYOVFLMOV DS,AXMOV DX,OFFSET MYOVFLMOV AX,2500HINT 21HPOP DSSTI ;开中断CALL INPUT MOV AX,DIVIDENT_L ;被除数低位MOV DX,DIVIDENT_H ;被除数高位MOV BX,DIVISOR ;除数 CMP BX,0 ;除数为零,报错,结束JNZ NEXTLEA DX,STR1MOV AH,9INT 21HJMP DONE NEXT:DIV BXMOV QUOTIENT,AXMOV RESIDUAL,DX RTADDR:CA

45、LL OUTPUT;返回后输出商和余数 DONE:CLI;恢复原中断向量PUSH DSMOV DX,KEEPIPMOV AX,KEEPCSMOV DS,AXMOV AX,2500H INT 21HPOP DSSTIRET MYOVFL:POP CX;中断服务程序LEA CX,RTADDRPUSH CXPUSH AXMOV AX,DXMOV DX,0DIV BXMOV QUOTIENT+2,AXPOP AXDIV BXMOV QUOTIENT,AXMOV RESIDUAL,DXSTIIRETSTA ENDPCHECK PROC;输入检错,标志为BLCMP AL,0 ;只能输入二进制码JL FALSECMP AL,1JG FALSEMOV BL,1JMP EXITFALSE:MOV BL,0 EXIT:RE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论