📄 1111.asm
字号:
SECOND PROC NEAR ;1秒延时子程序
PUSH AX
PUSH BX
PUSH DX
MOV AH,00H
INT 1AH ;读计时单位
ADD DX,1
MOV BX,DX
L1: MOV AH,00H
INT 1AH
CMP DX,BX ;满1秒?,否,继续累计
JNZ L1
POP DX
POP BX
POP AX
RET
SECOND ENDP
;-------------------------------------
clear proc near
;save registers
push ax
push bx
push cx
push dx
;clear screen
;定窗口显示时钟
mov ah,7 ;to scroll downward function
mov al,0 ;code to blank scree
mov bh,70h ;reverse video attribute
mov ch,0 ;upper left row
mov cl,0 ;upper left column
mov dh,0 ;lower right row
mov dl,20 ;lower left column
int 10h ;call video ROM
;定位
mov ch,0
mov cl,24
mov ah,01h
int 10h
mov dh,0
mov dl,0
mov bh,0
mov ah,02h
int 10h
;locate cursor
mov dx,0
mov ah,2 ;to locate column
int 10h ;call video BIOS
;restore registers
pop dx
pop cx
pop bx
pop ax
ret
clear endp
;------------------------
clall2 proc near
push ax
push bx
push cx
push dx
mov ah,6 ;to scroll up screen
mov al,0 ;blank screen
mov bh,7 ;blank line
mov ch,0 ;upper left row
mov cl,0 ;upper left column
mov dh,24 ;lower right row
mov dl,79 ;lower left column
int 10h ;call video BIOS
pop dx
pop cx
pop bx
pop ax
ret
clall2 endp
;---------------------------------------------
mb PROC far
push ax
push bx
push cx
push dx
MOV AH,0 ;检测键盘,有键按下才开始
INT 16H
;设置中断向量
CLI ;清中断标志
CLD ;清方向标志
MOV AX,0000H ;设置中断向量
MOV DS,AX
MOV SI,0020H
LODSW
MOV BX,AX
LODSW
PUSH AX ;
PUSH BX ;
MOV AX,DATA ;
MOV DS,AX
MOV AX,0000H ;
MOV ES,AX ;
MOV DI,0020H ;
MOV AX,OFFSET TIMER ;
STOSW
MOV AX,SEG TIMER ;
STOSW
;初始化8253
MOV AL,00110110B ;0计数器,工作方式3,先写最底有效字节,再写最高有效字节
OUT 43H,AL
MOV AX,10923 ;设初值
OUT 40H,AL
MOV AL,AH
OUT 40H,AL
IN AL,21H
PUSH AX
MOV AL,0FCH ;中断屏蔽,只对键盘irq1和电子时钟基准irq0开中断
OUT 21H,AL
STI
call clearall ;清全屏
FOREVER:
call clear1 ;定位清屏
call show ;显示秒表
MOV AH,0BH ;检测有键按下否?
INT 21H
CMP AL,00H ;AL=0,无键按下
JZ FOREVER ;无键按下,转LOP
MOV AH,08H ;有键,读键值AL
INT 21H
CMP AL,'d'
JZ EXIT ;是d则退出
cmp al,'m' ;是m则记录数据
jnz g
MOV AH,2
MOV BH,0
MOV DH,row
MOV DL,25
INT 10H
call show
inc row
g: cmp al,'r' ;是r则重新开始计时
jnz FOREVER
mov m2,'0' ;归零
mov m1,'0'
mov s2,'0'
mov s1,'0'
mov ms2,'0'
mov ms1,'0'
mov row,0
call clearall
JMP FOREVER ;显示秒表
EXIT:
pop dx
pop cx
pop bx
pop ax
ret
mb ENDP
;-------------------------------------------------
show proc near
push ax
push bx
push cx
MOV BX,OFFSET m2 ;读m2首地址
MOV CX,8 ;循环8次
DISP1: MOV AL,[BX] ;取bx对应的m2值
CALL DISPCHR ;显示[bx]
INC BX ;指向下一存储单元
LOOP DISP1
MOV AL,0DH ;回车
CALL DISPCHR
pop cx
pop bx
pop ax
ret
show endp
;----------------------------------------
clear1 proc near
push ax
push bx
push cx
push dx
;clear screen
;定宽
mov ah,7 ;to scroll up screen
mov al,0 ;blank screen
mov bh,70h ;blank line
mov ch,1 ;upper left row
mov cl,0 ;upper left column
mov dh,0 ;lower right row
mov dl,7 ;lower left column
int 10h ;call video BIOS
;din wei
mov ch,0
mov cl,24
mov dh,row
mov dl,0
mov bh,0
mov ah,02h
int 10h
;locate cursor
mov dx,0
mov ah,2 ;to locate column
int 10h ;call video BIOS
pop dx
pop cx
pop bx
pop ax
ret
clear1 endp
;------------------------
clearall proc near
push ax
push bx
push cx
push dx
mov ah,6 ;to scroll up screen
mov al,0 ;blank screen
mov bh,7 ;blank line
mov ch,0 ;upper left row
mov cl,0 ;upper left column
mov dh,24 ;lower right row
mov dl,79 ;lower left column
int 10h ;call video BIOS
pop dx
pop cx
pop bx
pop ax
ret
clearall endp
;------------------------------
DISPCHR PROC NEAR
PUSH BX
MOV BX,0 ;在0页显示
MOV AH,14 ;调用bios
INT 10H
POP BX
RET
DISPCHR ENDP
;------------------------------
TIMER PROC FAR
PUSH AX
INC ms1
CMP ms1,'9'
JLE TIMEXT
MOV ms1,'0' ;大于‘9’,ms1位清零
INC ms2
CMP ms2,'9'
JL TIMEXT
MOV ms2,'0' ;大于‘9’,ms2位清零
INC s1
CMP s1,'9'
JLE TIMEXT
MOV s1,'0' ;大于‘9’,s1位清零
INC s2
CMP s2,'6'
JL TIMEXT
MOV s2,'0' ;大于‘5’,s2位清零
INC m1
CMP m1,'9'
JLE TIMEXT
MOV m1,'0' ;大于‘9’,m1位清零
INC m2
CMP m2,'6'
JL TIMEXT
MOV m2,'0' ;大于‘5’,m2位清零
TIMEXT: MOV AL,20H
OUT 20H,AL
POP AX
IRET
TIMER ENDP
;mov ah,4ch
;int 21h
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -