实验报告
一、实验目的
《汇编语言程序设计》是计算机专业的重要的专业基础课,通过本综合性、设计性实验使学生进一步巩固课堂所学,全面熟悉、掌握8088宏汇编语言程序设计的基本方法和技巧,进一步提高编写程序、阅读分析程序及上机操作、调试程序的能力。
二、实验要求
编写一个程序,让红心和严在(0,0)到(140,140)的斜线上移动。
时钟的常驻内存程序,要求:右上角显示时分秒。
三、实验原理分析
1、INT 10H 是一个中断向量,是由 BIOS 对屏幕及显示器所提供的服务程序。
2、先在数据段定义好“心”的图形,代码段选定坐标,调用显示子程序显示在桌面上。
3、将时间数值转换成ASCII码字符
4、设置显示方式为40*25彩色文本方式
5、MOV AH,2CH 取系统时间
四、流程图
五、源程序(加必要注释)和程序运行时的截屏
STACK SEGMENT STACK
DW 200 DUP (?)
STACK ENDS
DATA SEGMENT
SPACE DB 1000 DUP (' ')
PATTERN DB 24 DUP (' '),0C9H,8 DUP (0CDH),0BBH,6 DUP (' ')
DB 24 DUP (' '),0BAH,8 DUP (20H),0BAH,6 DUP (' ')
DB 24 DUP (' '),0C8H,8 DUP (0CDH),0BCH,6 DUP (' ')
DBUFFER DB 8 DUP (':'),12 DUP (' ')
DBUFFER1 DB 20 DUP (' ')
STR DB 0DH,0AH, 'INPUT "Q" TO QUIT!$'
DELAY1 DW 0 ;延迟时间设置
DELAY2 DW 0
COLOUR DB 0 ;颜色设置
S_MOV DB 0 ;擦出或画图方式选择
LINE DW 0 ;行号
ROW DW 0 ;列号
PIX DB 0 ;颜色
XX DW 0 ;坐标(xx,yy)
YY DW 0 ;
Y_NUM DW 0 ;行数
L_NUM DW 0 ;行数
R_NUM DW 0 ;列数
P1 DB 0,0,00H ,00H ,00H ,00H ,0FH ,00H ,0F0H ,01H ,0FH ,00H ,0F0H ,03H ,0FH ,00H ,0F0H ,07H ;图形“严”
DB 0FH ,30H ,0F0H,0EH ,0FH ,38H ,0F0H ,1CH ,0FH ,1CH ,0FFH ,0F8H ,0FH ,0EH ,0FFH ,0F0H
DB 0FH ,0FFH,0FFH,0E0H ,0FH ,0FFH,0F0H ,00H ,0FH ,0FFH,0F0H ,00H ,0FH ,00H ,0F0H ,000H
DB 0FH ,00H ,0F0H,00H ,0FH ,00H ,0F0H ,00H ,0FH ,00H ,0F0H ,00H ,0FH ,00H ,0F0H ,00H
DB 0FH ,00H ,0F0H,00H ,0FH ,00H ,0F0H ,00H ,0FH ,0FFH,0F0H ,00H ,0FH ,0FFH,0F0H ,00H
DB 0FH ,0FFH,0F0H,00H ,0FH ,0EH ,0F0H ,00H ,0FH ,1CH ,0F0H ,00H ,0FH ,38H ,0F0H ,00H
DB 0FH ,30H ,0F0H,00H ,0FH ,00H ,0F0H ,00H ,0FH ,00H ,0F0H ,0H ,0FH ,00H ,0F0H ,00H
DB 00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H ,00H
P2 DB 0,0,00H , 00H , 00H , 00H ,00H , 0FH , 00H , 00H ,00H ,03FH ,0C0H , 00H ,00H ,0FFH ,0F0H ,00H ;图形“心”
DB 01H ,0FFH ,0F8H , 00H ,03H ,0FFH ,0FCH , 00H ,07H ,0FFH ,0FEH , 00H ,0FH ,0FFH ,0FFH ,00H
DB 0FH ,0FFH ,0FFH , 80H ,0FH ,0FFH ,0FFH ,0C0H ,07H ,0FFH ,0FFH ,0E0H ,03H ,0FFH ,0FFH ,0F0H
DB 01H ,0FFH ,0FFH ,0F8H ,00H ,0FFH ,0FFH ,0FCH ,00H , 7FH ,0FFH ,0FEH ,00H , 3FH ,0FFH ,0FFH
DB 00H , 1FH ,0FFH ,0FFH ,00H , 3FH ,0FFH ,0FFH ,00H , 7FH ,0FFH ,0FEH ,00H ,0FFH ,0FFH ,0FCH
DB 01H ,0FFH ,0FFH ,0F8H ,03H ,0FFH ,0FFH ,0F0H ,07H ,0FFH ,0FFH ,0E0H ,0FH ,0FFH ,0FFH ,0C0H
DB 0FH ,0FFH ,0FFH , 80H ,0FH ,0FFH ,0FFH , 00H ,07H ,0FFH ,0FEH , 00H ,03H ,0FFH ,0FCH ,00H
DB 01H ,0FFH ,0F8H , 00H ,00H ,0FFH ,0F0H , 00H ,00H ,03FH ,0C0H , 00H ,00H , 0FH , 00H ,00H
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,0001H ;设置显示方式为40*25彩色文本方式
INT 10H
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV BP,OFFSET SPACE
MOV DX,0300H
MOV CX,1000
MOV BX,0030H
MOV AX,1300H
INT 10H
MOV BP,OFFSET PATTERN ;显示矩形条
MOV DX,0300H
MOV CX,120
MOV BX,002EH
MOV AX,1301H
INT 10H
LEA DX,STR ;显示提示信息
MOV AH,9
INT 21H
CALL TIME ;显示系统时间
EXIT:
MOV AH,1 ;从键盘输入单个字符
INT 21H
CMP AL,51H ;AL='Q'?
JNE EXIT
CALL INIT_WORD
CALL W_END
MOV AH,4CH ;返回dos状态
INT 21H
TIME PROC NEAR ;显示时间子程序
DISPLAY1:MOV SI,0
MOV BX,100
DIV BL
MOV AH,2CH ;取时间
INT 21H
MOV AL,CH
CALL BCDASC ;将时间数值转换成ASCII码字符
INC SI
MOV AL,CL
CALL BCDASC
INC SI
MOV AL,DH
CALL BCDASC
MOV BP,OFFSET DBUFFER
MOV DX,0419H
MOV CX,8
MOV BX,004EH
MOV AX,1301H
INT 10H
MOV AH,02H
MOV DX,0300H
MOV BH,0
INT 10H
MOV BX,0018H
RE: MOV CX,0FFFFH
REA: LOOP REA
DEC BX
JNZ RE
MOV AH,01H
INT 16H
JE DISPLAY1
JMP EXIT
MOV AX,4C00H
INT 21H
RET
TIME ENDP
BCDASC PROC NEAR ;时间数值转换成ASCII码字符子程序
PUSH BX
CBW
MOV BL,10
DIV BL
ADD AL,'0'
MOV DBUFFER[SI],AL
INC SI
ADD AH,'0'
MOV DBUFFER[SI],AH
INC SI
POP BX
RET
BCDASC ENDP
INIT_WORD PROC NEAR ;初始化屏幕
MOV AH,0
MOV AL,5H
INT 10H
MOV AH,0BH
MOV BH,01H
MOV BL,0
INT 10H
RET
INIT_WORD ENDP
W_END PROC NEAR ;让“心”和“严”分别从两侧向中间靠拢
MOV R_NUM,4
MOV L_NUM,4
MOV COLOUR,2;颜色为红
MOV AX,0
K1: MOV XX,0
MOV YY,0
ADD XX,AX
ADD YY,AX
MOV DI,OFFSET P2
MOV S_MOV,1
CALL DISP
MOV XX,310
MOV YY,0
SUB XX,AX
ADD YY,AX
MOV DI,OFFSET P1
MOV S_MOV,1
CALL DISP
MOV DELAY1,100
MOV DELAY2,100
CALL DELAY
INC AX
CMP AX,140
JZ K2
JMP K1
K2: RET
W_END ENDP
DISP PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV SI,R_NUM
mov cl,3
SAL SI,cl
MOV ROW,0
MOV Y_NUM,0
GO: MOV Y_NUM,0
L1: MOV LINE,0
ADD DI,1
MOV BX,[DI]
L2: SAL BX,1
JNC L3 ;CF=0,跳转
CMP S_MOV,0
JZ L3
MOV AL,COLOUR
MOV PIX,AL
JMP L4
L3: MOV PIX,0
L4: MOV DX,YY
ADD DX,LINE
MOV CX,Y_NUM
CMP Y_NUM,0
JZ L6
L5: ADD DX,8
LOOP L5
L6: MOV CX,XX
ADD CX,ROW
MOV AH,0CH
MOV AL,PIX
INT 10H
INC LINE
CMP LINE,8
JNZ L2
INC Y_NUM
MOV AX,L_NUM
CMP Y_NUM,AX
JNZ L1
INC ROW
CMP ROW,SI
JNZ GO
POP SI
POP DX
POP CX
POP BX
POP AX
RET
DISP ENDP
DELAY PROC NEAR
PUSH CX
PUSH DX
MOV DX,DELAY1
D11: MOV CX,DELAY2
D12: LOOP D12
DEC DX
JNZ D11
POP DX
POP CX
RET
DELAY ENDP
CODE ENDS
END START
这是时间显示器,输入大写字母“Q”退出后是动画。
因为“心”和“严”图形是全屏的,无法截屏,大概运行情况如下(win7不能全屏)
六、体会
通过这次汇编语言的综合性课程设计,我觉得自己真的学到了不少的东西,加深了自己以前没掌握的知识,还学到不少的新知识。通过课程设计的编程和对编程过程中遇到的问题的思考,确实有效地提高了我对编程的认识和理解,也一定程度上提高了我的编程能力,弥补了的不足之处。同时,我通过这次课程设计,巩固了学过的知识,学会了将它们切实地用到编程当中。能用汇编语言和相应的顺序、选择、循环三大结构来结合想问题,进一步掌握的各个指令的功能,特别是转向指令,掌握了子程序的定义及调用,以及如何调用系统时间,如何让图形动起来。在整个课程设计中,最开始我选择动画,可是显示全屏后都不能截图,又另外做了时间显示,顺便把动画当做结束。
虽然完成了这次综合性实验,但一个小实验就花了很长时间,自己对汇编语言的掌握还需要进一步提高。