1、信息与通信工程学院微机原理软件实验报告班 级: 姓 名: 班内序号: 学 号: 日 期: 年 11 月 实验二 分支,循环程序设计一.实验目的:1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计 ;3.掌握最简单的 DOS 功能调用 .二.实验内容:1.安排一个数据区,内存有若干个正数 ,负数和零.每类数的个数都不超过 9.2.编写一个程序统计数据区中正数, 负数和零的个数.3.将统计结果在屏幕上显示.三.预习题:1.十进制数 0 - 9 所对应的 ASCII 码是什么? 如何将十进制数 0 - 9 在屏幕上显示出来?答:十进制数 0-9 对应的 ASCII 码的 30H39H。
2、将十进制数 09 显示在屏幕上,要用二进制数 09 后面分别加上 30H。2.如何检验一个数为正,为负或为零 ? 你能举出多少种不同的方法?答:可以将这个数跟零进行比较,利用指令 CMP 和 JZ 等进行判定;或者对该有符号数的第一位进行判定,判断是不是一,若为 1,则是负数,反之再判定是 0 还是正数。四.选作题:统计出正奇数,正偶数,负奇数,负偶数以及零的个数.五实验过程1.流程图开始定义各段并初始化获取数据长度工作指针指向当前数字2.源代码和 0 相比大于0 等于0小于0除以 2 0 个数加一 除以 2判定余数正奇数加 1不为0为0正偶数加 1判余数不为0负奇数加 1 负偶数加 1为0统
3、计结果输出结果结束DATA SEGMENTBUFF DW 11,12,0,-59,85,78,15,0,-78,0,74,-45,47,0,12,-79 ;自定义需要判定的一组数字COUNT EQU $-BUFF ;得到数据长度PLUSO DB 0PLUSJ DB 0ZERO DB 0MINUSO DB 0MINUSJ DB 0 ;分别用来存几种要求的数字STRING1 DB PLUSO,PLUSJ,ZERO,MINUSO,MINUSJ: ,$STRING DB 0, ,0, ,0, ,0, ,0, ,$ ;用来显示结果的字符串DATA ENDSSTACK SEGMENT STACK STAC
4、K ;定义堆栈段DB 100 DUP(0) STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKBEGIN PROC FARPUSH DSXOR AX,AXPUSH AX ;保证返回 DOSMOV AX ,DATAMOV DS,AXMOV CX,COUNTSHR CX,1 ;相当于对 CX 中的数除以 2LEA BX,BUFF ;得到 BUFF 的偏移地址AGAIN: CMP WORD PTR BX,0 ;将工作指针中的数与零进行比较JGE PLUJMP MINUSPLU: JZ ZER ;判定为 0MOV AX,WORD
5、PTR BXMOV DL,2DIV DL ;将结果除以 2CMP AH,0JNZ PLUJINC PLUSO ;正偶数加一JMP NEXTPLUJ: INC PLUSJ ;正奇数加一JMP NEXTMINUS: MOV AX,WORD PTR BXMOV DL,2IDIV DLCMP AH,0JNZ MINJINC MINUSO ;负偶数加一JMP NEXTMINJ: INC MINUSJ ;负奇数加一JMP NEXT ZER: INC ZERO ;0 加一NEXT: INC BXINC BX ;工作指针加 2LOOP AGAINMOV BL,PLUSOADD BL,30H ;将统计的数字加上
6、 30h 变为 ASCii 码MOV PLUSO,BLMOV BL,PLUSJADD BL,30H MOV PLUSJ,BLMOV BL,ZEROADD BL,30HMOV ZERO,BLMOV BL,MINUSOADD BL,30HMOV MINUSO,BLMOV BL,MINUSJADD BL,30HMOV MINUSJ,BLLEA BX,STRING ;将每个变量统一加到字符串对应位置MOV CL,PLUSOMOV BX,CLMOV CL,PLUSJMOV BX+2,CLMOV CL,ZEROMOV BX+4,CLMOV CL,MINUSOMOV BX+6,CLMOV CL,MINUSJ
7、MOV BX+8,CLMOV AH,09H ;打印字符串MOV DX,SEG STRING1MOV DS,DXMOV DX,OFFSET STRING1INT 21HMOV AH,09H ;打印结果MOV DX,SEG STRINGMOV DS,DXMOV DX,OFFSET STRINGINT 21HRETBEGIN ENDPCODE ENDSEND BEGIN3.实验结果分析实验区待统计的数为:11,12,0,-59,85,78,15,0,-78,0,74,-45,47,0,12,-79经过上述代码的编译链接执行后可以得到的结果如下图所示:经过手动检查发现符合实验的预期结果,则可验证实验的
8、正确性。六实验总结这道题实则是比较基础简单的一道,其核心在于循环结构和对数字判定的比较方法。对于刚开始编写汇编语言的我而言,还是遇到了不小的挑战。由于汇编语言它不同于 C+的许多复杂特点,确实在刚开始的时候有点无从下手,但是经过反复地读书以及资料的查阅后基本掌握了基本的分支、循环程序的编写,数字的显示等基本功能,即掌握了最简单的 DOS 功能调用,还是感到很开心而且受益匪浅。实验三 代码转换程序设计一.实验目的:1.掌握几种最基本的代码转换方法;2.运用子程序进行程序设计.二.实验内容:1.从键盘上输入若干两位十进制数, 寻找其中的最小值,然后在屏幕上显示出来.2.两个十进制数之间的分隔符,
9、输入结束标志自定,但要在报告中说明 .3.对输入要有检错措施, 以防止非法字符输入,并有适当的提示 .4.将整个程序分解为若干模块, 分别用子程序实现.在报告中要给出模块层次图.三.预习题:1.如何将输入的两个字符(0 - 9)变为十进制或二进制数?答:输入的 09 的字符为 ASCII 码,只需要将他们减去 30H 即可得到所需的机器数。2.如何将选出的最小值(二进制或十进制)变为 ASCII 码再进行显示?答:跟上一个问题类似,再输出时需要将选出的最小值变为 ASCII 码,方法很简单,即将数字加上 30H 即可。3.你觉得采用二进制运算还是十进制运算更适合于这个实验?答:采用二进制或者十
10、进制都需要进行 ASCII 码到数字的转换和其反向转换,相比之下十进制的变换更方便,但换用新的思路可以大大简化编程负担。即直接使用数字对应的ASCII 比较,分别比较十位和个位,最后直接输出字符即可。四实验过程1.流程图开始定义数据堆栈初始化最小值十位输入是否空格 是否是否回车是否输入合法否是输出结果结束与 BH 比较大于等于小于个位输入 个位输入 更新 BH与 BL 比较小于更新 BL个位输入更新 BL大于2.源代码JUDGE MACRO ;用来判定输入数据合不合法的宏CMP AL,0JB WRONGCMP AL,9JA WRONGENDMXIANSHI MACRO X,Y ;打印两位数 X
11、Y 的宏MOV AH,02HMOV DL,XINT 21HMOV AH,02HMOV DL,YINT 21HENDMINPUT MACRO ;输入单个数据的宏MOV AH,01HINT 21HENDMDATA SEGMENT ;定义数据段STRING DB THE MIN NUMBER IS: ,$ ;用于说明的字符串STRING1 DB INPUT IS NOT OK! ,0DH,0AH,$STRING2 DB PLEASE INPUT NUMBER: ,0DH,0AH,$STRING3 DB PLEASE INPUT AGAIN.,0DH,0AH,$DATA ENDSSTACK SEGME
12、NT STACK ;定义堆栈段DB 100 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV DX,DATAMOV DS,DXMOV BH,9 ;用来存最小值的寄存器,并初始化为最大的二位数 99MOV BL,9MOV AH,09HMOV DX,SEG STRING2MOV DS,DXMOV DX,OFFSET STRING2INT 21HSHURU:INPUT ;开始输入数据CMP AL,20H ;将输入的第一个数与空格进行比较JZ SHURU ;是空格则继续进行输入CMP AL,0DH ;将输入的数据与
13、回车进行比较,若输入回车则输入结束JZ EXITJUDGE ;判定数据是否合法 CALL SHIBIWRONG:CALL NOTOK ;输入不合法,报警且再次输入数据JMP SHURUEXIT:XIANSHI 0DH,0AH ;输入结束,打印出最小值的结果MOV AH,09HMOV DX,SEG STRINGMOV DS,DXMOV DX,OFFSET STRINGINT 21HXIANSHI BH,BLJMP ENDDOSENDDOS:MOV AX,4C00H ;返回 DOSINT 21HNOTOK PROC ;打印输出数据不合法并且返回 SHURU 进行重新输入的子程序MOV AH,09H
14、 MOV DX,SEG STRING1MOV DS,DXMOV DX,OFFSET STRING1INT 21H MOV AH,09HMOV DX,SEG STRING3MOV DS,DXMOV DX,OFFSET STRING3INT 21HRETNOTOK ENDPSHIBI PROC ;比较部分子程序CMP AL,BH ;将输入的十位与 BH 中的十位进行比较JNA NEXT JIXU: INPUT ;比 BH 大,则说明输入不是最小数,继续输入JMP SHURUNEXT:JZ XIANG ;判断输入的十位与寄存器中的十位是否相等MOV BH,AL ;更新寄存器中的最小值INPUT JU
15、DGEMOV BL,ALJMP SHURUXIANG: INPUT ;再输入第二位进行比较,若更小JUDGECMP AL,BLJA SHURUMOV BL,AL ;更新寄存器中的最小值JMP SHURURETSHIBI ENDPCODE ENDSEND START3.模块层次图4.实验结果分析在我的程序设计中,以空格为数据的分隔符,以回车为结束符。输入回车后会在屏幕上打印最小值的结果。在输入中如果输入的数据不恰当,会有提示说明输入不合法,并且支持再次输入,其结果图如下。说明:空格分隔符,回车为输入完毕确认,当输入不合法字符使,提示输出不正确,并可以继续输入,跟之前输入的数据进行比较。经过观察后
16、发现,结果完全正确,说明了程序的正确性。五实验总结这次实验学习并运用了子程序进行程序设计。子程序设计的最重要的地方在于入口参主程序输入模块比较模块输出模块报错模块数、出口参数的设计与主程序之间的关系。还有子程序功能之前应该保护现场。本实验主要将子程序设计在从键盘输入数字的功能,并设置标志,用于主程序确认输入是否正确。我在这次实验中由于刚开始写时对子程序的设计理解还不够到位因此遇到了不少困难,主要在于对子程序的调用位置以及怎样从一连串数据输入中找到最小数。后来查阅了不少资料后意识到了只需要在寄存器中存一个最小值,并初始化为最大值 99,然后再输入时反复将寄存器中的值与输入的值进行比较即可并更新寄
17、存器中的数据即可,最后在利用 09H中断打印出来就可完成这一实验。总而言之,这个实验看似简单但是却是很多汇编编程的基础,学会了子程序的编写和调用对今后的编程大有裨益。实验四 子程序设计一.实验目的:1.进一步掌握子程序设计方法;2.进一步掌握基本的 DOS 功能调用.二.实验内容:1.从键盘上输入某班学生的某科目成绩. 输入按学生的学号由小到大的顺序输入.2.统计检查每个学生的名次.3.将统计结果在屏幕上显示.4.为便于观察,输入学生数目不宜太多 ,以不超过一屏为宜 .输出应便于阅读. 尽可能考虑美观.5.输入要有检错手段.三.预习题:1.如何确定一个学生在这门科目中的名次?答:其实确定学生在
18、该科目中的名次方法有很多,基本的思路是用一个足够的变量区域存下输入的学生数据信息,然后在对这些数据进行比较。比较的方法很多,最容易想到的有冒泡排序等,然后最方便的是在记下同学的学号后,依此找出成绩的最大值,往复进行,也可起到排名的作用。我在这里用到的是与上一个实验类似的思路,每一次寻找成绩中的最小值,再将他的学号和成绩依此压入栈,最后输出时再依此出栈,正好起到了排名的作用。2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?答:在汇编语言中使用排序的各种方法其实都很不方便,因为在汇编语言中使用循环是很复杂的,因此沿用上一个实验是最简单好用的方法,每次依此寻找成绩的最小值,并将学
19、号和成绩一起压入栈,最后依次出栈可以实现成绩由高到低排列。3.准备好模块层次图.4.给出输出显示的形式.答:根据输入的学生的 ID 和成绩,在输出时按照名次输出,并且显示他的名词序号和学号以及成绩。四实验过程1.流程图输入模块主程序 排序模块显示模块检错模块开始输入数据获取人数获取 ID 和成绩排序显示结果结束2.源代码ZHUAN MACRO X ;将数字转换为 ASCII 码的宏PUSH AXPUSH BXMOV AX,X ;得到该数的十位和个位MOV BL,10DIV BLADD AL,0 ;分别加上0的 ASCII 码ADD AH,0MOV BH,ALMOV BL,AHMOV X,BXP
20、OP BXPOP AXENDMXIAN MACRO X ;显示单个字符的宏MOV AH,02HMOV DL,XINT 21HENDMSTR MACRO STRING ;显示字符串的宏MOV AH,09HMOV DX,SEG STRINGMOV DS,DXMOV DX,OFFSET STRINGINT 21HENDMINPUT MACRO ;输入单个字符的宏MOV AH,01HINT 21HENDMDATA SEGMENT ;定义数据段BUFF DB 100 DUP(0) ;用来存入输入成绩的变量,足够大STRING1 DB 0DH, INPUT IS NOT OK!,$STRING2 DB t
21、he score of student,$STRING3 DB 100,$STRING4 DB No.,$STRING5 DB the rank of all is: ,$STRING6 DB student: ,$STRING7 DB score: ,$NUM DW 1 ;用来存入学生数量的变量NUM1 DW 1 ;循环中用来记录学生学号的变量RANK DW 1 ;表示排名的变量COUNT DB 0 ;计数成绩的位数COUNT1 DW 1DATA ENDSSTACK SEGMENT STACK ;定义堆栈段DB 300 DUP(0)STACK ENDSCODE SEGMENTASSUME D
22、S:DATA,CS:CODE,SS:STACK START:MOV DX,DATAMOV DS,DXLEA SI,BUFF ;将工作指针置于 BUFF 的偏移首地址;输入模块LOOP1: MOV BH,0 ;初始化 BXMOV BL,0STR STRING2 ;开始输入数据MOV CX,NUM ;显示当前学号ZHUAN CX XIAN CHXIAN CLXIAN :L3:INPUTCMP AL,0DH ;判断是否为回车,是回车时结束输入并且将结果显示出来JZ EXITCMP AL,20H ;判断输入是否为空格,如果是空格则结束该名同学的成绩输入JNZ L1L2:INC NUM ;输入结束,并且
23、 NUM 加一CMP COUNT,1JZ Y1MOV SI,BH ;在变量中对应位置按学号依此存入学生成绩MOV SI+1,BLJMP Y2Y1:MOV BYTE PTRSI,0MOV SI+1,BHY2:INC SI ;修改工作指针INC SIMOV COUNT,0XIAN 0DHXIAN 0AHJMP LOOP1L1:CALL JUDGECMP DL,0JNZ LOOP1 ;继续输入INC COUNTCMP COUNT,1JNZ CNT2MOV BH,AL ; 修改 BH 中的十位数JMP L3CNT2: CMP COUNT,2 ;第二位JNZ CNT3MOV BL,AL ;修改 BL 中
24、的个位数JMP L3 CNT3:MOV BH,40H ;三位数MOV BL ,40HJMP L2CALL PAIXU ;输入完成后对成绩进行排序;显示模块WANLE:XIAN 0DHSTR STRING5XIAN 0DHXIAN 0AHAGAIN:MOV CX,NUM1 ;将学生数量作为循环次数CMP CX,0JNZ GOONENDDOS:MOV AX,4C00H ;返回 DOSINT 21HGOON:STR STRING4MOV CX,COUNT1 ;显示当前是第几名ZHUAN CXXIAN CHXIAN CLXIAN :POP CX ;将第 N 名学号出栈STR STRING6XIAN C
25、H ;显示他的学号XIAN CLXIAN STR STRING6POP CX ;将第 N 名的成绩出栈STR STRING7CMP CH,40H ;判断是否为满分的情况JZ FULXIAN CH ;显示他的成绩XIAN CLLINE:XIAN 0DHXIAN 0AHDEC NUM1INC COUNT1 ;进行下一趟循环JMP AGAINFUL:STR STRING3 ;直接显示 100 分JMP LINEJUDGE PROCMOV DL,0CMP AL,0JNB NEXT1W1:STR STRING1MOV DL,1JMP OVNEXT1:CMP AL,9JA W1OV:RETJUDGE EN
26、DP PAIXU PROC;排序模块EXIT: DEC NUM ;将学生人数减一MOV AX,NUMMOV NUM1,AXLEA SI,BUFFMOV BH,40HMOV BL,40HMOV DX,NUMLOOP2:CMP NUM,0JZ WANLELOOP3:MOV CL,SICMP CL,?JZ NEXTCMP CL,BHJA NEXT ;大于等于 BH 中的十位数 JB I ;小于MOV CL,SI+1CMP CL,BLJA NEXTI:MOV BH,SI ;修改 BX 中储存的最小值MOV BL,SI+1MOV DI,SINEXT:INC SI ;工作指针加 2INC SIDEC DX
27、 ;学生人数减一,进行下一趟的比较CMP DX,0JNZ LOOP3PUSH BX ;将 BX 中储存的成绩最小值压入栈LEA SI,BUFFPUSH CX ;保护现场,将 CX 压入栈MOV CX,DISUB DI,SI ;将 DI 定位的地址与 SI 相减MOV AX,DIMOV BL,2 ;载将相减后的地址除以 2DIV BLMOV DI,CX ;还原 DIPOP CXMOV RANK,AX ;上面运算后 AX 中存的数即为当前排名学生的学号INC RANKZHUAN RANKPUSH RANK ;将学号压入堆栈MOV BYTE PTRDI,? ;将 DI 所指找出最小值的位置设成跳过符
28、号?MOV BYTE PTRDI+1,?DEC NUM ;下一趟MOV DX,NUM1MOV BH,40H ;重置 BX 中的最小值MOV BL,40HJMP LOOP2RETPAIXU ENDPCODE ENDSEND START3.实验结果分析该实验要求按学号依此输入学生成绩,然后对其排名后输出结果显示。我的程序中,用空格来表征该同学成绩录入完毕,用回车来表示所有同学输入结束,最后依名次由前到后显示同学的学号和成绩。结果图如下:经过观察后发现,其结果正确,说明了程序的正确性。五实验总结在这个实验中,我进一步掌握了子程序的设计方法,以及中断,宏等汇编语言的特殊功能的使用。经过一番挫折的尝试后
29、,最终实现了成绩的录入以及排名,能够在屏幕上完美显示学生的成绩情况。在我的程序中,可以允许输入三位数成绩,这里很巧妙,我用一个 40H40H 的 ASCII 码来替代 100 分,在输出时,如果是这种情况则在屏幕上直接打印结果 100 分。我在排名时想到了沿用上一个实验的思路,因此采用了依此寻找最小值的方法,并将它们压入堆栈,在出栈时刚好对应了成绩的由大到小排列,是我程序中排名部分的核心。当然,我也完成了接错功能,再输入时如果为错误字符,则有提示信息,并且可以支持重新输入。总之,通过这个实验,我受益匪浅,对汇编语言的综合编写有了更深一步的认识,也加深了对编程的兴趣。实验五 中断程序设计一.实验
30、目的:1.初步掌握中断程序的设计方法:2.初步掌握修改 DOS 系统中断,以适应实际使用的方法.二.实验内容:1.编写一个 32 位二进制数除以 16 位二进制数的除法程序.观察当除数为 0,或超过相应寄存器范围时,程序执行的结果.2.修改零号中断服务程序,使它具有以下功能 :(1)判断除数是否为 0,当除数为 0 时,显示相应的结果;(2)当除数不为 0 时,采用适当的方法完成商超过 16 位的二进制数的除法运算.3.注意必须保护原有中断服务程序的入口地址, 并在程序完毕前加以恢复.三.预习题:1.如何保护原有中断向量表中的中断服务程序的入口地址?答:保护原有中断向量表的中断服务程序入口地址
31、需要将原来的地址压入堆栈,具体代码如下:MOV AL,0MOV AH,35H ;保存原中断向量表 0 号中断的入口地址INT 21HPUSH ESPUSH BX2.如何将你的中断服务程序入口地址置入中断向量表?答:其方法如下:PUSH DS ;写入新的 0 号中断的入口地址MOV AX,SEG INT00MOV DS,AXMOV DX,OFFSET INT00MOV AL,0MOV AH,25HINT 21HPOP DS四.选作题:1.用二进制将结果在屏幕上显示.2.从键盘输入二进制数. /该题目未完成五实验过程1.流程图开始初始化,修改中断做除法符合中断?2.源代码STR MACRO STR
32、ING ;显示字符串的宏块PUSH DX ;保护现场PUSH DSMOV AH,09H ;打印MOV DX,SEG STRINGMOV DS,DXMOV DX, OFFSET STRINGINT 21HPOP DSPOP DXENDMXIAN MACRO X ;打印单个字符的宏MOV AH,02HMOV DL,XINT 21HENDMDATA SEGMENT ;定义数据段CUOMSG DB DIVIDE OVERFLOW.DIVISOR EQUALS 0,0DH,0AH,$ ;除数为 0报错STRING1 DB THE FORMULA IS 10002000H /0 ,0DH,0AH,$ ;写
33、出现在的式子STRING2 DB THE FORMULA IS 10002000H/2 ,0DH,0AH,$STRING3 DB THE QUOTIENT IS : ,$STRING4 DB THE REMAINDER IS : ,$ 是输出结果恢复原中断结束SHANGGAO DW 0 ;存商的高 16 位SHANGDI DW 0 ;存商的低 16 位BEICHUGAO DW 0BEICHUDI DW 0CHUSHU DW 0YUSHU DW 0COUNT DB 1 DATA ENDSSTACK SEGMENT STACK STACK ;定义堆栈段DB 100 DUP(0)STACK ENDS
34、 CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FAR ;保证返回 DOSPUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXSTI ;中断允许标识符MOV AL,0MOV AH,35H ;保存原中断向量表 0 号中断的入口地址INT 21HPUSH ESPUSH BXPUSH DS ;写入新的 0 号中断的入口地址MOV AX,SEG INT00MOV DS,AXMOV DX,OFFSET INT00MOV AL,0MOV AH,25HINT 21HPOP DSSTR STRING1CHU1: M
35、OV AX,2000H ;作一个除数为 0 的除法 MOV DX,1000HMOV BX,0DIV BXSTR STRING2 CHU2: MOV AX,2000H ;做一个商超过 16 位的除法 MOV DX,1000HMOV BX,2DIV BXCALL SHUCHU ;将结果用二进制打印POP DX ;恢复原中断向量表POP CXPUSH DSMOV DS,CXMOV AX,2500HINT 21HPOP DSRETSTART ENDPINT00 PROC FAR ;新的 0 号中断子程序POP CX ;需要往后移动ADD CX,2PUSH CXCMP BX,0JNE NEXTSTR C
36、UOMSG ;显示除数为错误的 0JMP FINISHNEXT:MOV CX,AX ;将被除数的低 16 位保存MOV AX,DX ;将被除数的高 16 位移到低 16 位MOV DX,0DIV BXMOV SHANGGAO,AX ;得到高 16 位商MOV AX,CXDIV BXMOV SHANGDI,AX ;得到商的低 16 位MOV YUSHU,DX ;得到余数FINISH: IRETINT00 ENDPSHUCHU PROC ;输出模块STR STRING3MOV BX,16 ;对商的高 16 位进行输出L1: MOV AX,SHANGGAO CMP BX,0JZ DIWEIMOV C
37、X,BXSUB CX,1CMP CX,0JZ JIXU2YOUYI:SHR AX,1 ;从最高位开始移位LOOP YOUYIJIXU2: AND AX,1 ;得到这一位的值ADD AX,30H ;将它转换为 ASCII 码XIAN ALDEC BX ;BX 减一进行循环JMP L1DIWEI:MOV BX,16 ;对商的低 16 位进行输出L2: MOV AX,SHANGDI CMP BX,0JZ CHUSMOV CX,BXSUB CX,1CMP CX,0JZ JIXU1YOUYI1:SHR AX,1LOOP YOUYI1JIXU1: AND AX,1ADD AX,30HXIAN ALDEC
38、BXJMP L2 CHUS:XIAN 0DH ;对余数进行输出XIAN 0AHSTR STRING4MOV BX,16L3: MOV AX,YUSHU CMP BX,0JZ EXITMOV CX,BXSUB CX,1CMP CX,0JZ JIXUYOUYI2:SHR AX,1LOOP YOUYI2JIXU: AND AX,1ADD AX,30H; PUSH DXXIAN AL; POP DXDEC BXJMP L3 EXIT: RETSHUCHU ENDP CODE ENDSEND START3.实验结果分析我的实验程序对完成了对 0 号中断的修改。在程序中我举出了除数为 0 和商超出 16 位的两种情况,0 的情况下系统报错,超出的情况下用一定的方法得到了它的解,并进行了二进制显示,最后恢复了原来的 0 号中断地址。其结果图如下:六实验总结该提高实验给我制造了不少麻烦,由于在编写初期还没有学习到第八章中断,因此无论是从理解还是编程都感觉寸步难行。后来经过自学第八章以及思考,明白了中断的具体含义,以及修改中断向量表入口地址的方法,最后编写程序实现了问题。经过该实验,我理解到中断对于 CPU 的重要意义,必然将对今后的学习产生深远的意义。但是我也还有很多的疑问,在今后的学习中将会好好去研究。