汇编高手请进,高分求助!

crystal_si 2003-09-24 11:12:41
用汇编语言或C语言编写1个DOS状态下的CMOS的实时时钟程序
要求:1该程序执行过后在屏幕右上角显示实时数字时钟
2该程序要求驻留内存TSR
3时钟的更新用ICH(IC中断)或08中断
...全文
37 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
紫郢剑侠 2003-09-24
  • 打赏
  • 举报
回复
在VBIN版主的网站http://www.vbin.org上有现成的ASM源代码.
crystal_si 2003-09-24
  • 打赏
  • 举报
回复
多谢,明天结贴给分
andywolf 2003-09-24
  • 打赏
  • 举报
回复
这里有一个,参考一下吧!

;================================================
; Code Segment
CSEG SEGMENT
ASSUME CS:CSEG , DS:CSEG
;================================================
; 1CH Interrupt Process Procedure's BianLiang
;================================================
; Interrupt Procedure Const Define
DPAGE EQU 0 ;display page number
ROW EQU 11 ;display clock's row number
COLUMN EQU 80 - Time_LEN - 35 ;display clock's first column number

Hour DB ?,?,':' ;hour
Minute DB ?,?,':' ;minitue
Second DB ?,? ;second
Time_LEN = $ - OFFSET Hour ;information length

Century db ?,? ;Century
Year db ?,?,'-' ;Year
Month db ?,?,'-' ;Month
Day db ?,?,'--' ;Day
Date_LEN = $ - OFFSET Century

CURSOR DW ? ;old cursor position
OLD1CH DD ? ;save old interrupt

Set_Time dw ?
COLOR db 1eH ;display clock's attribute
;
;================================================
; 1CH Interrupt Process Procedure Code
NEW1CH :
STI ;oper interrupt
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH BP

PUSH CS
POP DS ;set data registor
PUSH CS
POP ES
CALL GET_D ;Get Date

CALL GET_T ;get time
MOV AX,DX ;get second

CMP AX,3030H
JNZ NOTATTIME
MOV AX,BX ;get minute
SUB AX,Set_Time
.IF AX==0
mov cx,07
@@:
mov di,1000h
push cx
mov cx,0ffffh
call waitf
pop cx
CALL GENSOUND ;if time is at time , call speaker precedure
loop short @b

mov di,200h
call gensound
.ENDIF
NOTATTIME :
MOV BH,DPAGE
MOV AH,3 ;get cursor position
INT 10H
MOV CURSOR,DX ;save old cursor position

mov bp,offset Century
MOV BH,DPAGE
MOV DH,ROW
MOV DL,COLUMN-12
MOV BL,COLOR
MOV CX,Date_LEN
MOV AL,0
MOV AH,13H ;display clock
INT 10H

MOV BP,OFFSET Hour
MOV BH,DPAGE
MOV DH,ROW
MOV DL,COLUMN
MOV BL,COLOR
MOV CX,Time_LEN
MOV AL,0
MOV AH,13H ;display clock
INT 10H

MOV BH,DPAGE ;load old cursor
MOV DX,CURSOR
MOV AH,2
INT 10H

POP BP
POP SI
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
JMP DWORD PTR CS:OLD1CH ;replace iret
;================================================
;Get Time for Real Time Clock
;================================================
GET_T PROC
MOV AH,2 ;get time information
INT 1AH
MOV AL,CH ;transfer hour to ascii
CALL TTASC
MOV WORD PTR Hour,AX ;save
MOV AL,CL ;transfer minitue to ascii
CALL TTASC
MOV WORD PTR Minute,AX ;save
MOV BX,AX ;save minute
MOV AL,DH ;transfer second to ascii
CALL TTASC
MOV WORD PTR Second,AX ;save
MOV DX,AX ;save second
RET
GET_T ENDP
;================================================
;Get Day for Real Time Clock
;================================================
GET_D PROC
MOV AH,4 ;get time information
INT 1AH
MOV AL,CH
CALL TTASC
MOV WORD PTR CENTURY,AX
MOV AL,Cl ;transfer year to ascii
CALL TTASC
MOV WORD PTR Year,AX ;save
MOV AL,DH ;transfer Month to ascii
CALL TTASC
MOV WORD PTR Month,AX ;save
MOV BX,AX ;save minute
MOV AL,DL ;transfer Day to ascii
CALL TTASC
MOV WORD PTR Day,AX ;save
MOV DX,AX ;save second
RET
GET_D ENDP
;================================================
;Input: al=BCD
;Output:ax=the ASCII of al
;================================================
TTASC PROC
MOV AH,AL ;save high BCD code
AND AL,0FH
SHR AH,1
SHR AH,1
SHR AH,1
SHR AH,1
ADD AX,3030H ;get Ascii code
XCHG AH,AL
RET
TTASC ENDP
;================================================
;
;================================================
;(CX)= Coutnt of 15.08us
WAITF PROC
PUSH AX
WAITF1 :
IN AL,61H
AND AL,10H ;Check PB4
CMP AL,AH ;did it just change
JE WAITF1 ;wait for change
MOV AH,AL ;save the new PB4 status
LOOP WAITF1 ;continue until CX becomes 0
POP AX
RET
WAITF ENDP
;================================================
;
;================================================
GENSOUND PROC
PUSH AX ;save registers
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV BX,08H ;set clock alert time
MOV AL,0B6H ;write timer mode reg
OUT 43H,AL
MOV DX,12H ;timer divistor
MOV AX,348CH ;1193100Hz / freq
DIV DI ;value of freq
OUT 42H,AL ;write timer2 count low byte
MOV AL,AH
OUT 42H,AL ;write timer2 cout high byte
IN AL,61H ;get current port setting
MOV AH,AL ;and save it in ah
OR AL,3 ;turn speaker on
OUT 61H,AL
WAIT1:
MOV CX,663 ;wait for specified interval,663*15.08us=10ms
CALL WAITF
DELAY:
LOOP DELAY
DEC BX
JNZ WAIT1
MOV AL,AH ;recover value of port
OUT 61H,AL
POP DI ;recover the register
POP DX
POP CX
POP BX
POP AX
RET ;exit
GENSOUND ENDP
;================================================
;
;================================================
; Initialize
START :
PUSH CS
POP DS
MOV AX,351CH ;get interrupt 1ch
INT 21H
MOV WORD PTR OLD1CH,BX
MOV WORD PTR OLD1CH + 2,ES
MOV DX,OFFSET NEW1CH
MOV AX,251CH ;set interrupt 1ch
INT 21H

; mov word ptr[set_time],3030h
; mov ax,3
; int 10h

; mov di,200h
; call gensound
; mov ah,0
; int 16h

; mov byte ptr[COLOR],2eh
; mov ah,0
; int 16h

; push ds
; mov dx,word ptr old1ch
; mov ds,word ptr old1ch + 2
; mov ax,251ch ;set interrupt 1ch
; int 21h
; pop ds

; mov ah,4ch
; int 21h
MOV DX,OFFSET START ;want to stay in memory's code and data bytes
ADD DX,15 ;if bytes can't div 16
MOV CL,4
SHR DX,CL ;transfer to byte
ADD DX,10H ;add psp's length
MOV AH,31H ;over and stay
INT 21H
CSEG ENDS
END START
;================================================

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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