80x86 汇编语言:在屏幕右上角显示系统时间

来源:互联网 发布:为什么开不了淘宝店铺 编辑:程序博客网 时间:2024/05/16 03:17

;看到了一个题目,要求设计一个程序,在屏幕右上角显示系统时间。
;http://zhidao.baidu.com/question/284361537.html
;
;当年,做而论道在学习微机原理的时候,就独立设计出了这样的程序,当然,弄了好多日子才成功。
;为了网友少走弯路,做而论道特地翻腾了好久,找出来当年的程序,多年不见,恍如隔世......
;
;80x86系统中,利用8253计数器,产生定时中断,周期是 55ms,频率是 18.2Hz。
;这个周期性的中断,在系统中的中断类型号是 08H,后来发现中断类型号为 1CH 的也是 55ms 中断一次。
;利用这个定时中断,可以干好多事情,查杀病毒就是其中之一。
;
;因为 DOS 系统管理下,系统中的中断向量,可以自行修改,可以用自己编写的程序,代替操作系统中的程序。
;
;下面的程序,就是修改了 INT 08H,使自己编写的程序,也能每秒钟执行18.2遍,目的就是在右上角显示系统时间。
;本程序,采用了程序驻留内存的方法。
;程序表面上看起来是结束了,可以接着执行其它程序,但是屏幕右上角的时钟,却不停的走时。
;呵呵,修改中断向量,程序驻留内存,这可不是简单的微机原理课程的知识。
;
;==============================================
CODE   SEGMENT             ;代码段.
    ASSUME   CS: CODE, DS: CODE
    ORG  0100H
START:
    JMP  MAIN
;----------------------------------------------
NEW_08H_SERVICE  PROC      ;每隔55ms执行一次.
    PUSH DS                ;保护现场.
    PUSH AX
    PUSH BX
    PUSH CX
    PUSH DX
;--------------------------
    MOV  AX, CODE          ;重新给DS段赋值.
    MOV  DS, AX
;--------------------------
    MOV  AH, 2
    INT  1AH               ;读出系统时间.
    CMP  DH, SEC
    JZ   E_NEW_08
    MOV  HOUR, CH
    MOV  MIN,  CL
    MOV  SEC,  DH
;--------------------------
    MOV  AH, 3             ;取出当前光标位置.
    MOV  BL, 0
    INT  10H
    PUSH DX
;--------------------------
    MOV  CURSOR, 0047H     ;第0行、71列.
    CALL SET_CURSOR
    MOV  AL, HOUR
    CALL W_2_CHAR
    MOV  AL, ':' - 30H
    CALL W_1_CHAR
    MOV  AL, MIN
    CALL W_2_CHAR
    MOV  AL, ':' - 30H
    CALL W_1_CHAR
    MOV  AL, SEC
    CALL W_2_CHAR
;--------------------------
    MOV  AH, 2             ;恢复光标位置.
    POP  DX
    INT  10H
;--------------------------
E_NEW_08:
    POP  DX                ;恢复现场.
    POP  CX
    POP  BX
    POP  AX
    POP  DS
    JMP  CS: OLD08         ;转去执行原来的中断服务程序.
;--------------------------;下面是代码段中的变量区
    CURSOR   DW  ?
    SEC      DB  ?
    MIN      DB  ?
    HOUR     DB  ?
    OLD08    DD  ?         ;用于存放原来的08H中断向量.
NEW_08H_SERVICE  ENDP
;----------------------------------------------
SET_CURSOR  PROC           ;设定光标位置.
    MOV  DX, CURSOR
    INC  DX
    MOV  CURSOR, DX
    MOV  AH, 2
    INT  10H
    RET
SET_CURSOR  ENDP
;----------------------------------------------
W_2_CHAR  PROC
    PUSH AX
    MOV  CL, 4
    SHR  AL, CL
    AND  AL, 0FH
    CALL W_1_CHAR
    POP  AX
    AND  AL, 0FH
    CALL W_1_CHAR
    RET
W_2_CHAR  ENDP
;----------------------------------------------
W_1_CHAR  PROC             ;显示1个字符.
    MOV  AH, 9
    ADD  AL, 30H           ;AL中的数字,变成ASCII
;    MOV  BL, 1EH           ;蓝色背景、黄色字符.
    MOV  BL, 2FH           ;绿色背景、白色字符.
    MOV  CX, 1             ;显示一个字符.
    INT  10H
    CALL SET_CURSOR        ;显示后,移动一次光标
    RET
W_1_CHAR  ENDP
;===============以上内容驻留内存,每隔55ms执行一次
MAIN:
    MOV  AX, CODE
    MOV  DS, AX
    CLI                    ;关中断
    MOV  AX, 3508H         ;读出原来的08H中断向量到OLD08
    INT  21H
    MOV  WORD PTR OLD08, BX
    MOV  WORD PTR OLD08 + 2, ES
;--------------
    MOV  AX, 2508H         ;把NEW_08H_SERVICE写人中断向量表.
    MOV  DX, OFFSET NEW_08H_SERVICE
    INT  21H
    STI                    ;开中断.
    MOV  DX, OFFSET MAIN   ;设置驻留程序的末尾位置
    INT  27H               ;驻留并退出
;----------------------------------------------
CODE  ENDS
    END  START
;==============================================
程序运行后,显示截图如下:
汇编语言编程:在屏幕右上角显示系统时间 - 非著名博主 - 电子信息角落
;==============================================
原题网址:
http://zhidao.baidu.com/question/284361537.html#here
提问者对于答案的评价:好,谢谢,200分笑纳哈。
;==============================================

0 0