組合語言 實驗14 訪問CMOS RAM

2021-08-02 16:48:06 字數 1653 閱讀 4370

是什麼?

存放計算機開機必備的一些資料的硬體,由bios(basic input/output system)呼叫其資料。
怎麼用?
首先要理解埠的概念,在計算機中,與cpu可以訪問的資料的位置可以有一下三種:儲存器、暫存器、埠。而埠的另一端是晶元,即cpu通過埠與其他晶元相連。在這些晶元中,都有一組可供cpu讀寫的暫存器。站在cpu的角度,cpu對這些暫存器統一編址。

那麼怎麼進行訪問呢?首先要明白,cpu對於埠暫存器只有兩種操作型別:in(從埠讀取資料)、out(向埠輸出資料)。

例如: in al,71h(從71h埠讀取資料,放到暫存器al中)

out 70h,al(將暫存器al中的資料傳送到70h埠中)

注:對埠的操作只能用al或者ax暫存器。

時間在cmos ram中的表示形式:
秒:在0號單元

分:2時:4

日:7月:8

年:9

思路:
這裡可以用實驗13(3)的思路,將用到的資料放在code塊中,並通過offset進行訪問,簡單粗暴
源程式:
assume cs:code

code segment

index: db 9,8,7,4,2,0

string: db 'yy/mm/dd hh:mm:ss'

start: mov ax,code

mov ds,ax

mov si,offset index

mov bx,offset

string

mov cx,6

s: push cx

mov al,ds:[si]

out 70h,al

in al,71h

mov ah,al

mov cl,4

shr ah,cl

and al,00001111b

add al,30h

add ah,30h

mov [bx],ah

mov [bx+1],al

inc si;最後一次迴圈後,指向string

add bx,3

pop cx

loop s

;顯示字串

mov ax,0b800h

mov es,ax

mov di,160*12+40*4

mov cx,17

s0: mov al,ds:[si]

mov es:[di],al

add di,2

inc si

loop s0

ok: mov ax,4c00h

int 21h

code ends

endstart

自我總結
一開始的思路是,定義data段,將單元號放進去,然後再把『\』和『:』放進去(好蠢。。),然後在把從cmos ram中取出的al通過乙個函式,直接變成:ah(高位)al(低位)。行得通,但是當我把「年」輸出做好了之後,發現,還有五個要做,這樣下去程式會非常長,所以必須要用迴圈。可是以當時的設計,做迴圈是不可能的,每個兩位數中間都有'\'或者':'等字元。然後去瞄了一眼答案,瞬間恍然大悟。。世上那麼多條路可以選,我偏偏選了最難走的那一條:(

組合語言 實驗14 訪問CMOS RAM

程式設計,以 年 月 日 時 分 秒 的格式,顯示當前的日期 時間。assume cs code,ds data data segment db 2000 00 00 00 00 00 0 db 9,8,7,4,2,0 data ends code segment start mov ax,data...

組合語言 實驗14 訪問CMOS RAM

是什麼?存放計算機開機必備的一些資料的硬體,由bios basic input output system 呼叫其資料。怎麼用?首先要理解埠的概念,在計算機中,與cpu可以訪問的資料的位置可以有一下三種 儲存器 暫存器 埠。而埠的另一端是晶元,即cpu通過埠與其他晶元相連。在這些晶元中,都有一組可供...

《組合語言》實驗 實驗

注意 db定義位元組型別變數,乙個位元組資料百佔1個位元組單度元,讀完乙個,偏移量加1 dw定義字型別變問量,乙個字資料佔2個位元組單元,讀完乙個,權偏移量加2 dd定義雙字型別變數版,乙個雙字資料佔4個位元組單元,讀完乙個,權偏移量加4 一開始用了乙個暫存器表示所有項,但是後來發現四個資料佔的位元...