返回列表 发帖

[转帖]汇编小程序

最近写了一个小课程设计,现在已写好,于是拿来,与大家分享,希望能促进像我这样刚学汇编的朋友们,对ASM更有兴趣:)
不过,此程序有点小问题,(也许很多,呵呵,俺是新手嘛)
2000与XP下还能正常现示,可是,在98下和纯DOS下就不搞不明白了,呵呵,希望大家帮忙看看,怎么搞一下
编译成EXE后,运行,你可写入若干个字母,到回车结束,之后,字符会,在固定位下落下,把最下一行绿块砸掉:)
;定义数据段
DSEG SEGMENT
DEEP DW 2000 ;控制延时时间
COUN1 DW 0 ;输入字符的个数
DATA DB 30 DUP(0) ;存入字符区
DSEG ENDS
;定义堆栈段
SSEG SEGMENT STACK
STK DB 50 DUP(0)
SSEG ENDS
;主程序体
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START: MOV AX,DSEG
MOV DS,AX
MOV SS,AX
MOV SP,SIZE STK
CALL INPUT1 ;输入字符
CALL CLEAR ;清屏
CALL BLUESQU ;输出最底行绿块
CALL DROP ;下落字符
MOV AH,4CH
INT 21H
;输入字符子程序
INPUT1 PROC NEAR
XOR AL,AL
XOR DI,DI
LEA SI,DATA ;取存字符的地址
INPUT2: MOV AH,1H
INT 21H
CMP AL,13 ;回车则返OVER1
JZ OVER1
;判断是不是大写字母及小写字母
CMP AL,65
JB INPUT2
CMP AL,90
JBE INPUT3
CMP AL,61H
JB INPUT2
CMP AL,7AH
JA INPUT2
;将输入的字符存入数据存储区
INPUT3: MOV [SI],AL
INC SI ;指向一个存储区
INC DI ;记下输入字符的个数
JMP INPUT2 ;跳到INPUT2以取下一个字符
OVER1: MOV COUN1,DI ;将字符个数存入数据段COUN1
RET
INPUT1 ENDP
;清屏以空格填满全屏
CLEAR PROC NEAR
PUSH ES
PUSH AX
PUSH DI
PUSH CX
MOV AX,0B800H
MOV ES,AX
MOV DI,0
MOV AL,' '
MOV AH,07H
MOV CX,80*25
CLD
REP STOSW
POP CX
POP DI
POP AX
POP ES
RET
CLEAR ENDP
;输出绿块在最底行
BLUESQU PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
;设置光标位置
MOV AH,2H
MOV DH,23 ;24行
MOV DL,0 ;第一列
MOV BH,0 ;0页面
INT 10H
;输出绿色块以充满一行
MOV DL,8
MOV AL,0DBH
MOV BL,2
MOV CX,80
MOV AH,9
INT 10H
CALL DELAY1 ;延时以显示清楚动画的动作
POP DX
POP CX
POP BX
POP AX
RET
BLUESQU ENDP
;延时时间子程序
DELAY1 PROC NEAR
PUSH AX
PUSH CX
MOV AX,3000
DELAY2: MOV CX,DEEP
DELAY3: LOOP DELAY3
DEC AX
JNZ DELAY2
POP CX
POP AX
RET
DELAY1 ENDP
;输出下落的字符
DROP PROC NEAR
;设置光标类型
MOV AH,01H
MOV CL,0FFH
MOV CH,0FFH
INT 10H
MOV DI,COUN1 ;取字符个数
MOV DH,2 ;重第二行开始
MOV BL,2 ;字符属性
XOR CX,CX ;清0
XOR BH,BH ;清0
LEA SI,DATA ;取第一个字符的地址
DROP1: MOV AL,[SI] ;取第一个字符
;计算取到的字符应显示的所在列数
mov dl,al
sub dl,65
add dl,10
;设置光标位置
MOV AH,2H
INT 10H
;以TTY格式填空格以使屏蔽掉字符
MOV AH,0EH
MOV BL,04H
INT 10H
CALL DELAY1 ;延时以使动作更明显
;重设置光标位置
MOV AH,2H
INT 10H
;以TTY格式填空格以使屏蔽掉字符
MOV AL,20H
MOV AH,0EH
INT 10H
INC DH ;移到一行
CMP DH,24 ;与第二十五行,最底行比较
JNZ DROP1 ;没到最底行转到DROP1,使字符继续下落
;设置光标
MOV AH,2H
INT 10H
DEC DI ;字符个数减一,以控制循环
CMP DI,0 ;看是否是最后一个字符
JZ OVER2 ;是则结束
;为取下一个字符准备
INC SI ;指向下一个字符
INC BL ;砸落绿块
MOV DH,1 ;回到第一行
JMP DROP1 ;再取下一个字符
OVER2:
RET
DROP ENDP
;结束程序
CSEG ENDS
END START
本文来自: 华夏黑客同盟论坛
白痴人才。

顶起。
白痴人才。

TOP

顶起。
白痴人才。

TOP

厉害就是看不懂

TOP

厉害就是看不懂

TOP

返回列表