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

下载本文档

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

文档简介

1、第第 信息与通信工程学院微机原理软件实验报告班级: 姓名: 学号: 日期:2023年11月实验B 分支、循环程序设计一、实验目的开始独立进行汇编语言程序设计;掌握根本分支,循环程序设计;掌握最简单的 DOS 功能调用。二、实验内容安排一个数据区,内存有假设干个正数,负数和零。每类数的个数都不超过 9。编写一个程序统计数据区中正数,负数和零的个数。将统计结果在屏幕上显示。选作题统计出正奇数、正偶数,负奇数、负偶数以及零的个数。三、预习思考十进制数 0 9 所对应的 ASCII 码是什么? 如何将十进制数 0 9 在屏幕上显示出来?09分别对应ASCII码的30H39H;由于数字09的ASCII码

2、值与其代表的数值之间相差30H,因此将其减去30H即可得到以非压缩型BCD数形式表示的十进制数。如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?一是直接用CMP命令和0比较(CMP X,0 ),然后检验标志位CF,CF=1那么X为负数,CF=0接着检验ZF,ZF=1那么X为零,ZF=0那么X为正数;二是使用逻辑或移位运算,和0相比是否相等,用数和10000000相与,取出符号位判断,可区分正负。四、实验过程流程图源代码data segmentarray db 1,4,3,2,5,7,-1,-2,-6,0,0,0;自定义数组length EQU $-array ;数组长度pnum d

3、b ? ;正数个数nnum db ? ;负数个数zero db ? ;零的个数peven db ? ;正偶数个数podd db ? ;正奇数个数neven db ? ;负偶数个数nodd db ? ;负奇数个数POSICHAR DB Positive: $;用于打印字符串定义NEGTCHAR DB Negtive: $ZEROCHAR DB Zero: $EVENCHAR DB Even: $ODDCHAR DB Odd: $CR DB 0DH,0AH,$; 回车换行的ASCII码data ends;code segmentassume cs:code,ds:datastart:mov ax,

4、datamov ds,axmov si,offset array ;offset指令取array的偏移地址dec si ;偏移地址先减1mov cl,length ;数组长度赋予CLxor al,allop:cmp cl,0 ;余下数组长度不为0,那么继续循环je print;cl为0跳出循环inc si;偏移地址加1,比较下一位数字dec cl;余下数组长度减1mov bl,si;采用存放器间接寻址方式cmp bl,0;和0比较jg posi;正数跳转jz zo;零跳转jl neg;负数跳转posi:inc pnum;正数个数加1test bx,01h;检测最后一位是否是0jz pep;是0

5、,即为偶数那么跳转至pepinc podd;不是0,那么正奇数个数加1jmp loppep:inc peven;正偶数个数加1jmp lopzo:inc zero;零的个数加1jmp lopneg:inc nnum;负数个数加1test bx,01h;检测最后一位是否是0jz nep;是0,即为偶数那么跳转至nepinc nodd;不是0,那么负奇数个数加1jmp lopnep:inc neven;正偶数个数加1jmp lopprint:mov ah,09h ;打印正数个数mov dx,offset POSICHARint 21h;系统功能调用mov ah,02hmov dl,pnumadd

6、dl,30hint 21hmov ah,09hmov dx,offset eventcharint 21hmov ah,02hmov dl,pevenadd dl,30hint 21hmov ah,09hmov dx,offset oddcharint 21hmov ah,02hmov dl,poddmov dl,30hint 21hmov dx,offset crmov ah,09hint 21h;mov ah,09h ;打印负数个数mov dx,offset negtcharint 21h;系统功能调用mov ah,02hmov dl,nnumadd dl,30hint 21hmov ah

7、,09hmov dx,offset eventcharint 21hmov ah,02hmov dl,nevenadd dl,30hint 21hmov ah,09hmov dx,offset oddcharint 21hmov ah,02hmov dl,noddmov dl,30hint 21hmov dx,offset crmov ah,09hint 21hmov ah,09hmov dx,offset zerocharint 21h;系统功能调用mov ah,02hmov dl,zeroadd dl,30hint 21hext:mov ax 4c00hint 21hcode endsen

