📄 终结版.asm
字号:
MOV DH,22
MOV DL,47
CALL b1002
MOV DL,'5'
MOV AH,2
INT 21h
MOV DH,22
MOV DL,32
CALL b1002
MOV DL,'7'
MOV AH,2
INT 21h
MOV DH,19
MOV DL,26
CALL b1002
MOV DL,'8'
MOV AH,2
INT 21h
MOV DH,11
MOV DL,25
CALL b1002
MOV DL,'1'
MOV AH,2
INT 21h
MOV DH,11
MOV DL,26
CALL b1002
MOV DL,'0'
MOV AH,2
INT 21h
MOV DH,8
MOV DL,30
CALL b1002
MOV DL,'1'
MOV AH,2
INT 21h
MOV DH,8
MOV DL,31
CALL b1002
MOV DL,'1'
MOV AH,2
INT 21h
MOV DH,15
MOV DL,55
CALL b1002
MOV DL,'3'
MOV AH,2
INT 21h
MOV DH,23
MOV DL,40
CALL b1002
MOV DL,'6'
MOV AH,2
INT 21h
MOV DH,15
MOV DL,24
CALL b1002
MOV DL,'9'
MOV AH,2
INT 21h
RET
skin ENDP
msg PROC NEAR ;in bp为输出字符串地址
PUSH ES
PUSH DS
POP ES
MOV CX,40h
MOV AL,0
MOV BX,2
MOV AH,13h
INT 10h
POP ES
RET
msg ENDP
;*****************in dl out al
bcd2 PROC NEAR
MOV AH,0
MOV AL,DL
SHR AL,4
AND AL,0fh
MOV CL,10
MUL CL
MOV CL,AL
MOV AL,DL
AND AL,0fh
ADD AL,CL;;;;; bcd转16进制
RET
bcd2 ENDP
;r0=bx 圆心cx 行 dx列********************
yuan PROC
PUSHa
MOV CX,360
MOV AX,0
yuan_kk1: PUSH CX
PUSH AX
MOV CX,y0
MOV DX,x0
CALL enovate
CALL dian
POP AX
ADD AX,1
POP CX
LOOP yuan_kk1
POPa
RET
yuan ENDP
;*****************in ax度数 bx=半径r长度,cx 列 dx行 圆心 out x,y************
enovate PROC NEAR
PUSHa
PUSH DX
PUSH AX
PUSH CX
CALL SIn
MOV DX,0
MOV CX,BX
DIV CX
POP CX
CMP SI,1
JE ian
ADD AX,CX
JMP enovate_kk1
ian: SUB CX,AX
MOV AX,CX
enovate_kk1: MOV y,AX
POP AX
CALL cos
MOV DX,0
MOV CX,BX
DIV CX
POP DX
CMP SI,1
JE ian2
ADD AX,DX
JMP enovate_kk2
ian2: MOV CX,DX
SUB CX,AX
MOV AX,CX
enovate_kk2: MOV x,AX
POPa
RET
enovate ENDP
;***********************************************---------------------------------
;**************返回原位置显示**********
;************************************
;入口参数:无
;函数功能:使时钟原位置走时并显示
;出口参数;无
;************************************
BACK_LOOP PROC
PUSH BX
PUSH DX
PUSH AX
PUSH CX
MOV BH,PAG ;显示页号
MOV DH,05H ;
MOV DL,00H ;列
MOV AH,02H;设置光标位置
INT 10H
;***********隐藏光标********
MOV AX, 100H
MOV CX, 2000H
INT 10H
;***************************
POP CX
POP AX
POP DX
POP BX
RET
BACK_LOOP ENDP
;*************************************
; 电子时钟显示程序 *
;入口参数 无 *
; *
;出口参数 无 *
; 可以直接显示 *
;*************************************
CLOCK PROC
PUSH BX
PUSH AX
MOV AH,2AH ;DOS功能调用,取日期
INT 21H ;CX--年,DH:DL--月:日(二进制)
MOV YEAR,CX ;保存数据(年月日)
MOV MONTH,DH
MOV DATE,DL
;************将CX(即YEAR)拆分成高位和低位*************************
MOV AX,YEAR
MOV BL,100;除以100
DIV BL
MOV YEAR_H,AL;商存AL,作高位
MOV YEAR_L,AH;余数存AH,作低位
;*****************************************************************
MOV AL,YEAR_H ;显示年份(高位)
CALL F2T10
MOV AL,YEAR_L ;显示年份(低位)
CALL F2T10
LEA DX,CHAR1;显示提示性字符"-"
MOV AH,09H
INT 21H
MOV AL,MONTH ;显示月份
CALL F2T10 ;调用二进制转十进制子程序
LEA DX,CHAR1;显示提示性字符"-"
MOV AH,09H
INT 21H
MOV AL,DATE ;显示日期
CALL F2T10 ;调用二进制转十进制子程序
;*************年月日显示完毕************************
MOV AH,2CH ;取系统时间
INT 21H
MOV HOUR1,CH ;保存数据(时分秒)
MOV MIN1,CL
MOV SEC1,DH
LEA DX,NOTE2;回车换行
MOV AH,09H
INT 21H
MOV AL,HOUR1 ;显示小时
CALL F2T10
LEA DX,CHAR2;显示提示性字符":"
MOV AH,09H
INT 21H
MOV AL,MIN1 ;显示分钟
CALL F2T10
LEA DX,CHAR2;显示提示性字符":"
MOV AH,09H
INT 21H
MOV AL,SEC1 ;显示秒钟
CALL F2T10
;*************时分秒显示完毕**********************
POP AX
POP BX
RET
CLOCK ENDP
;*************************************
; 二进制转化为十进制子程序 *
;入口参数 AL--要转化的二进制数据 *
; *
;出口参数 BUF0--存放转化为的 *
; 十进制字符串 *
; 可以直接显示 *
;*************************************
F2T10 PROC
PUSH BX
PUSH DX
PUSH SI
PUSH AX
LEA SI,BUF0
OR AL,AL
JNS PLUS
NEG AL
MOV [SI],BYTE PTR '-'
INC SI
PLUS: MOV AH,0
MOV BX,10;10---要转换成十进制
;*****加0******
CMP AL,9
JA CALL_FUC
MOV [SI],'0'
INC SI
;************
CALL_FUC:CALL RADIX1
MOV [SI],BYTE PTR '$'
MOV DX,OFFSET BUF0
MOV AH,9
INT 21H
POP AX
POP SI
POP DX
POP BX
RET
F2T10 ENDP
;*************************************
; 进制转换处理程序 *
;入口参数 AX--要转化的二进制数据 *
; BX--要转换成BX进制的数据 *
;出口参数 *
;*************************************
RADIX1 PROC
PUSH CX
PUSH DX
MOV CX,0
LOP11: MOV DX,0
DIV BX
PUSH DX
INC CX
OR AX,AX
JNE LOP11
LOP2: POP AX
CMP AL,10
JB L11
ADD AL,7
L11: ADD AL,30H
MOV [SI],AL
INC SI
DEC CX
JNE LOP2
POP DX
POP CX
RET
RADIX1 ENDP
;****************************以下是闹钟程序部分**************************
;*************闹钟显示*************
;*********************
;函数功能:显示闹钟
;*********************
DIS_ALARM1 PROC NEAR
PUSH DX
PUSH AX
PUSH BX
PUSH CX
LEA DX,NOTE12;显示提示性语句"---------ALARM---------"
MOV AH,09H
INT 21H
LEA DX,NOTE2;回车换行
MOV AH,09H
INT 21H
MOV AL,AL_HOUR ;显示小时
CALL F2T10
LEA DX,CHAR2;显示提示性字符":"
MOV AH,09H
INT 21H
MOV AL,AL_MIN ;显示分钟
CALL F2T10
LEA DX,CHAR2;显示提示性字符":"
MOV AH,09H
INT 21H
MOV AL,AL_SEC ;显示秒钟
CALL F2T10
;*************时分秒显示完毕**********************
POP CX
POP BX
POP AX
POP DX
RET
DIS_ALARM1 ENDP
;*********闹钟触发***********
;*****************
;入口参数:无
;函数功能:判断闹钟时间是否到
;*****************
ALARM_START PROC
PUSH AX
MOV AL,HOUR1
CMP AL,AL_HOUR;比较小时--HOUR与AL_HOUR
JNZ RETU3
MOV AL,MIN1
CMP AL,AL_MIN;比较分钟
JNZ RETU3
CALL ALARM;闹钟时间到,调用闹铃程序(发出声音)
RETU3:
POP AX
RET
ALARM_START ENDP
;**************闹铃**************
;*********************
;函数功能:闹铃响
;*********************
ALARM PROC NEAR
PUSH DS
PUSH DX
PUSH CX
PUSH BX
PUSH AX
CMP flag,1
JZ KEEP_ON
RET
KEEP_ON: LEA SI, MUS_FREQ
LEA BP, DS: MUS_TIME
FREQ: MOV DI, [SI]
CMP DI, -1 ;遇到-1,结束响零
JE END_MUS
MOV BX, DS: [BP]
CALL GEN_SOUND
ADD SI, 2
ADD BP, 2
JMP FREQ
END_MUS: POP AX
POP BX
POP CX
POP DX
POP DS
RET
ALARM ENDP
;**********发声程序***************
GEN_SOUND PROC near
PUSH AX ;先保存各个寄存器
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL, 0B6H ;8253通道地址
OUT 43H, AL
MOV DX, 12H
MOV AX, 533H*896
DIV DI
OUT 42H, AL
MOV AL, AH
OUT 42H, AL
IN AL, 61H
OR AL, 3
OUT 61H, AL
WAIT1: MOV CX, 700
DE: LOOP DE
DEC BX
JNZ WAIT1
MOV AL, AH
OUT 61H, AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
GEN_SOUND ENDP
;******************************************************----------------------------------
MAIN ENDP
;------------------------------------------------------
CODE_SEG ENDS
;******************************************************
END START ;程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -