1) 思路:
- 可以仿照 實驗13 的第 3 個例子 的編程思想
- 將要顯示的時間格式預先定義好,從 CMOS RAM 中獲取到的 BCD 碼逃魄,將其轉換成對應的 ASCII 碼字符后筋蓖,再替換輸出格式中的某些字符
- 將 CMOS RAM 中卸耘,存放當前時間的地址信息先列出來(年、月粘咖、日蚣抗、時、分瓮下、秒 的存放單元) 翰铡,方便代碼遍歷的去獲取相關的信息
2) 代碼實現(xiàn)1:
文件名:exp14.asm
方法:調用 BIOS 和 DOS 提供的中斷例程,顯示字符串
assume cs:code
code segment
db 'yy/MM/dd HH:mm:ss', '$'
address: db 9,8,7,4,2,0
start:
mov ax, cs
mov ds, ax
mov si, 0
mov di, offset address ; CMOS RAM 中地址信息的索引
mov cx, 6
s:
push cx
mov al, ds:[di]
out 70h, al
in al, 71h ; 從 CMOS RAM 讀取 BCD 碼
mov ah, al
mov cl, 4
shr ah, cl
and al, 00001111b
add ah, 30h
add al, 30h ; 將讀取到的 BCD 碼經過一系列的轉換讽坏,轉為對應的 ASCII 碼字符(顯存中識別的是 ASCII 碼)
mov ds:[si], ah
mov ds:[si+1], al ; 將轉換后的 ASCII 碼字符放入預先定義好的字符串中
add si, 3
inc di
pop cx
loop s
mov ah, 2 ; 置光標
mov bh, 0 ; 第 0 頁
mov dh, 13 ; dh 中放行號
mov dl, 32 ; dl 中放列號
int 10h
mov dx, 0 ; 設定要讀取的字符串地址锭魔,ds:dx 指向字符串的首地址 data:0
mov ah, 9
int 21h ; 調用 BIOS 和 DOS 提供的中斷例程,顯示字符串
mov ax, 4c00h
int 21h
code ends
end start
3) 代碼實現(xiàn)2:
文件名:exp14-2.asm
方法:將要顯示的字符送入到顯卡上的顯存中路呜,顯示字符串
assume cs:code
data segment
db 'yy/MM/dd HH:mm:ss'
db 9,8,7,4,2,0
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, 0
mov di, 17 ; CMOS RAM 中地址信息的索引
mov cx, 6
s:
push cx
mov al, ds:[di]
out 70h, al
in al, 71h ; 從 CMOS RAM 讀取 BCD 碼
mov ah, al
mov cl, 4
shr ah, cl
and al, 00001111b
add ah, 30h
add al, 30h ; 將讀取到的 BCD 碼經過一系列的轉換迷捧,轉為對應的 ASCII 碼字符(顯存中識別的是 ASCII 碼)
mov ds:[si], ah
mov ds:[si+1], al ; 將轉換后的 ASCII 碼字符放入預先定義好的字符串中
add si, 3
inc di
pop cx
loop s
mov ax, data
mov ds, ax
mov si, 0
mov cx, 17
mov ax, 0b800h
mov es, ax
mov di, 160 * 13 + 32 * 2 ; 將二進制數(shù)送到顯存緩沖區(qū)(顯卡上的顯存中),顯卡會用 ASCII 碼的規(guī)則解釋顯存中的內容胀葱,會立即在顯示器上顯示出來
show_str:
mov al, ds:[si]
mov ah, 02h ; 字符屬性
mov es:[di], ax
inc si
add di, 2
loop show_str
mov ax, 4c00h
int 21h
code ends
end start