組合語言中用埠的讀取與運用

2021-06-28 11:58:16 字數 3066 閱讀 2045

任務:顯示當前的年月日以及時分秒

在8086cpu中,有乙個晶元cmos ram,這個晶元中可以得到當前的時間,但是這裡的資料是以bcd碼給出的,要進行顯示,必須要先將bcd碼轉換為ascii才能在dos中顯示出來,然而在轉換的過程中需要用到兩個比較重要的運算,就是左移運算和右移運算

左移運算:shl,這裡預設的只能移動一位,要想移動多位,就需要將移動的位數放在cl中

右移運算:shr,shr和shl的用法類似

埠讀取的兩個指令就是in和out

out 60h, al意思就是將al的資料送入60h埠中

in al, 60h意思就是讀取60h埠的資料

這裡還需要介紹一種程式設計的方法,就是類似高階語言中的陣列的用法

我們可以一組程式中需要呼叫的資料放在乙個數序放入乙個記憶體區域,將無規律的一組資料放在乙個有規律的空間中,那麼在呼叫的時候就只需要用下標來對資料進行呼叫了

這裡的cmos ram晶元中,年 月 日 時 分 秒的埠位址不在一起,也沒有規律可循,就可以用這種辦法用下標來呼叫了,否則需要寫很多幾乎差不多的**,但是不能融合在一起,下面就看一下這個運用:

**:

assume cs:code, ds:data

data segment

db 12 dup(0)

db '// ::'

data ends

code segment

s1: db 9, 8, 7, 4, 2, 0 ;類似高階語言中的陣列,將要用到的資料存放在乙個空間中,用陣列的下標取出程式中用到的資料

start: mov ax, cs

mov ds, ax

mov bx, offset s1

mov si, 0

mov di, 0

mov cx, 6

s00: mov al, ds:[bx]

out 70h, al ;cmos ram晶元中,埠位址70h是位址埠,這裡的out 70h, al 是將al的資料送給位址埠,是告訴cpu要訪問哪個位址

in al, 71h ;71h是資料埠,這裡的in al, 71h 是告訴cpu要讀取70h指定地中的資料

inc bx

call cmos ;呼叫子函式,該子函式的功能是將bcd碼轉換為計算機和人通訊的ascii,為了顯示方便

add si, 2

loop s00

mov cx, 6

mov di, 0

mov si, 0

s01: call show ;呼叫顯示數字的子函式

add si, 6

add di, 2

loop s01

mov cx, 5

mov di, 12

mov si, 4

s02: call show_str ;呼叫顯示符號的子函式

add si, 6

add di, 1

loop s02

mov ax, 4c00h

int 21h

cmos: push ds

push si

push bx

push cx

push dx

push bp

push ax

mov ax, data

mov ds, ax

mov bp, sp

mov al, [bp] ;得到低四位

mov cl, 4

shl al, cl ;shl是左移運算,left

shr al, cl ;shr是右移運算,right

mov dl, al

add dl, 30h ;加30h得到ascii

mov ds:[si + 1], dl

mov al, [bp] ;得到高四位

shr al, cl

mov dh, al

add dh, 30h ;加30h得到ascii

mov ds:[si], dh

pop ax

pop bp

pop dx

pop cx

pop bx

pop si

pop ds

retshow: push ds

push es

push ax

mov ax, data

mov es, ax

mov ax, 0b800h

mov ds, ax

mov al, es:[di]

mov ds:[10*160 + 8*2 + si], al

mov byte ptr ds:[10*160 + 8*2 + si + 1], 2

mov al, es:[di + 1]

mov ds:[10*160 + 8*2 + si + 2], al

mov byte ptr ds:[10*160 + 8*2 + si + 3], 2

pop ax

pop es

pop ds

retshow_str: push ds

push es

push ax

mov ax, data

mov es, ax

mov ax, 0b800h

mov ds, ax

mov al, es:[di]

mov ds:[10*160 + 8*2 + si], al

mov byte ptr ds:[10*160 + 8*2 + si + 1], 2

pop ax

pop es

pop ds

retcode ends

end start

程式的執行結果:

組合語言中的常數

1,數值常數 二進位制數 10110100b 八進位制數146q,5430 十進位制數146d,543 十六進製制數 1a2fh,0ff00h 實數12.48e 2,1a3c0000r 彙編時,則有匯程式設計序將所有的數值常數都轉換成二進位制標示的目標 凡是以字母a f開頭的十六進製制數,唏噓在前面...

組合語言中PTR的含義

組合語言中ptr的含義 mov ax,bx 是把bx暫存器 裡 的值賦予ax,由於二者都是word型,所以沒有必要加 word mov ax,word ptr bx 是把記憶體位址等於 bx暫存器的值 的地方所存放的資料,賦予ax。由於只是給出乙個記憶體位址,不知道希望賦予ax的,是byte還是wo...

組合語言中macro的用法

如果有一段程式需要多次使用,為使程式不重複書寫這段程式,可用巨集定義把所需要重複出現的程式塊定義成巨集指令,此後在巨集指令出現的地方,巨集匯程式設計序總是自動地把它們替換成相應的 段。巨集指令格式 巨集指令名 macro 形式引數,段 endm在巨集定義中,使用了 形式引數 它們引用巨集指令時被給出...