8、d start实验分析数据区待统计的数据为:1,4,3,2,5,7,-1,-2,-6,0,0,0实验结果如以下图所示:理论知识积累EQU:等价语句,一般使用格式为 符号名 EQU 表达式 ,作用是左边的符号名代表右边的表达式,当把一个常量或表达式定义成一个具有一定含义的符号名后,在程序中就可以用该符号名来代表该常量或表达式。等价语言不会给符号名分配存储空间,符号名不能与其他符号同名,也不能被重新定义。test指令属于逻辑运算指令,功能是执行BIT与BIT之间的逻辑运算测试,tsst对两个参数目标,源执行AND逻辑操作,并根据结果设置标致存放器,结果本身不会保存两操作数与运算,仅修改标志位,不送

9、会结果。int 21H系统调用由DOS提供的一组实现特殊功能的子程序供程序员在编写自己的程序时调用,以减轻编程的工作量;调用的实现步骤大概是系统功能送到存放器AH中,入口参数送到指定存放器中,用int 21H指令执行功能调用,根据出口参数分析功能调用执行情况。字符显示的实现问题,首先把数据转换成ASCII码,然后调用DOS功能将其显示。要特别注意每段待输出的字符串都要以$结尾,不然无法识别串尾,输出乱码。实验C 代码转换程序设计一、实验目的掌握几种最根本的代码转换方法;运用子程序进行程序设计。二、实验内容从键盘上输入假设干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来。两个十进制数之间的

10、分隔符,输入结束标志自定,但要在报告中说明。对输入要有检错措施,以防止非法字符输入,并有适当的提示。将整个程序分解为假设干模块,分别用子程序实现。在报告中要给出模块层次图。三、预习思考如何将输入的两个字符(09)变为十进制或二进制数?答:输入的字符09是ASCII码表示的,对应于30H39H,通过减去30H,高位数乘以十加上低位数,即变为十进制数。如何将选出的最小值(二进制或十进制)变为 ASCII 码再进行显示?答:可以直接读入并存储数字的ASCII码,容易比较其大小,然后输出时商和余数分别加上30H后显示在屏幕上。你觉得采用二进制运算还是十进制运算更适合于这个实验?答:采用二进制或者十进制

11、都需要进行ASCII码到数字的转换和其反向转换。直接使用数字对应的ASCII比较,分别比较十位和个位,最后直接输出十进制字符即可。四、实验过程流程图模块层次图源代码DATA SEGMENTINPUT DB 100 DUP(?)MINTMP DB 9-30H,9-30H ; 最小值初始99COUNT DB 0DIFERROR DB 0D; 判断调用输入子程序是否有错WELCOME DB Please input numbers:,$OUTTIP DB Minimum is :,$CR DB 0DH,0AH,$; 回车换行 ERROR1 DB ERROR:Character is not vali

12、d!,$ ;错误输入提示 ERROR2 DB ERROR:Number must contains two digits!,$ ERROR3 DB ERROR:Number is empty!,$ ERROR4 DB ERROR:Need separate char!,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATAMAIN PROC FAR MOV AX,DATA MOV DS,AX MOV DX,OFFSET WELCOME CALL PRINT MOV DX,OFFSET CR; 回车换行 CALL PRINT CALL GETNUM; 获取输入

13、 CMP IFERROR,0; 判断输入过程是否有错 JNZ BACK; 错误那么直接返回DOS MOV DX,OFFSET CR; 回车换行 CALL PRINT CALL FINDMIN; 查找最小数 MOV DX,OFFSET OUTTIP; 输出提示 CALL PRINT MOV AH,02H MOV DL,MINTMP; 输出最小值的十位 ADD DL,30H INT 21H MOV AH,02H MOV DL,MINTMP1; 输出最小值的个位 ADD DL,30H INT 21H BACK: MOV AX,4C00H ; 返回DOS INT 21HMAIN ENDPGETNUM

14、PROC PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI MOV DI,0 ; 数组偏移地址 MOV CX,0 ; 标识数字的位数GETLOOP: MOV AH,01H ; 从键盘读取一个字符 INT 21H CMP AL,0DH ; 和回车比较 JE EXIT1 ; 是回车那么结束输入 CMP CX,0 ; 数字位数为空 JE CMPSPACE0 CMP CX,1 ; 数字位数为1 JE CMPSPACE1 CMP CX,2 ; 数字位数为2 JE CMPSPACE2CMPSPACE0: CMP AL,20H JE GETLOOP ; 位数为0,输入空格,忽略

