汇编能够实现显示当前日期,并输出当前日期是这一年中第多少天及第二天的日期。马上要交作业了,求大神!!
汇编能够实现显示当前日期,并输出当前日期是这一年中第多少天及第二天的日期。马上要交作业了,求大神!!
可是需要完全用汇编语言写,现在写了一点,还有错误不会改,你能帮我看下吗?
;*************清屏宏定义***********
CLEAR_SCREEN MACRO ;宏定义,设置七个参数
MOV AH,06H ;AH=06屏幕初始化或上卷指定的行
MOV AL,00H ;清屏
INT 10H ;调用BIOS功能
MOV AH,02H ;制定光标位置
MOV BH,00H ;第0页
MOV DH,00H ;第0行
MOV DL,00H ;第0列
INT 10H
ENDM
;*********定义堆栈段********
STACK SEGMENT
DB 200 DUP(?)
tos label byte
STACK ENDS
;*********定义数据段********
DATA SEGMENT
STR00 DB' |********** Welcome! **********|$' ;提示界面
STR01 DB 0DH,0AH,' |* *|$'
STR02 DB 0DH,0AH,' |* This is a display program. *|$'
STR03 DB 0DH,0AH,' |* D: display Date *|$'
STR05 DB 0DH,0AH,' |* Q: Quit *|$'
STR06 DB 0DH,0AH,' |* *|$'
STR07 DB 0DH,0AH,' |********************************|$'
STR08 DB 0DH,0AH,'Please input a char: $'
INPUTER DB 0DH,0AH,'Input Error!',0DH,0AH,'$'
DATEDIS DB ' 0000-00-00 ',0AH,'$' ;显示DATE
table dw 0,31,59,90,120,151,181,212,243,273,304,334
DATA ENDS
;*********定义代码段********
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MAIN PROC FAR
MOV AH,00H ;AH=0设置显示模式
MOV AL,03H ;设置80*25图形显示
INT 10H
CLEAR_SCREEN ;调用宏定义
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
mov sp,offset tos
;*******显示宏定义********
;用于显示字符串
SHOW MACRO str
LEA DX,str
MOV AH,9
INT 21H
ENDM
SHOW STR00
SHOW STR01
SHOW STR02
SHOW STR03
SHOW STR05
SHOW STR06
SHOW STR07
INPUT:
SHOW STR08 ;显示输入提示
MOV AH,01 ;键盘输入并回写
INT 21H
CMP AL,"D" ;与D比较
JE PRINT_DATE ;相等转PRINT_DATE打印日期
CMP AL,"d"
JE PRINT_DATE
CMP AL,"q"
JE EXIT
SHOW INPUTER ;显示输入错误
JMP INPUT
PRINT_DATE:
CALL DATEDISPLAY ;调用日期显示子程序
JMP INPUT ;继续输入字母
EXIT: ;结束,退出程序
MOV AH,4CH
INT 21H
MAIN ENDP
;*********日期显示子程序*********
DATEDISPLAY PROC NEAR
MOV AH,2AH ;取当前系统日期
INT 21H
MOV AX,CX ;送年份入AX作为被除数【年份存在CX中】
mov dx,0
mov bx,4
div bx
cmp dx ,0
jnz nleap
mov ax,cx
mov dx,0
mov bx,100d
div bx
cmp dx,0
jnz leap
jz again
again: mov ax,cx
mov dx,0
mov bx,400
div bx
cmp dx,0
jz leap
jnz nleap
MOV BX,10 ;(BX)=10
LEA SI,DATEDIS+4 ;使SI指向年的最后一位【从0开始数】
MOV CX,4 ;(CX)=4 年的位数,循环4次
PUSH DX ;DX入栈,保存月日
TAB:
XOR DX,DX ;DX清零,存余数
DIV BX ;(DX,AX)/BX,商送AX,余数送DX
ADD DL, 30H ;余数与30H相加变为字符的ASCII码
MOV [SI], DL ;余数送入SI所指向的字节区
DEC SI ;SI减一
LOOP TAB ;循环4次
POP DX ;DX还原
MOV AL, DL ;日送AL【日存在DL中】
XOR AH, AH ;AH清零
DIV BL ;AX/BL,商送AL,余数送AH【AL为十位,AH为个位】
ADD AX, 3030H ;转变为数字字符的ASCII码
LEA SI, DATEDIS+9 ;使SI指向日的十位
MOV [SI], AX ;(AX)送SI所指向的字节区
MOV AL, DH ;月送AL 【月存在DH中】
XOR AH, AH ;AH清零
DIV BL ;AX/BL,商送AL,余数送AH【AL为十位,AH为个位】
ADD AX, 3030H ;转变为数字字符的ASCII码
LEA SI, DATEDIS+6 ;使SI指向月的十位
MOV [SI], AX ;(AX)送SI所指向的字节区
SHOW DATEDIS ;显示日期
RET ;调用后返回
leap:
mov al,dh
lea ax,[table+al-1]
mov bx,dl
add ax,bx+1
mov ah,09h
int 21h
nleap:
mov al,dh
lea ax,[table+al-1]
mov bx,dl
add ax,bx
mov ah,09h
int 21h
DATEDISPLAY ENDP
CODE ENDS
END START