实验四DOS功能调用.docx
《实验四DOS功能调用.docx》由会员分享,可在线阅读,更多相关《实验四DOS功能调用.docx(17页珍藏版)》请在冰点文库上搜索。
实验四DOS功能调用
福建农林大学金山学院实验报告
系:
信息机电工程专业:
电子信息年级:
09
姓名:
XXX学号:
092230051实验课程:
汇编语言
实验室号:
_605______实验设备号:
j2实验时间:
指导教师签字:
成绩:
实验四DOS功能调用
1.实验目的和要求
1.学会DOS中关于显示功能调用指令的用法。
2.领会修改显存方法显示字符。
2.实验环境
实验的硬件环境是:
IBM—PC机及其兼容机
实验的软件环境是:
操作系统:
DOS2.0以上;调试程序:
DEBUG.COM;文本编程程序:
EDIT.EXE、WPS.EXE;宏汇编程序:
MASM.EXE(或ASM.EXE);连接装配程序:
LINK.EXE;交叉引用程序:
CREF.EXE(可有可无)。
3.实验内容及实验数据记录
1、输入一个字符,显示出来
2、输入一个字符串,显示出来
3、buf开始的3个的16位二进制数用十六进制数的形式显示出来
(1)理解程序
(2)输入程序,汇编,运行(在DOS状态下输入:
文件名.EXE),观察结果。
(3)如果要分行显示,程序要如何修改?
DATASEGMENT
BUFDW4F59H,56A8H,0FF90H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,0
P:
MOVBX,BUF[SI]
MOVCH,4
L:
MOVCL,4
ROLBX,CL
MOVDL,BL
ANDDL,0FH
CMPDL,10
JBNEXT
ADDDL,7
NEXT:
ADDDL,30H
MOVAH,2
INT21H
DECCH
JNZL
INCSI
INCSI
CMPSI,4
JNAP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
4、运行下列程序,在屏幕的第1行,会显示一个字符X,理解程序段
STACKSEGMENT
DB128DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,SS:
STACK
START:
MOVAX,STACK
MOVSS,AX
MOVSP,128
MOVAX,0B800H
MOVES,AX
MOVAH,0;BIOS10H的0号功能,设置80X25的彩色字符模式
MOVAL,03H
INT10H
MOVAH,'X'
MOVES:
[160*1+40*2],AH
MOVAL,0
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
5、显示
*********
*******
*****
***
*
6、编写程序,统计字缓冲区中的20个数据的正数、负数、0的个数,并将统计结果以16进制形式显示出来。
4.算法描述及实验步骤
1直接doss调用1号功能
2调用10号和2号功能显示字符串
3运行程序,输出结果为单行输出,把程序修改为
DATASEGMENT
MSGDB0DH,0AH,'$'
BUFDW4F59H,56A8H,0FF90H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,0
P:
MOVBX,BUF[SI]
MOVCH,4
L:
MOVCL,4
ROLBX,CL
MOVDL,BL
ANDDL,0FH
CMPDL,10
JBNEXT
ADDDL,7
NEXT:
ADDDL,30H
MOVAH,2
INT21H
DECCH
JNZL
INCSI
INCSI
LEADX,MSG
MOVAH,09H
INT21H
CMPSI,4
JNAP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
则为分行输出。
4直接运行程序,则输出结果是‘x’
5输入以下程序运行
DSEGSEGMENT
MSGDB0DH,0AH,'$'
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVBX,9
LP:
MOVCX,BX
LOP:
MOVDL,'*'
MOVAH,2
INT21H
LOOPLOP
LEADX,MSG
MOVAH,09H
INT21H
DECBX
DECBX
CMPBX,1
JNLLP
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
编写程序,统计字缓冲区中的20个数据的正数、负数、0的个数,并将统计结果以16进制形式显示出来。
STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DSEGSEGMENT
BUFDB0,-1,2,4,3,-4,5,6,-7,0
RESULTDB0
DSEGENDS
CSEGSEGMENTPARAPUBLIC'CODE'
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVAX,0
MOVBX,0
MOVDX,0
LEASI,BUF
MOVCX,10
LOP:
CMPBYTEPTR[SI],0
JNEL1
INCDL;0的个数
JMPL3
L1:
JGL2
INCAL;负数的个数
JMPL3
L2:
INCBL;正数的个数
L3:
INCSI
LOOPLOP
MOVBH,0
CALLDISP;调用显示子程序,显示正数的个数
MOVBL,AL
MOVBH,0
CALLDISP;调用显示子程序,显示负数的个数
MOVBL,DL
MOVBH,0
CALLDISP;调用显示子程序,显示规划零的个数
MOVAL,0
MOVAH,4CH
INT21H
DISPPROC;显示BX中的数
PUSHAX
PUSHBX
PUSHDX
MOVCH,4
ROLL:
MOVCL,4
ROLBX,CL
MOVDL,BL
ANDDL,0FH
CMPDL,9
JBENEXT1
ADDDL,07H
NEXT1:
ADDDL,30H
MOVAH,02H
INT21H
DECCH
JNZROLL
POPDX
POPBX
POPAX
RET
DISPENDP
CSEGENDS
ENDSTART
5.调试过程
3
该程序是将buf开始的3个的16位二进制数用十六进制数的形式显示出来,按程序输出结果
将程序输出结果改为分行显示
4
运行程序观察结果如下
6.实验结果
1doss运行程序结果如下
2显示字符串
3分行输出的结果
4
5
6
6、运行,显示结果为:
7.总结
学会DOS中关于显示功能调用指令的用法。
领会修改显存方法显示字符。
附录:
1
DATESEGMENT
DATEENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATE
START:
MOVAH,1
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
2
DATASEGMENT
BUFDB20,?
20DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETBUF
MOVAH,0AH
INT21H
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
MOVAH,2
INT21H
MOVCL,BUF+1
MOVSI,0
L:
MOVDL,[SI+2]
MOVAH,2
INT21H
INCSI
LOOPL
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
3
DATASEGMENT
MSGDB0DH,0AH,'$'
BUFDW4F59H,56A8H,0FF90H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVSI,0
P:
MOVBX,BUF[SI]
MOVCH,4
L:
MOVCL,4
ROLBX,CL
MOVDL,BL
ANDDL,0FH
CMPDL,10
JBNEXT
ADDDL,7
NEXT:
ADDDL,30H
MOVAH,2
INT21H
DECCH
JNZL
INCSI
INCSI
LEADX,MSG
MOVAH,09H
INT21H
CMPSI,4
JNAP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
5
DSEGSEGMENT
MSGDB0DH,0AH,'$'
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVBX,9
LP:
MOVCX,BX
LOP:
MOVDL,'*'
MOVAH,2
INT21H
LOOPLOP
LEADX,MSG
MOVAH,09H
INT21H
DECBX
DECBX
CMPBX,1
JNLLP
MOVAL,0
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
6、STACKSSEGMENTSTACK
DW128DUP(?
)
STACKSENDS
DSEGSEGMENT
BUFDB0,-1,2,4,3,-4,5,6,-7,0
RESULTDB0
DSEGENDS
CSEGSEGMENTPARAPUBLIC'CODE'
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG
MOVDS,AX
MOVAX,0
MOVBX,0
MOVDX,0
LEASI,BUF
MOVCX,10
LOP:
CMPBYTEPTR[SI],0
JNEL1
INCDL;0的个数
JMPL3
L1:
JGL2
INCAL;负数的个数
JMPL3
L2:
INCBL;正数的个数
L3:
INCSI
LOOPLOP
MOVBH,0
CALLDISP;调用显示子程序,显示正数的个数
MOVBL,AL
MOVBH,0
CALLDISP;调用显示子程序,显示负数的个数
MOVBL,DL
MOVBH,0
CALLDISP;调用显示子程序,显示规划零的个数
MOVAL,0
MOVAH,4CH
INT21H
DISPPROC
PUSHAX
PUSHBX
PUSHDX
MOVCH,4
ROLL:
MOVCL,4
ROLBX,CL
MOVDL,BL
ANDDL,0FH
CMPDL,9
JBENEXT1
ADDDL,07H
NEXT1:
ADDDL,30H
MOVAH,02H
INT21H
DECCH
JNZROLL
POPDX
POPBX
POPAX
RET
DISPENDP
CSEGENDS
ENDSTART