?? 匯編實現(xiàn)月歷.asm
字號:
DATAS SEGMENT
A1 DB "=====================================$"
A2 DB "*** * * * * Calendar * * * * ****$"
A3 DB "designer: Wubinghui $"
A4 DB "Please input the date:$"
A5 DB "Please input the date like :20090101$"
STR1 DB 9
DB ?
DB 9 DUP(?)
A6 DW 0
A7 DB 0
A8 DB "Date:$"
B DW ?
C1 DW 0
C2 DB 0
G DB 0
N DB ?
P DW ?
Y DB ?
WEEK DB "SUN MON TUE WED THU FRI SAT$"
YEAR DW ?
MONTH DW ?
DAY DW ?
WRONG DB "The date you input is wrong!Please try again$"
ROW DB 1
BUF1 DB 31,?,31,30,31,30,31,31,30,31,30,31
BUF2 DB 1,2,3,4,5,6,7,8,9,10,11,12
BUF3 DB ' 1',0AH,0DH,'$'
DB ' 2',0AH,0DH,'$'
DB ' 3',0AH,0DH,'$'
DB ' 4',0AH,0DH,'$'
DB ' 5',0AH,0DH,'$'
DB ' 6',0AH,0DH,'$'
DB ' 7',0AH,0DH,'$'
DB ' 8',0AH,0DH,'$'
DB ' 9',0AH,0DH,'$'
DB '10',0AH,0DH,'$'
DB '11',0AH,0DH,'$'
DB '12',0AH,0DH,'$'
DB '13',0AH,0DH,'$'
DB '14',0AH,0DH,'$'
DB '15',0AH,0DH,'$'
DB '16',0AH,0DH,'$'
DB '17',0AH,0DH,'$'
DB '18',0AH,0DH,'$'
DB '19',0AH,0DH,'$'
DB '20',0AH,0DH,'$'
DB '21',0AH,0DH,'$'
DB '22',0AH,0DH,'$'
DB '23',0AH,0DH,'$'
DB '24',0AH,0DH,'$'
DB '25',0AH,0DH,'$'
DB '26',0AH,0DH,'$'
DB '27',0AH,0DH,'$'
DB '28',0AH,0DH,'$'
DB '29',0AH,0DH,'$'
DB '30',0AH,0DH,'$'
DB '31',0AH,0DH,'$'
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AH,0 ;設置顯示方式
MOV AL,3 ;80*25彩色文本方式
INT 10H
MOV AH,6
MOV AL,0
MOV CH,0
MOV CL,0 ;清整個屏幕
MOV DH,80
MOV DL,80
MOV BH,10110000B ;前四位定義背景色,后四位定義前景色
INT 10H
MOV DH,ROW
MOV DL,2
CALL GBIAO
LEA DX,A1
CALL NINE
ADD ROW,2
MOV DH,ROW
MOV DL,1
CALL GBIAO
LEA DX,A2
CALL NINE
ADD ROW,2
MOV DH,ROW
MOV DL,8
CALL GBIAO
LEA DX,A3
CALL NINE
ADD ROW,2
MOV DH,ROW
MOV DL,1
CALL GBIAO
LEA DX,A5
CALL NINE
ADD ROW,2
REINPUT:MOV AH,6 ;輸入日期顯示藍色
MOV AL,0
MOV CH,ROW
MOV CL,23
MOV DH,ROW
MOV DL,30
MOV BH,10110001B
INT 10H
MOV DH,ROW
MOV DL,1
CALL GBIAO
LEA DX,A4
CALL NINE
MOV DH,ROW
MOV DL,23
CALL GBIAO
LEA DX,STR1 ;輸入日期,保存在緩沖區(qū)STR1中
MOV AH,10
INT 21H
ADD ROW,2
LEA DI,STR1+2 ;DI指向日期輸入串的首地址
MOV CL,4
MOV AX,0
P1: MOV BL,[DI] ; 取字符送到BL
SUB BL,30H ;字符減去30H,轉化為真值
MOV BH,0
MOV P,10
MUL P
ADD AX,BX
INC DI ;DI指向下一個字符
DEC CX ;長度減一
JNZ P1
MOV YEAR,AX
CALL PR ;調用判斷平年還是閏年的程序
JC L1 ;有進位,借位,跳轉到L1,輸出閏年,否則順序執(zhí)行,是平年
LEA DI,BUF1
MOV [DI+1],BYTE PTR 28 ;平年把28送入BUF1中
JMP L2
L1:
LEA DI,BUF1
MOV [DI+1],BYTE PTR 29 ;閏年把29送入BUF1中
L2:
LEA DI,STR1+6
MOV CL,2
MOV AX,0
P2: MOV BL,[DI]
SUB BL,30H
MOV BH,0
MOV P,10
MUL P
ADD AX,BX
INC DI
DEC CX
JNZ P2
MOV MONTH,AX ;獲得月份值
LEA DI,STR1+8
MOV CL,2
MOV AX,0
P3: MOV BL,[DI]
SUB BL,30H
MOV BH,0
MOV P,10
MUL P
ADD AX,BX
INC DI
DEC CX
JNZ P3
MOV DAY,AX ;獲得輸入的日數(shù)
CMP MONTH,1 ;月份<1,報錯
JC ERROR
CMP MONTH,13 ;月份>12,報錯
JNC ERROR
CMP DAY,1
JC ERROR
CALL GETN ;顯示日歷,調用GETN子程序返回N的值,N為每月第一天是星期幾
MOV DI,OFFSET BUF1
DEC MONTH
DEC MONTH
ADD DI,MONTH ;取出每個月的天數(shù)--->G
MOV CL,[DI]
MOV G,CL
CMP BYTE PTR DAY,CL ;輸入的天如果超過這個月的最大天數(shù),報錯
JA ERROR
MOV DH,ROW
MOV DL,10
CALL GBIAO
LEA DX,A8
CALL NINE
MOV DH,ROW
MOV DL,16
CALL GBIAO
LEA DI,STR1+2
MOV CL,8
MOV AX,0
DATE: MOV BL,[DI]
MOV DL,BL
MOV AH,2
INT 21H
INC DI
DEC CX
JNZ DATE
ADD ROW,1
MOV AH,6
MOV AL,0
MOV CH,ROW
MOV CL,3
MOV DH,ROW
MOV DL,0
MOV BH,10110100B
INT 10H ;SUN SAT設置紅色
MOV AH,6
MOV AL,0
MOV CH,ROW
MOV CL,30
MOV DH,ROW
MOV DL,33
MOV BH,10110100B
INT 10H
MOV DH,ROW
MOV DL,0
CALL GBIAO
LEA DX,WEEK
CALL NINE ;顯示SUN*******************SAT
INC ROW
MOV SI,OFFSET BUF3
MOV AL,5
MUL N
MOV B,AX
CMP B,35 ;如果每個月一號是星期天,顯示一號的行號減2
JC POS
SUB ROW,1
POS: MOV DH,ROW ;每個月的一號的光標位置
MOV DL,BYTE PTR B
CALL GBIAO
MOV A7,31
CMP DL,A7
JBE POS1 ;DL<31,跳轉到POS1,否則行加1,列從0開始
ADD ROW,1 ;兩行日期間隔
MOV AX,0
MOV B,AX
MOV AH,6 ;日歷周末設置紅色顯示
MOV AL,0
MOV CH,ROW
MOV CL,3
MOV DH,ROW
MOV DL,0
MOV BH,10110100B
INT 10H
JMP POS
POS1: CMP DL,30 ;周六的日歷顯示紅色
JC NORED
MOV AH,6
MOV AL,0
MOV CH,ROW
MOV CL,30
MOV DH,ROW
MOV DL,33
MOV BH,10110100B
INT 10H
NORED: MOV DX,SI
CALL NINE ;在當前光標位置顯示數(shù)字
ADD SI,5
ADD B,5 ;兩個日期的顯示距離
DEC G
JNZ POS
JMP EXIT
ERROR: DEC ROW
MOV DH,ROW
MOV DL,1
CALL GBIAO
LEA DX,WRONG
CALL NINE
INC ROW
JMP REINPUT
EXIT: MOV AH,4CH
INT 21H
GBIAO PROC
PUSH AX
PUSH BX
MOV AH,2 ;2號功能調用
MOV BH,0
INT 10H ;定光標
POP BX
POP AX
RET
GBIAO ENDP
NINE PROC
PUSH AX
MOV AH,9 ;9號功能調用
INT 21H
POP AX
RET
NINE ENDP
PR PROC ;判斷是平年還是閏年
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX,YEAR
MOV CX,AX
MOV DX,0
MOV BX,4
DIV BX
CMP DX,0 ;DX中為余數(shù)
JNZ B1
MOV AX,CX
MOV BX,100
DIV BX
CMP DX,0
JNZ B2
MOV AX,CX
MOV BX,400
DIV BX
CMP DX,0
JZ B2
B1: CLC ;CF=0
JMP B3
B2: STC ;CF=1
B3: POP DX
POP CX
POP BX
POP AX
RET
PR ENDP
GETN PROC ;獲得這個月的一號是星期幾
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BL,100
MOV AX,YEAR
DIV BL
MOV C2,AL
MOV Y,AH
MOV CL,2
MOV BL,C2
SHR BL,CL ;int(c/4)
SHL C2,1 ;2*c
SUB BL,C2
ADD BL,Y
SHR Y,CL ;int(y/4)
ADD BL,Y ;int(c/4)-2*c+y+int(y/4)
INC MONTH
CMP MONTH,3 ;是一月,轉移
JC J1 ;是二月,轉移
CMP MONTH,4
JC J1
XOR AH,AH
MOV AX,MONTH
MOV DX,13
MUL DX
MOV CX,5
DIV CX
XCHG AX,BX
CBW
XCHG AX,BX
ADD BX,AX ;int(c/4)-2*c+y+int(y/4)+int(13*(m+1)/5)
MOV AX,BX
MOV CL,7
IDIV CL
CMP AH,0
JG SKIPADD
ADD AH,7
SKIPADD:
MOV BL,AH
MOV N,BL
JMP J3
J1: MOV BL,100
MOV AX,YEAR
DIV BL
MOV C2,AL
MOV Y,AH
CMP Y,1 ;如果年份后兩位是00,則前一年是99
JNC J2
ADD Y,100
J2: SUB Y,1
MOV CL,2
MOV BL,C2
SHR BL,CL
SHL C2,1
SUB BL,C2
ADD BL,Y
SHR Y,CL
ADD BL,Y
ADD MONTH,12
XOR AH,AH
MOV AX,MONTH
MOV DX,13
MUL DX
MOV CX,5
DIV CX
XCHG AX,BX
CBW
XCHG AX,BX
ADD BX,AX
MOV AX,BX
MOV CL,7
IDIV CL
CMP AH,0
JG SKIPADD1
ADD AH,7
SKIPADD1:
MOV BL,AH
MOV N,BL
SUB MONTH,12
J3: POP DX
POP CX
POP BX
POP AX
RET
GETN ENDP
CODES ENDS
END START
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -