汇编语言程序设计期末大作
汇编语言程序设计期末大作业
仔细阅读课本第十章有关写显示缓存的方法以及INT 10H功能调用说明。参考附件给出的图形显示方法,完成期末作业。以下题目从易到难,期末分值与难度大小成正比。可任选一题,完成后提交纸质报告,报告内容包含题目、算法流程、模块功能说明、源代码(含详细注释)、实验结果截图、总结。作业由班长、学习委员收齐后于日期为2013年6月24日交(具体时间到时候联系)。
题1. 游戏程序常常用随机数来控制其图形在屏幕上移动。请编写一程序,用随机数来控制笑脸符(ASCII码02H) 显示的位置。笑脸符每次显示的列号总是递增1。而行的位置可能是前次的上一行,下一行或同一行,这根据随机数是0、1或2来决定,当行号变为0、24或列号变为79时显示结束。笑脸在每个位置上显示若干毫秒(具体时间自行设计)。(提示:INT 1AH 的AH=0是读当前时间的功能调用,利用该功能返回的随时都在变化的时间值作为产生随机数的基数。见课本第十章练习) ;
题2. 参考附件实例,显示一如下形状的拖拉机从左向右行驶;
题3. 参考附件实例,将一小球(圆)沿着如半径为300像素的上半圆周移动(如同);
题4. 参考附件实例,将一小球沿着抛物线形式起降,运行路线如下图所示(建议选用抛物线方程y-y0=a*(x-x0)(x-x0),每次顶点高度是上次高度的80%);
题5. 参考附件实例,将实例中的空心圆编程实心圆显示完成题2-题4中一个。难度级在相应题目上提高半级。
附件说明:
(1) 通过INT 10H 的不同的功能号(AH )的选择可实现获取当前显示器工
作方式、设置显示器显示方式。
(2) 在图形工作方式下调用INT 10H可以实现用颜色写像素。查看附件代码
中的WritePixel 子程序。
(3) 画水平线段和画圆周曲线查看子程序HorLine 和Circle ,以上题目中可
能需要自行添加画垂直直线段的子程序。
(4) 注意画线、画圆周子程序都使用了写点子程序WritePixel ,而写点子程
序对点先去原来颜色,颜色字节的每个二进制位求反来显示该像素,这样做的好处是要擦除画的点、线时,只要再反色写点或画线就可以了。
(5) 花大概3-4天时间仔细阅读附件实例,后只要1-2天的时间修改实例就
可以做完上面任意一个题目。
附件:
;This example can introduce you to finish the Assembly excise quickly.
;Chenggen Yang, NanChang University, 2013.06.12
STACK SEGMENT STACK
DW 100H DUP(?)
TOS EQU $
STACK ENDS
; 主程序段
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AX,STACK
MOV SS,AX
MOV SP,TOS
MOV AH,0FH
INT 21H
PUSH AX
MOV AX,12H
INT 10H
MOV DX,400
MOV SI,0
MOV DI,639
CALL HorLine
MOV CX,9
MOV SI,CX
MOV DI,400
SUB DI,CX
; 下面代码显示从左到右滚动的圆周
DrawAgain:
CALL Circle
CALL Delay
CALL Circle
CALL Delay ; 设置堆栈栈顶 ; 获取当前的显示方式,并将它保护到堆栈里 ; 将屏幕显示方式设置为VGA (640*480)彩色方式; 在第402行画直线 ;CX 存放圆周半径 ;SI 和DI 分别存放圆心横坐标和纵坐标 画圆周 ; 延时 擦除圆周 ; 延时 ; ;
INC SI
CMP SI,640
JNZ DrawAgain ; 圆心从左到右循环画圆和擦除圆
; 下面代码显示落下和回弹的小球(圆周)
MOV BX,CX ;CX 存放圆周半径
NEG BX
ADD BX,400
MOV DX,BX ;DX 存放小球落地是圆心纵坐标
MOV BX,CX ;BX 存放小球弹起到顶点的纵坐标
MOV
MOV
MOV
L_DOWN:
CALL
CALL
CALL
CALL
TEST
JNZ
INC
CMP
JBE
PUSH
PUSH
PUSH
MOV
SUB
SHL
SHL
XOR
MOV
DIV
MOV
POP
POP
POP
AX,0 SI,320 DI,CX Circle Delay Circle Delay AX,1 L_UP DI DI,DX L_DOWN AX DX CX AX,DX AX,BX AX,1 AX,1 DX,DX BX,5 BX BX,AX CX DX AX ;AX 存放小球是落下(0)还是上升(1)的状态 ;SI 存放小球落下和弹起所在的横坐标。 ; 对DI 加1或减1来实现小球下落和上升。(SI,DI )为圆心。 ; 转向圆上升 ; 未到达底部继续下降 ; 到达底部计算下一次上升高度
CMP BX,0 ; 下次上升高度是0, 则结束 JZ EXIT
NEG BX
ADD BX,DX ; 上升顶点行
MOV AX,1
JMP L_DOWN
L_UP: ; 上升处理
DEC DI
CMP DI,BX
JAE L_DOWN ; 未到达顶点,继续上升
MOV AX,0
JMP L_DOWN ; 到达顶点,准备下降
EXIT:
POP AX ; 堆栈保存的原来显示方式出桟 MOV AX,2
INT 10H ; 恢复原来的显示方式
MOV AH,4CH
INT 21H
CODE ENDS
; 定义子程序的段
PCODE SEGMENT
; 画像素点(DX,CX): 像素点(DX,CX )反色显示
WritePixel PROC FAR
PUSH BX
PUSH AX
MOV BL,0 ; 0页
MOV AH,0DH
INT 21H
XOR AL,0FFH
MOV BL,0
MOV AH,0CH
INT 10H
POP AX
POP BX
RET
WritePixel ENDP
;HorLine: 画行为DX ,列从S 到DI 的水平线
HorLine PROC FAR
PUSH CX
PUSH SI
PUSH DI
CMP SI,DI
JBE OK_LR
XCHG SI,DI
OK_LR:
MOV CX,SI
LOP_DRAW:
CALL WritePixel
INC CX
CMP CX,DI
JBE LOP_DRAW
POP DI
POP SI
POP CX
RET
HorLine ENDP
; 画圆周八上个对称点
WrCircle PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
MOV CX,SI
ADD CX,AX
MOV DX,DI
ADD DX,BX
CALL WritePixel
MOV CX,SI
SUB CX,AX
MOV DX,DI
ADD DX,BX
CALL WritePixel
MOV CX,SI
ADD CX,AX
MOV DX,DI
SUB DX,BX
CALL WritePixel
MOV CX,SI
SUB CX,AX
MOV DX,DI
SUB DX,BX
CALL WritePixel
MOV CX,SI
ADD CX,BX
MOV DX,DI
ADD DX,AX
CALL WritePixel
MOV CX,SI
SUB CX,BX
MOV DX,DI
ADD DX,AX
CALL WritePixel
MOV CX,SI
ADD CX,BX
MOV DX,DI
SUB DX,AX
CALL WritePixel
MOV CX,SI
SUB CX,BX
MOV DX,DI
SUB DX,AX
CALL WritePixel
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
WrCircle ENDP
; 以点(SI,DI) 为圆心画半径为CX 的圆周曲线
Circle PROC FAR
PUSH AX
PUSH BX
PUSH DX
MOV AX,0
MOV BX,CX ;CX为半径
MOV DX,1
SUB DX,CX
CALL
AGAIN:
CMP
JAE
INC
CMP
JGE
PUSH
SHL
ADD
ADD
POP
JMP
OTHER:
PUSH
SUB
SHL
ADD
ADD
POP
DEC
WritePoints:
CALL
JMP
CircleOK:
POP
POP
POP
RET WrCircle AX,BX CircleOK AX DX,0 OTHER AX AX,1 AX,3 DX,AX AX WritePoints AX AX,BX AX,1 AX,5 DX,AX AX BX WrCircle AGAIN DX BX AX
Circle ENDP
; 延时程序,可修改子程序中的参数20,60000以改变延时时间
Delay PROC FAR
PUSH CX
PUSH DX
PUSH BX
MOV BX,20
L0: MOV CX,60000
L1: MOV DX,CX
L2: DEC DX
JNA L2
LOOP L1
DEC BX
JNZ L0
POP BX
POP DX
POP CX
RET
Delay ENDP
PCODE ENDS
END START