汇编语言来完成"按指定格式显示时间程序设计"

岳丰源 2007-12-01 07:53:53
基本功能:读取微机系统当前日期及时钟信息,并按英文格式显示在屏幕上。如2008年1月1日14点38分28秒,显示为“JAN 1,2008 14:38:28”。
增强功能:计算该日期是当年的第几天并显示结果。
...全文
356 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
knowledge_Is_Life 2008-05-01
  • 打赏
  • 举报
回复
这个简单啊,网上搜一下就得到答案了.
岳丰源 2008-03-07
  • 打赏
  • 举报
回复
我的源代码:
希望有高手进行指点:
DIS MACRO A
PUSH DX ;DIS 宏定义开始
MOV DL,A ;显示特殊字符
MOV AH,2
INT 21H
POP DX
ENDM
WRITE MACRO B ;WRITE 宏定义开始
LEA DX,B ;显示字符串
MOV AH,9
INT 21H
ENDM
PRIN MACRO C,D ;PRIN宏定义开始
MOV AL,C ;功能:显示数据
CBW ;特殊字符
CALL RADIX
DIS D
ENDM
stack segment ;堆栈段开始
db 200 dup(0)
stack ends
data segment ;数据段开始
INP db 0dh,0ah,'The information of day and time display:$'
OUTPUT db 0dh,0ah,'Today of this year is: $'
TAB db 'JAN$','FEB$','MAR$','APR$','MAY$','JUN$',
'JUL$','MUG$','SEP$','OCT$','NOV$','DEC$'
DAT dw 0,31,59,90,120,151,181,212,243,273,304,334
DAT1 DW 0,31,60,91,121,152,182,213,244,274,305,335
;闰年查DAT1,非闰年查DAT;用查表的方法来显示月份和统计天数
data ends
code segment ;代码段开始
assume cs:code,ds:data,ss:stack
start:
mov ax,data ;
mov ds,ax ;数据段地址给DS
mov ax,stack ;
mov ss,ax
WRITE INP ;提示显示信息
call print ;调用显示日期和时间的子程序
WRITE OUTPUT ;提示统计信息
call ACOUNT ;调用统计第几天的子程序
mov ah,4ch ;结束
int 21h
RADIX PROC NEAR ;子程序定义开始
push cx ;功能:将字的十六为无符号数二进数转换成十进制并显示出来
push dx ;入口参数:AX --待转换的十六位无符号二进数
mov cx,0 ;无出口参数
Lop: ;
mov dx,0 ;把高位数置0
mov bx,10 ;进行十进制转换
div bx
push dx
inc cx
or ax,ax ;AX!=0继续循环
jne Lop
Lop1: pop ax
cmp al,10 ;判断一下是否在0-9之间
jb L ;0-9之间的数转换为ASCII代码
add al,7 ;A-F之间的转换
L: add al,30h
mov dl,al ;将转换的数显示出来
mov ah,2
int 21h
dec cx
jne Lop1
pop dx ;恢复DX的内容
pop cx ;恢复CX的内容
ret
RADIX ENDP ;
PRINT PROC ;显示的子程序开始定义
mov ah,2ah ;功能显示英文格式的日期和时间
int 21h ;暂时保护日、月、年
push dx ;
push cx ;把月份给BL,用于查表
mov bl,dh ;月份从1开始,地址从0
dec bl ;开始,应减1
mov bh,0 ;
mov cl,2 ;
shl bl,cl ;乘以4,确定月份所在地址
lea si,TAB ;
add si,bx ;
mov dx,si ;把确定的月份地址传给
mov ah,9 ;DX,调用9号功能,显示
int 21h ;英文月份简写
pop cx ;释放保护的月、日数
pop dx ;
DIS ' ' ;显示空格
PRIN DL,',' ;显示天数和','
mov ax,cx ;显示年份
call RADIX ;
DIS ' ' ;
mov ah,2ch ;获取当前的小时、分、秒
int 21h ;并已时间的格式显示出来
PRIN ch,':' ;显示小时
PRIN cl,':' ;显示分钟
PRIN dh,' ' ;显示秒钟
ret ;显示的子程序结束
PRINT ENDP ;
ACOUNT PROC NEAR ;统计天数的子程序
mov ah,2ah ;调用日期指令
int 21h ;功能:统计当天是当年的第几天
mov bl,dh ;把月份给BL,用于查表
dec bl ;月份从1开始,地址从0
shl bl,1 ;乘以2,确定要查月份的
mov bh,0 ;开始前的天数和
;mov ax,cx ;GETYEAR入口参数是CX
call GETYEAR
cmp ax,1 ;
jnz NLEAP ;判断是否为闰年
mov bx,DAT1[bx] ;若是闰年查表DAT1
jmp AGAIN ;
NLEAP:
mov bx,DAT[bx] ;若不是闰年查表DAT
AGAIN:
mov al,dl ;获取当月天数
mov ah,0 ;把查表所得和当月
add ax,bx ;加一起就是当年的
call RADIX ;第几天
RET
ACOUNT ENDP
GETYEAR PROC ;判断是否为闰年的子程序定义
push bx
push cx ;入口参数是-CX
push dx ;出口参数十-Ax
;若AX为1当年就是闰年
mov ax,cx
cwd ;若AX为0当年不是闰年
mov bx,400 ;年份除以400
div bx ;
cmp dx,0 ;若能够整除是闰年
jz M ;
cwd
mov ax,cx ;不能够整除进行第二轮判断
mov bx,4
div bx
cmp dx,0
jnz N ;若不能够被4整除就不是闰年
mov bx,100 ;若能够被4整除然后再除以100
div bx
cmp dx,0
jz N
M: mov ax,1 ;若不能够被100整除就是闰年
jmp Q
N : mov ax,0 ;若能够被100整除就不是闰年
Q:
pop dx
pop cx ;恢复保护
pop bx
ret
GETYEAR ENDP
code ends
end start
wuyi8808 2008-02-13
  • 打赏
  • 举报
回复
沙发。

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