匯編語言(第3版,王爽著):實(shí)驗(yàn)14 訪問 CMOS RAM

實(shí)驗(yàn)14 訪問 CMOS RAM

1) 思路:

  1. 可以仿照 實(shí)驗(yàn)13 的第 3 個例子 的編程思想
  2. 將要顯示的時間格式預(yù)先定義好,從 CMOS RAM 中獲取到的 BCD 碼,將其轉(zhuǎn)換成對應(yīng)的 ASCII 碼字符后,再替換輸出格式中的某些字符
  3. 將 CMOS RAM 中,存放當(dāng)前時間的地址信息先列出來(年、月、日、時、分、秒 的存放單元) ,方便代碼遍歷的去獲取相關(guān)的信息

2) 代碼實(shí)現(xiàn)1:

文件名:exp14.asm
方法:調(diào)用 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 碼經(jīng)過一系列的轉(zhuǎn)換,轉(zhuǎn)為對應(yīng)的 ASCII 碼字符(顯存中識別的是 ASCII 碼)

        mov ds:[si], ah
        mov ds:[si+1], al           ; 將轉(zhuǎn)換后的 ASCII 碼字符放入預(yù)先定義好的字符串中

        add si, 3
        inc di
        pop cx
        loop s


        mov ah, 2                   ; 置光標(biāo)
        mov bh, 0                   ; 第 0 頁
        mov dh, 13                  ; dh 中放行號
        mov dl, 32                  ; dl 中放列號
        int 10h

        mov dx, 0                   ; 設(shè)定要讀取的字符串地址,ds:dx 指向字符串的首地址 data:0
        mov ah, 9
        int 21h                     ; 調(diào)用 BIOS 和 DOS 提供的中斷例程,顯示字符串

        mov ax, 4c00h
        int 21h
code ends

end start
代碼實(shí)現(xiàn)1 程序運(yùn)行示意圖

3) 代碼實(shí)現(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 碼經(jīng)過一系列的轉(zhuǎn)換,轉(zhuǎn)為對應(yīng)的 ASCII 碼字符(顯存中識別的是 ASCII 碼)

        mov ds:[si], ah
        mov ds:[si+1], al           ; 將轉(zhuǎn)換后的 ASCII 碼字符放入預(yù)先定義好的字符串中

        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   ; 將二進(jìn)制數(shù)送到顯存緩沖區(qū)(顯卡上的顯存中),顯卡會用 ASCII 碼的規(guī)則解釋顯存中的內(nèi)容,會立即在顯示器上顯示出來

    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
代碼實(shí)現(xiàn)2 程序運(yùn)行示意圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容