15、 JMP ASCBIN ; 否那么读取字符CMPSPACE1: CMP AL,20H JE ERR2 ; 位数为1,输入空格,出错 JMP ASCBIN ; 否那么读取字符CMPSPACE2: CMP AL,20H JNE ERR4 ; 位数为2后,不输入空格,错误 XOR CX,CX ; 输入空格,清零重计 JMP GETLOOP ASCBIN: SUB AL,30H ; 化为二进制 JL ERR1 ; 小于,无效字符 CMP AL,9 JG ERR1 ; 大于9是无效字符 MOV INPUTDI,AL ; 保存 INC COUNT ; 统计输入的数字个数 INC DI ; 向后移动数组 I

16、NC CX JMP GETLOOPERR1: MOV IFERROR,1 MOV DX,OFFSET ERROR1 CALL PRINT JMP RETURNERR2: MOV IFERROR, MOV DX,OFFSET ERROR2 CALL PRINT JMP RETURN ERR3: MOV IFERROR,1 MOV DX,OFFSET ERROR3 CALL PRINT JMP RETURN ERR4: MOV IFERROR,1 MOV DX,OFFSET ERROR4 CALL PRINT JMP RETURN EXIT1: MOV BL,COUNT ; 判断输入数的个数是否为

17、零 CMP BL,0 JE ERR3 ;输入数目为0,输出错误,退出 AND BL,01H ; 判断数字是否为两位数 CMP BL,0 JNE ERR2 ;输入数字个数为奇数那么出错RETURN: POP D POP DX POP CX POP BX POP AX RETGETNUM ENDPPRINT PROC PUSH AX MOV AH,09H INT 21H POP AX RETPRINT ENDPFINDMIN PROC PUSH DI PUSH AX PUSH CX MOV DI,-2 ; 数组下标 MOV CL,COUNT ; 把数组长度移入CX MOV AL,CL CBW MO

18、V CX,AXLOP: ADD DI,2 CMP CX,DI ; 是否已经比较完毕 JE EXIT2 ; 比较完毕,退出 MOV AH,INPUTDI ;否那么接着比较,移入十位数 MOV AL,INPUTDI+1 ; 移入个位数 CMP AH,MINTMP ; 比较十位数,MINTMP低地址为十位 JA LOP ;如果MINTMP小,那么直接比较下一个数 JE HIGHEQU ;如果十位数相等,比较个位数,再否那么十位大就直接存储STOMIN: MOV MINTMP,AH MOV MINTMP1,AL JMP LOPHIGHEQU: CMP AL,MINTMP1; 比较个位数 JNB LOP

19、 ; 个位数比MINTMP大那么跳到下一个数 JMP STOMIN ; 否那么将当前数写入为MINTMPEXIT2: POP CX POP AXPOP DI RETFINDMIN ENDPCODE ENDS END MAIN实验分析实验中以空格为分隔符,空格的个数不限制,以回车为输入结束标志符。对输入的数字进行了位数和范围的严格限制,即必须是两位数字,如果数字小于10,需要补齐零。空格分隔不同数字输入,回车结束。一位数后面空格为错误,回车后判断。理论知识积累1.iferror :如果公式的计算结果为错误,那么返回指定的值;否那么返回公式的结果。2.call指令(调用指令)功能主要有:将下一条指

20、令的所在地址即程序计数器PC的内容入栈,并将子程序的起始地址送入PC,于是CPU的下一条指令就会转去执行子程序。实验D 子程序设计一、实验目的进一步掌握子程序设计方法;进一步掌握根本的 DOS 功能调用。二、实验内容从键盘上输入某班学生的某科目成绩。输入按学生的学号由小到大的顺序输入。统计检查每个学生的名次。将统计结果在屏幕上显示。为便于观察,输入学生数目不宜太多,以不超过一屏为宜。输出应便于阅读.尽可能考虑美观。输入要有检错手段。预习思考如何确定一个学生在这门科目中的名次?答:1.可以抽取每个学生的成绩和其他所有学生的成绩进行比较,然后统计比其分数高的学生,得出该学生的名次。2.可以把学生成

21、绩存入连续内存区域,即数组方式,取得每个学生的成绩偏移量,即成绩指针。然后比较指针所指的成绩的大小,根据比较结果移动指针完成排序。输入结束后,采用什么方法进行比较以得到学生的名次最为简单?答:采用移动指针完成排序的方法在汇编语言下实现,复杂度较高。由于人数比较少,冒泡法还是比较简洁的。冒泡法的时间和空间性能都还不错,可以接受。主程序准备好模块层次图。主程序显示名次计数器循环比较成绩显示名次计数器循环比较成绩 4.给出输出显示的形式。 答:根据输入的每个学生的ID,成绩,列出一个表,后面跟着排名次数。 具体形式参见实验分析局部的输出截图。四、实验过程流程图源代码DATA SEGMENTID DB

