⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os2-3.asm

📁 编制和调试一个自制时钟
💻 ASM
字号:
.386
code    segment  use16
       assume cs:code      
count    db    8
 
hour1    db    '0'
hour2    db    '0'
   
        db    ':'
         
min1     db    '0'
         
min2     db    '0'
                      
        db    ':'         
sec1     db    '0'
  
sec2     db    '0'
buf_len=$-hour1             ;计算显示信息长度
cur      dw     ?           ;原光标位置
old_int   dw ?,?            ;原int 1ch的中断矢量
start:    jmp   init
new1ch   proc  far  
        pushf
        call  dword ptr cs:old_int
        pushad
        push ds
        push es 
        mov  ax,cs               ;将ES,DS指向CS
        mov  ds,ax
        mov  es,ax
        mov  ah,3               ;获取0号显示页面当前的光标位置
        mov  bh,0
        int   10h
        mov  cur,dx              ;保存原光标位置       
        mov  bp,offset hour1       ;es:[bp]指向显示信息的起始位置
        mov  bh,0
        mov  dh,0
        mov  dl,80-buf_len
        mov  bl,7                 ;显示字符的属性(白色)
        mov    cx,buf_len          ;显示字符串长度
        mov    al,0              ;bl包含显示属性,写后光标不变
        mov    ah,13h            ;调用显示字符串的功能
        int     10h              ;在右上角显示当前时间
        mov    bh,0              ;对0号页面操作
        mov    dx,cur           ;恢复原来的光标位置
        mov    ah,2              ;设置光标位置的功能号
        int     10h              ;还原光标位置(保证主程序的光标位置
                               ;不受影响)
        pop    es
        pop    ds
        popad                     ;恢复现场
        iret                      ;中断返回
new1ch   endp
init:     mov  ah,35h               ;保存原中断向量
        mov  al,1ch
        int   21h
        mov  old_int,bx
        mov  old_int+2,es
        mov  ax,cs
        mov  ds,ax
         mov  ah,2ch              ;获取时间
        int   21h
        mov  al,ch               ;小时转换成ASCII码
        mov  ah,0
        mov  bl,10
        div   bl
        add   ah,30h
        mov   hour2,ah
        mov   ah,0
        div    bl
        add   ah,30h
        mov   hour1,ah
        mov   al,cl               ;分钟转换成ASCII码
        mov   ah,0
        div    bl
        add   ah,30h
        mov   min2,ah
        mov   ah,0
        div    bl
        add   ah,30h
        mov   min1,ah
        mov   al,dh              ;秒转换成ASCII码
        mov   ah,0
        div    bl
        add   ah,30h
        mov   sec2,ah
        mov   ah,0
        div    bl
        add   ah,30h
        mov   sec1,ah
        lea   dx,new1ch           ;设置新的中断向量
        mov   ah,25h
        mov   al,1ch
        int    21h
        mov   cl,4
        lea   dx,init+15
        shr    dx,cl
        add    dx,10h
        mov    al,0
        mov    ah,31h
        int     21h
code     ends
        end    start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -