1. 程式人生 > 實用技巧 >8086彙編 顯示時間 --- 王爽 《組合語言》實驗14

8086彙編 顯示時間 --- 王爽 《組合語言》實驗14

; 在某行顯示日期,時間
; 程式碼裡面我寫死成12行了

assume cs:code

code segment
cmos_arr:
    db 9, 8, 7, 4, 2, 0
char_arr:
    ; 這個第一個' ' 空格其實是一個佔位置用的
    db ' ', '/', '/', ' ', ':', ':'
start: 
 
    mov cx, 6       ;  總共有 年月日 時分秒 六個時間資訊
    mov si, 0       ;  當前訪問的陣列的下標
    mov dx, 12      ;  存放列的位置
s:  cmp si, 0
    je jump ; 如果是第一次迴圈的話, 跳過列印符號
    ; 列印符號
    mov ax, cs
    mov ds, ax
    mov bx, offset char_arr
    mov al, [bx+si]
    mov bx, 0b800h
    mov es, bx
    mov bx, dx
    shl bx, 1
    mov byte ptr es:[160*12+bx], al
    inc dx          ; 列號往後面移一個格子

jump:
    ; 獲取cmos裡面的時間資訊
    mov ax, cs
    mov ds, ax
    mov bx, offset cmos_arr
    mov ax, [bx+si]
    out 70h, ax
    in al, 71h        ; 讀取
    
    mov bx, cx        ; 備份一下 cx
    mov ah, al
    and al, 00001111b
    mov cl, 4
    shr ah, cl
    mov cx, bx        ; 恢復 cx
    
    add al, 30h       ; 時間的個位
    add ah, 30h       ; 時間的十位
    
    ; 列印時間資訊
    mov bx, 0b800h
    mov es, bx
    mov bx, dx
    shl bx, 1
    mov byte ptr es:[160*12+bx], ah
    mov byte ptr es:[160*12+2+bx], al
    add dx, 2       ; 列號往後面移兩個格子
    
    inc si
    loop s
    mov ax, 4c00h
    int 21h

code ends

end start