22、 400 DUP(?);存储学号MARK DB 20 DUP(?); 存储分数RANK DB 20 DUP(?); 存储排名RANKTMP DB 20 DUP(?); 临时排序指针MTMP DB ?; 临时记录成绩COUNTB DB ?; 总的学生的个数COUNTW DW ?; 总的学生个数CHEOK DB ?; 输入检查标志位ERROR DB ?; 记录错误号TMP DB 2 DUP(?);判断、计数CR DB 0DH,0AH,$; 回车TAB DB 09H,09H,$;输出TAB键ERR0 DB Input cannot be empty!,$ERR2 DB Character is in

23、valid!,$ERR4 DB Mark is invalid!,$ERR6 DB Input is invalid!,$ERRLIST DW ERR0,ERR2,ERR4,ERR6TIP0 DB Please re-input:,$TIP1 DB Please input number of students:,$TIP2 DB Please input ID and MARK:,$PRTIP DB RESULT,$PRINFO DB ID,09H,09H,MARK,09H,09H,RANK,$PRPRE1 DB ID : ,$PRPRE2 DB MARK: ,$BUFF DB 16;最长的

24、字符长度PRES DB ?; 存储实际输入字符数CHAR DB 16 DUP(?); 实际可存储有效字符16个DATA ENDSCODE SEGMENTPRINTTIP MACRO PARAPUSH AXPUSH DXMOV AH,09HMOV DX,OFFSET PARAINT 21HPOP DXPOP AXENDMPRINTCHAR MACRO ACHARPUSH AXPUSH DXMOV AH,02HMOV DL,ACHARINT 21HPOP DXPOP AXENDMMAIN PROC FAR ASSUME CS:CODE,DS:DATA,ES:DATA MOV AX,DATA MOV

25、 DS,AX MOV ES,AX CALL GETNUMBER; 人数 CALL GETINFO;分数 CALL SORT; 排序 CALL PRINT; 显示BACK:MOV AX,4C00H; 返回DOS INT 21HMAIN ENDPGETNUMBER PROC NEARPUSH AXPUSH BXHE:PRINTTIP TIP1GREP: CALL GETINMOV CHEOK,0CALL CHECKCMP CHEOK,0JE GRETURNMOV ERROR,6CALL PRINTERRPRINTTIP TIP0 PRINTTIP CRJMP GREPERRHERE: PRINTT

26、IP CRMOV ERROR,6CALL PRINTERRPRINTTIP TIP0JMP GREP GRETURN: CALL CHANGEMOV AL,MTMPCMP AL,0JE ERRHEREMOV COUNTB,AL CBWMOV COUNTW,AXPRINTTIP CRPOP BXPOP AXRETGETNUMBER ENDPGETINFO PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH DIPRINTTIP TIP2MOV TMP,0; 学号还是分数XOR BX,BX; ID的偏移量XOR AX,AX; 记录学生数目MORE:PR

27、INTTIP CRCMP COUNTB,AL JNZ HERE1 JMPRETURN; 计数器为0,返回父程序HERE1: CMP TMP,0JE PR1CMP TMP,1JE PR2PR1:PRINTTIP PRPRE1JMP HERE2PR2:PRINTTIP PRPRE2HERE2:CALL GETIN; 否那么接受输入CALL CHECK; 检查是否是数字且不为空CMP CHEOK,0JNE CHEFAILCMP TMP,0JE ISID ; 输入学号CMP TMP,1 ; JE ISMARK ;输入分数CHEFAIL:PRINTTIP TIP0 PRINTTIP CRMOV CHEO

28、K,0; 返回判断位置零JMP MOREISID:MOV DL,PRES XOR DH,DHMOV CX,DXMOV SI,CXINC CXMOV CHARSI,$;开始写入IDMOV TMP,1; 下一个是分数CLDMOV SI,OFFSET CHARMOV DI,OFFSET IDADD DI,BXREP MOVSB ;写入IDADD BX,16; ID的偏移地址向后挪动固定的16BYTEJMP MORE; 跳回继续输入下一个BUFFISMARK:CALL CHANGECMP CHEOK,0JE WRITEMARKMOV ERROR,4JMP CHEFAILWRITEMARK:PUSH B

