是什麼?
存放計算機開機必備的一些資料的硬體,由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 一開始用了乙個暫存器表示所有項,但是後來發現四個資料佔的位元...