STACK SEGMENT STACK
DW 200H DUP(?) ;设置缓冲区
STACK ENDS
DATA SEGMENT
COUNT DB ?
LOS DB ?
BUF DB "OK"
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:STACK,DS:DATA
DELAY PROC
PUSH CX
PUSH DX
MOV DX,4FFFH
DL500:MOV CX,2801
DL10MS:LOOP DL10MS ;延迟10MS
DEC DX
JNZ DL500
POP DX
POP CX
RET
DELAY ENDP
DISP1 PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX ;保护现场
MOV AH,15 ;读当前显示器状态,返回当前显示方式至AL
INT 10H
MOV AH,0 ;设置显示方式,即AL
INT 10H
MOV CX,1 ;要显示字符个数
MOV DX,0 ;行号为0,列号为0
REPT:MOV AH,2 ;设置光标位,入口DH=0,DL=0
INT 10H
MOV AL,0DH ;读出音符图形
MOV BL,47H
MOV AH,9 ;在光标位置写字符,即AL,重复CX=1次,红底白色
INT 10H
CALL DELAY
SUB AL,AL
MOV AH,10 ;清除原图形
INT 10H
INC DH ;行号加1
ADD DL,2 ;列号加2
CMP DH,25
JNE REPT ;行号不等于25时,跳转
POP DX
POP CX
POP BX
POP AX ;恢复现场
RET
DISP1 ENDP
DISP2 PROC FAR
PUSH CX
PUSH BX
PUSH AX ;保护现场
MOV CX,3 ;设置“OK!”的长度为3
NEXTC:LODSB ;AL=[SI]
MOV AH,0EH ;写字符AL,并移动光标
MOV BX,06 ;设置颜色
INT 10H
CALL DELAY
LOOP NEXTC
POP AX
POP BX
POP CX ;恢复现场
RET
DISP2 ENDP
LOSINT PROC
PUSH AX
PUSH SI
STI ;允许中断
MOV AX,DATA
MOV DS,AX
INC COUNT
CMP COUNT,30
JNE GO ;中断次数不等于30,则跳转
MOV COUNT,0
MOV SI,OFFSET BUF
CALL DISP2
INC LOS
GO:POP SI
POP AX ;恢复现场
IRET
LOSINT ENDP
START:MOV AX,STACK
MOV SS,AX
MOV AX,DATA
MOV DS,AX
MOV AX,0
MOV ES,AX ;附加段清零
MOV AX,ES:[70H]
PUSH AX
MOV AX,ES:[72H]
PUSH AX
CLI
MOV AX,OFFSET LOSINT
MOV ES:
[70H],AX
MOV AX,SEG LOSINT
MOV ES:[72H],AX
STI
MOV LOS,0
MOV COUNT,0
AGAIN:CALL DISP1
CMP LOS,10 ;如果显示音符次数小于1
本文详细介绍了在BIOS环境下,如何使用汇编语言进行字符显示、延迟处理以及中断服务子程序的设计。通过设置缓冲区、调用延迟函数和显示函数,实现字符在屏幕上的动态显示,并通过中断服务程序控制显示次数和间隔,展示了底层系统编程的基本技巧。
2581

被折叠的 条评论
为什么被折叠?