29、XMOV BL,MTMPMOV DI,AXMOV MARKDI,BL; 实际写入成绩POP BXMOV TMP,0; 计数清理INC AX; 已接受的学生数+1JMP MORERETURN:POP DIPOP SIPOP DXPOP CXPOP BXPOP AXRETGETINFO ENDPGETIN PROC NEARPUSH AXPUSH DXPUSH DIMOV DX,OFFSET BUFFMOV AH,0AHINT 21HPOP DIPOP DXPOP AXRETGETIN ENDPCHECK PROC NEARPUSH DIPUSH CXPUSH AXXOR DI,DI; 记录CHA

30、R读取的偏移量MOV AL,PRES; 读取输入的BUFF中的字符数CBWMOV CX,AXCMP CX,0; 判断是否输入BUFF为空JE ISEMPTY; 为空,重新输入AGAIN:CMP CX,DIJE RETURNCHECKMOV AH,CHARDICMP AH,30H; JL INVALID; 小于,无效字符CMP AH,39H; JG INVALID; 大于,无效字符INC DIJMP AGAINISEMPTY: MOV ERROR,0 ;输入为空的处理代码PRINTTIP CRCALL PRINTERRPRINTTIP CRMOV CHEOK,1JMP RETURNCHECKIN

31、VALID: MOV ERROR,2; 输入不合法的处理代码PRINTTIP CRCALL PRINTERRPRINTTIP CRMOV CHEOK,1RETURNCHECK:POP AXPOP CXPOP DIRETCHECK ENDPCHANGE PROC NEAR PUSH AXPUSH BXPUSH CX MOV CL,PRES CMP CL,3JA MINVALID; 四位数或以上,溢出 JE THRDIG; 三位数 CMP CL,2 JE TWODIG; 两位数 CMP CL,1 JE ONEDIG; 一位数THRDIG:MOV BL,CHAR0; 百位SUB BL,30HCMP

32、BL,1JNE MINVALIDMOV BL,CHAR1; 十位SUB BL,30HCMP BL,0JNE MINVALIDMOV BL,CHAR2; 个位SUB BL,30HCMP BL,0JNE MINVALIDMOV MTMP,100 JMP CRETURNTWODIG:MOV BL,CHAR0; 十位SUB BL,30HCMP BL,0JE MINVALIDMOV AL,10MUL BL; 乘以10取得十位数MOV BL,CHAR1; 个位SUB BL,30HADD AL,BLMOV MTMP,AL; 写入转换后的数字JMP CRETURNONEDIG: ;一位数时直接写入临时成绩区M

33、OV BL,CHAR0; 个位SUB BL,30HMOV MTMP,BLJMP CRETURNMINVALID:MOV ERROR,4CALL PRINTERRMOV CHEOK,1 CRETURN:POP CXPOP BXPOP AX RETCHANGE ENDPPRINTERR PROC NEARPUSH AXPUSH DXPUSH BX MOV AL,ERRORCBWMOV BX,AXMOV AH,09H MOV DX,ERRLISTBXINT 21HPOP BXPOP DXPOP AXRETPRINTERR ENDPSORT PROC NEAR PUSH AX PUSH BX PUSH

34、 CX PUSH DX PUSH SI PUSH DI MOV AL,COUNTB; 读取学生数目 XOR BX,BX; BX作寻址计数器SLOP: DEC AL MOV RANKTMPBX,AL INC BX CMP AL,0 JNE SLOP MOV CX,COUNTW; CX记录总学生人数 DEC CX JZ WRRAKLOP1: XOR DI,DILOP2: MOV AL,RANKTMPDI; 取出地址指针,即成绩偏移量 XOR AH,AH MOV SI,AX MOV DL,MARKSI; 取出成绩1 MOV AL,RANKTMPDI+1 XOR AH,AH MOV SI,AX MOV

35、 DH,MARKSI;同理取出成绩2 CMP DL,DH JGE NEXTCMP MOV AH,RANKTMPDI; 交换分数指针 XCHG AH,RANKTMPDI+1 MOV RANKTMPDI,AH NEXTCMP: INC DI CMP DI,CX JNE LOP2 LOOP LOP1WRRAK: XOR SI,SI MOV CX,COUNTW MOV BL,1; 保存名次LOPSAVE: CMP SI,CX JE FINISH MOV AL,RANKTMPSI; 提取该名次学生的地址指针 XOR AH,AH MOV DI,AX MOV RANKDI,BL ; 写入学生名次 INC B

