北邮微机原理软件实验文档格式.docx
- 文档编号:16719067
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:10
- 大小:67.74KB
北邮微机原理软件实验文档格式.docx
《北邮微机原理软件实验文档格式.docx》由会员分享,可在线阅读,更多相关《北邮微机原理软件实验文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
XXDD?
;
被除数32bit
YYDW?
除数16bit
TMPDW?
FLAGDB0;
是否调用了中断处理程序的标志位,即是否溢出
;
一些提示信息
ERR0DB'
ERROR!
DividebyZERO!
'
'
$'
TIP1DB'
Quotient:
TIP2DB'
Remainder:
TIP3DB'
Inputhigh16-bitofdividend:
'
TIP4DB'
Inputlow16-bitofdividend:
TIP5DB'
Input16-bitdivisor:
CRDB0DH,0AH,'
回车换行
ONEDB'
1'
ZERDB'
0'
TABDB09H,'
BUFFDB17;
输入缓冲区,可容纳包括回车在内的17个字符
PRESDB0
CHARDB17DUP(0)
DATAENDS
--------------------------------------------------------
定义堆栈
STACKSEGMENTSTACK'
STACK'
DB100DUP(0)
STACKENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE,ES:
CODE,SS:
STACK
打印字符串的宏
PRINTMACROPARA
PUSHAX
PUSHDX
MOVAH,09H
MOVDX,OFFSETPARA
INT21H
POPDX
POPAX
ENDM
主程序入口
MAIN:
MOVAX,DATA
MOVDS,AX
MOVAX,0
MOVES,AX
保存原中断向量表
MOVAX,WORDPTRES:
[0000H]
[0002H]
写入新的中断处理子程序地址
MOVWORDPTRES:
[0000H],OFFSETINT0
[0002H],SEGINT0
CALLINPUT;
获取输入
MOVDX,WORDPTRXX;
移入被除数高16位
MOVAX,WORDPTRXX+2;
移入被除数低16位
MOVBX,YY;
移入除数
DIVBX;
进行32位除法运算
CMPFLAG,0;
查看是否调用了中断处理程序,即可判断是否溢出
JNEISOF;
溢出跳转,到扩充除法的结果输出
否则直接输出没有溢出的正常除法结果
PRINTTIP1
MOVBX,AX
CALLDISP2
PRINTCR
PRINTTIP2
MOVBX,DX
JMPEOP
有溢出的时候需要输出32位商和16位余数
ISOF:
PRINTTIP1
CALLDISP2
MOVBX,CX
EOP:
POPAX;
程序结束出口
恢复中断向量表
MOVWORDPTRES:
[0002H],AX
POPAX
[0000H],AX
MOVAX,4C00H;
返回DOS
INT21H
新的0号中断子程序
INT0:
POPSI
ADDSI,2;
修改IP的值,指向DIV后的指令
PUSHSI
CMPBX,0;
判断除数是否为0
JEDIV0;
为零则提示除数为0,然后返回DOS
MOVFLAG,1;
置标志为除数不为零溢出
进行扩展除法运算,分别用除数除以被除数高16位和低16位
输出参数为DX:
商高16位,AX:
商低16位,CX:
16位余数
PUSHAX
MOVAX,DX
XORDX,DX;
除前将DX清零
高16位除法
MOVCX,AX;
保存商的高16位
POPAX;
取出被除数低16位
低16位除法
XCHGCX,DX;
同时保存余数和商的低16位
JMPEXIT
DIV0:
PRINTERR0;
被零除错误打印
EXIT:
IRET
获取用户输入二进制序列的代码
INPUTPROCNEAR
PRINTTIP3
CALLGETIN;
调用获取一次输入缓冲,得到16位二进制码
CALLCHANGE;
对字符进行转换,得到二进制序列
MOVAX,TMP
MOVWORDPTRXX[0],AX;
保存被除数高16位
PRINTTIP4
CALLGETIN
CALLCHANGE
MOVWORDPTRXX[2],AX;
保存被除数低16位
PRINTTIP5
MOVYY,AX;
保存除数
RET
INPUTENDP
-------------------------------------------------------
缓冲区0、1字符序列转换为二进制数子程序
CHANGEPROCNEAR
PUSHBX
PUSHCX
MOVCX,16;
总共16bit
XORBX,BX
LOPC:
MOVAL,CHAR[BX];
依次取出每个bit
CMPAL,30H
JEIS0;
是零的处理
JMPIS1;
是一的处理
IS0:
CLC
RCLDX,1;
把CF清零,然后循环左移,可得到二进制序列
JMPEXTCH
IS1:
STC
RCLDX,1;
把CF置一,循环左移
EXTCH:
INCBX
LOOPLOPC;
把16bit输入处理完
MOVTMP,DX;
保存转换后的二进制数
POPDX
POPCX
POPBX
RET
CHANGEENDP
获取一次输入字符串缓冲子程序
GETINPROCNEAR
PUSHDX
PUSHDI
MOVDX,OFFSETBUFF
MOVAH,0AH
INT21H
POPDI
POPDX
POPAX
RET
GETINENDP
显示二进制序列的子程序,把二进制数转换为0、1字符串输出
DISP2PROCNEAR
MOVCX,16
HERE:
SHLBX,1;
二进制数左移到CF
JNCISZERO;
判断CF是0还是1,分别打印之
PRINTONE;
打印字符一
JMPISONE
ISZERO:
PRINTZER;
打印字符零
ISONE:
LOOPHERE
PRINTTAB
POPCX
DISP2ENDP
CODEENDS
ENDMAIN
(三)实验分析
本程序完成了以下主要功能:
1.读取用户键盘输入二进制数并处理。
2.修改零号中断处理程序。
保护并恢复了原中断向量表。
3.在中断程序中处理除数为零的情况。
4.用扩展除法处理除数不为零32位除法溢出,得出正确结果并显示。
5.用二进制在屏幕显示输出。
实验中首先读取用户输入的0、1符号,进行转换,成为二进制数,然后分别测试了无溢出时的处理、有溢出时的处理、除数为零时的处理。
如下图为32位除以16位无溢出的测试截图。
如下两图为32位除以16位溢出时触发0号中断,用扩展的32位除法得到正确结果的测试截图。
图示分别是80000000H除以00000001H和80000001H除以00000002H。
结果正确无误。
下图为除数为0时的测试截图。
输出错误提示,并返回DOS。
程序设计的核心思路如下:
1.通过从键盘读取用户输入,得到32位被除数和16位除数。
从字符到二进制数转换的方法是逐位移位判断,然后依据判断结果写CF标志,再用循环移位可将每次得到的二进制位移入16位寄存器保存。
2.保护和恢复中断向量表。
采用的是直接读取的方式,压入堆栈保存,退出程序时将其弹出并直接写入中断向量表。
3.修改零号中断服务程序。
采用直接修改向量表的方式实现。
在修改后的中断服务程序中,对除0和非除零溢出分别进行处理。
非除零溢出时采用扩展的32位除法得到正确的结果,返回32位商和16位余数。
4.输出二进制数也是移位,根据CF标志决定输出符号0还是符号1。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理 软件 实验