汇编实验4宏指令设计实验报告Word文件下载.docx
《汇编实验4宏指令设计实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《汇编实验4宏指令设计实验报告Word文件下载.docx(13页珍藏版)》请在冰点文库上搜索。
实验过程是否详细记录:
A.详细□B.一般□C.没有□
教师签名:
年月日
一、实验目的和内容
1.掌握宏指令库的设计方法,并设计程序来调用其中的宏指令。
2.编程实现32位二进制数除以16位二进制数,并把结果用十进制数形式显示在屏幕上。
要求采用宏指令库实现。
二、实验原理及基本技术路线图(方框原理图)
宏指令是源程序中一段有独立功能的程序代码。
宏指令由宏定义伪指令定义,它只需在源程序中定义一次,便可以多次被调用。
当源程序被汇编时,汇编程序对每个宏调用进行宏扩展。
宏扩展就是用宏定义体替换宏指令名,并用实参数替换形式参数。
宏调用中实参数个数和形式参数个数不等时,若实参数个数大于形式参数个数,在替换时多余的实参数不予考虑;
若实参数个数小于形式参数个数,则多余的形式参数作为空(字符)或零(数字)处理。
应保证用实参数替换形式参数后,所展开的是有效的汇编语句,否则汇编程序会提示错误。
为了使宏指令能让多个程序共享,可以把它们组织到一个文件中,并存放在磁盘上,把这种文件称为宏指令库。
可以用EDIT等任何文本编辑程序创建宏指令库,库名由用户自己起,而且对库的扩展名没有特殊要求。
库中的宏指令以源代码形式出现。
三、所用仪器、材料(设备名称、型号、规格等)
1.操作系统平台:
Windows7。
2.汇编环境:
MicrosoftMASM5.0。
3.文本编辑器:
记事本。
四、实验方法、步骤
1.将MASM5的文件置于D:
\assembly目录下;
2.将masm.exe和link.exe所在目录(D:
\assembly\MASM5)添加到Path环境变量中;
3.在D:
\assembly下新建一个div.asm文件,打开div.asm,输入汇编程序代码;
4.新建一个宏指令库macro.lib,输入源代码,保存;
5.运行一个命令行窗口,将当前目录切换到D:
\assembly,然后输入命令:
masmdiv.asm[Enter],来汇编程序,根据汇编结果查看程序代码是否有语法错误,如有,则更正保存后重新汇编,直至没有错误为止(特别是对宏指令库的检查),此时会生成div.obj文件;
6.输入命令:
linkdiv.obj[Enter],观察输出结果,如果没有错误,则生成div.exe;
7.输入命令:
debugdiv.exe[Enter],调试程序,并记录运行过程;
8.完成实验报告。
五、实验过程原始记录(数据、图表、计算等)
1.新建一个宏指令库macro.lib:
2.新建名为div.asm的文件,输入汇编程序代码:
MACRO.LIB文件源码:
;
-----------------------------------
功能:
保存寄存器DX、CX、BX、AX
PUSHREGMACRO
PUSHDX
PUSHCX
PUSHBX
PUSHAX
ENDM
恢复寄存器AX、BX、CX、DX
POPREGMACRO
POPAX
POPBX
POPCX
POPDX
清屏
CLRSCRNMACRO
PUSHREG
MOVAH,6
MOVAL,0
MOVBH,1FH
MOVCX,0
MOVDX,184FH
INT10H
POPREG
返回操作系统
RETURNMACRO
MOVAX,4C00H
INT21H
把16位二进制数转换为十进制数的
ASCII值,ASC为5个字节的十进制数缓冲区,
BIN为要转换的二进制数。
BIN_DECMACROASC,BIN
PUSHREG;
保存寄存器内容
PUSHDI
LEADI,ASC;
保存输出结果字符串的首地址
XORDX,DX
MOVAX,BIN
MOVBX,10000
DIVBX;
求万位数
ADDAL,30H
MOV[DI],AL;
存放万位数的ASCII码
INCDI
MOVAX,DX
MOVBX,1000
求千位数
存放千位数的ASCII码
MOVBX,100
求百位数
存放百位数的ASCII码
MOVBX,10
求十位数
存放十位数的ASCII码
ADDDL,30H
MOV[DI],DL;
存放个位数的ASCII码
POPDI
POPREG;
恢复寄存器内容
显示首址为ASC的字符串
DISPMACROASC
LEADX,ASC
MOVAH,9
INT21H
POPDX
div.asm文件源码:
INCLUDEMACRO.LIB
STACKSGSEGMENTSTACK'
S'
DW16DUP('
?
'
)
STACKSGENDS
DATASEGMENT
ADD7006652;
被除数
BDW1234;
除数
CDW?
;
商
PROMPTDB'
Theresultis:
$'
ASCIIDB5DUP(?
),'
$'
;
转换结果
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACKSG
MAINPROCFAR
MOVAX,DATA
MOVDS,AX
MOVDX,WORDPTRA+2
MOVAX,WORDPTRA
DIVB;
计算A/B
BIN_DECASCII,AX;
将商转换为十进制的ASCII码
CLRSCRN;
DISPPROMPT
DISPASCII;
显示结果
RETURN
MAINENDP
CODEENDS
ENDMAIN
3.汇编源程序:
4.连接生成可执行文件:
5.调试程序:
(1)在计算完A/B之后,调用宏指令BIN_DEC,从153D:
0010处展开宏:
(2)将计算结果的万位(0)转为其对应的ASCII码存入ASCII数组的0号单元:
(3)将计算结果的千位(5)转为其对应的ASCII码存入ASCII数组的1号单元:
(4)将计算结果的百位(6)转为其对应的ASCII码存入ASCII数组的2号单元:
(5)将计算结果的十位(7)转为其对应的ASCII码存入ASCII数组的3号单元:
(6)将计算结果的个位(8)转为其对应的ASCII码存入ASCII数组的4号单元:
(7)紧接着从153D:
005B处开始调用CLRSCRN宏指令清屏:
(8)清屏后的效果如下,并从153D:
0071处开始调用DISP宏指令输出字符串‘Theresultis:
’:
(9)显示:
‘Theresultis:
’,并从153D:
007B处开始调用DISP宏指令输出计算结果:
(10)显示计算结果:
05678,并从153D:
0085处开始调用RETURN宏指令,返回操作系统:
(11)程序结束并退出
(12)在命令行下直接运行div.exe的效果:
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。
其中,绘制曲线图时必须用计算纸)
1.宏指令库在编写时,要特别注意保存要有到的寄存器,并且对宏指令的执行逻辑要非常清晰,保证当形参被替换为实参时,展开的汇编语句是正确的,否则将会出现错误。
当宏指令结束时,同时还要恢复现场,保证堆栈平衡。
2.宏指令在定义时,一个好的习惯是在其代码前面加以说明,解释对应宏指令的功能和执行逻辑。
这样在使用时才能根据需要使用不同的宏指令,也方便代码阅读。
3.宏指令和子程序的用途可以简单的总结为:
通常宏指令被用在代码较短且参数较多的场合,而子程序则被用在代码较长的场合。
注:
教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。