36、L INC SI JMP LOPSAVEFINISH: POP DI POP SI POP DX POP CX POP BX POP AX RETSORT ENDPPRINT PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPRINTTIP CRPRINTTIP PRTIP PRINTTIP CRPRINTTIP PRINFOPRINTTIP CRMOV CX,COUNTW; CX保存学生数XOR SI,SI; SI指明当前处理的学生序号XOR BX,BX; BX保存当前输入学号偏移量NEXPRINT:MOV TMP1,0; 对打印名次置标志位CMP S

37、I,CXJNE PRINTIDJMP PRETPRINTID:;打印学号,直接字符串打印MOV AH,09HMOV DX,OFFSET IDADD DX,BXINT 21HPRINTTIP TABPRINTMARK:MOV AL,MARKSIPRINTRANK:CMP AL,100JE PTTHRCMP AL,10JL PTONEJMP PTTWOPTTHR:PRINTCHAR 1PRINTCHAR 0PRINTCHAR 0JMP NEXTPTTWO: CBWPUSH BXMOV BL,10DIV BLMOV BX,AXADD BL,30HADD BH,30HPRINTCHAR BLPRINT

38、CHAR BHPOP BXJMP NEXTPTONE:ADD AL,30HPRINTCHAR ALNEXT:PRINTTIP TABMOV AL,RANKSICMP TMP1,0JNE FINISHPMOV TMP1,1 JMP PRINTRANKFINISHP:PRINTTIP CR INC SIADD BX,16 JMP NEXPRINTPRET:POP SIPOP DXPOP CXPOP BXPOP AXRETPRINT ENDPCODE ENDS END MAIN实验分析实验E 中断程序设计一、实验目的初步掌握中断程序的设计方法;初步掌握修改 DOS 系统中断,以适应实际使用的方法。二

39、、实验内容编写一个32位二进制数除以16位二进制数的除法程序。观察当除数为 0,或超过相应存放器范围时,程序执行的结果。修改零号中断效劳程序,使它具有以下功能:判断除数是否为0,当除数为0时,显示相应的结果;当除数不为0时,采用适当的方法完成商超过16位的二进制数的除法运算。注意必须保护原有中断效劳程序的入口地址,并在程序完毕前加以恢复。三、预习思考如何保护原有中断向量表中的中断效劳程序的入口地址?答:先读取中断向量表中0号中断的地址,压入堆栈,程序结束时弹出堆栈,写回中断向量表即可。如何将你的中断效劳程序入口地址置入中断向量表?答:有两种根本方法:一是直接写入法,使用指令将中断效劳程序入口地

40、址的IP写入n4的RAM位置,中断效劳程序入口的CS写入n4+2的位置;二是DOS功能调用,25H用来写中断向量表,35H读中断向量表。四、实验过程流程图源代码 Data segment str01 db Please input a binary divident,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,$

41、 str1 db 0dh,0ah,Divisor should not be 0!$ str3 db 0dh,0ah,Quotient:$ str4 db 0dh,0ah,Residual:$ dividend _ h dw 0 dividend _ l dw 0 divisor dw 0 quotient dw 2 dup(0) residual dw 0 keepip dw 0 keepcs dw 0data endsstack segment stack stack db 100 dup(?)stack endscode segment para code assume cs:code,

42、ss:stack,ds:data,es:datasta proc far push dsxor ax, axpush axmov ax, datamov ds,axmov es,axmov ax,3500hint 21hmov keepip,bxmov keepcs,esclipush ds ;中断程序装载mov ax,seg myovflmov ds,axmov dx,offset myovflmov ax,2500hint 21hpop dssticall input mov ax,divident_lmov dx,divident_hmov bx,divisor cmp bx,0jnz

43、nextlea dx,str1mov ah,9int 21hjmp done next:div bxmov quotient,axmov residual,dx rtaddr:call 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 bx

44、mov quotient,axmov residual,dxstiiretsta endpcheck proc;输入检错,标志为blcmp al,0jl falsecmp al,1jg falsemov bl,1jmp exit false:mov bl,0 exit:retcheck endpinput proc;依次输入被除数和除数lea dx,str01mov ah,9int 21hmov cx,32;被除数最多32位 input1:mov ah,1int 21hcmp cx,32;第一个字符不能为回车符jz next1cmp al,0dhjz done1 next1:call checkcmp bl,0jz err1and al,0fh;输入字符的转化sal divident_l,1rcl divident_h,1mov ah,0add divident_l,axadc divident_h,0jmp l1 err1:lea dx,str0mov ah,9int 21hinc cx l1:loop input1 done1:lea dx,str02mov ah,9int 21h mov cx,16

温馨提示

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

评论

0/150

提交评论