組合語言程式設計實驗二

2021-10-06 14:12:31 字數 2949 閱讀 9661

一、實驗目的

掌握彙編程式設計規範,熟悉程式設計環境。

二、實驗內容

程式設計:參考教材實驗9,在螢幕中間分別顯示綠色、綠底紅色、白底藍色的字串』welcome to masm』。

三、實驗步驟演算法及關鍵**

80x25彩色字元模式顯示緩衝區的結構:

記憶體位址空間中,b8000h-bffffh共32k空間為彩色字元模式的顯示緩衝區,在這個模式下,顯示器可以顯示25行,每行80個字元,每個字元可以有256個屬性;乙個字元在顯示緩衝區中需要占用兩個位元組,分別存放字元的ascii碼和屬性;

屬性位元組的格式

7 6 5 4 3 2 1 0

含義 bl r g b i r g b

閃爍 背景 高亮 前景

r:紅色

g:綠色

b:藍色

2.實驗思路與演算法

①思路:

首先按照實驗要求,整個操作要在顯示緩衝區下進行,因此將ds設定成顯示緩衝區的段位址b800h,然後針對資料區的字元,設定記錄偏移位址的暫存器,再迴圈按照隔一跳一的方式,前乙個將資料區的資料以ascii碼形式傳入,偏移位址加一,然後後乙個以二進位制屬性位元組的方式設定屬性值。

②相關設定與演算法:

本實驗中需要重複三次操作,每次操作需要分別設定綠色,綠底紅色,白底藍色的字串,因此只討論綠底紅色的字串的做法。

設定ds為顯示緩衝區的段位址b800h,es為資料段data的段位址;

設定cx為迴圈計數器,初始化為字串的長度;

設定bx為指向當前操作字元的偏移位址的指標,初始化為0;si為指向當前操作儲存單元的偏移位址的指標,初始化為螢幕中間的偏移位址(如07c0h);

設定dx為屬性位元組,根據條件進行設定,如綠底紅字為00011000b

每次迴圈時,首先將資料區的單個字元取出並傳送給當前顯示緩衝區的位址,然後si加一,將屬性值傳送給當前顯示緩衝區的偏移位址,再si,bx加一,完成一次迴圈

3.實驗**

assume cs:codes

data segment

db 'welcome to masm'

data ends

codes segment

start:

;02h為黑底綠色,24h為綠底紅色,71h為白底藍色

;將顯示器段位址賦到ds中

mov ax,0b800h

mov ds,ax

;將data資料所在段段位址賦到es中

mov ax,data

mov es,ax

;設定bx為0,用於es定址

mov bx,0

;設定cx迴圈次數

mov cx,15

;定義位置的偏移位址

;將偏移位址02h賦到si中

mov si,0720h

mov dh,02h

s1:mov ah,es:[bx]

mov [si],ah

inc si

mov [si],dh

inc si

inc bx

loop s1

;設定bx為0,用於es定址

mov bx,0

;設定cx迴圈次數

mov bx,0

mov cx,15

;定義位置的偏移位址

;將偏移位址24h賦到si中

mov si,07c0h

mov dh,24h

s2:mov ah,es:[bx]

mov [si],ah

inc si

mov [si],dh

inc si

inc bx

loop s2

;設定bx為0,用於es定址

mov bx,0

;設定cx迴圈次數

mov bx,0

mov cx,15

;定義位置的偏移位址

;將偏移位址24h賦到si中

mov si,0860h

mov dh,71h

s3:mov ah,es:[bx]

mov [si],ah

inc si

mov [si],dh

inc si

inc bx

loop s3

mov ah,4ch

int 21h

codes ends

end start

4.實驗結果

四、實驗小結(簡單說明實驗過程**現的問題和解決方法)

本次實驗為看材料程式設計,整體實驗的難度較第乙個實驗就有所上公升了,且需要閱讀教材中實驗九的相關材料提取資訊,整個實驗中考查了有關資料段data的使用,暫存器間接定址,複雜問題多暫存器求解以及對這個題特有的設定兩個指標的思想,針對資料段的資料和顯示緩衝區的位址都需要進行指向。整體實驗在做的過程中需要比較熟悉迴圈語句的用法,間接定址與計數器結合的方法等。

在做這次實驗中,首先把我難到的就是材料的閱讀了,花費了我一定的時間去理解顯示緩衝區的屬性等方法的使用,當然這個其實是讀通了就理解了,但在這個實驗中,求取中心位置,設定兩個暫存器指向兩個地方這個思路在剛開始其實沒有想到,本來想的是設定乙個暫存器,指向資料區時不加立即數,指向顯示緩衝區時加立即數求得位移,但這個思路經驗證行不通,因此採取了兩個暫存器的方法,其實也比較方便。整體來說還是收穫學習了怎麼用乙個匯程式設計序完成顯示的方法吧。

組合語言程式設計實驗一

經過過去的五周的組合語言的學習,現在對intel 80x86的基本指令已經了解得差不多了。對組合語言的指令的學習,相當於對c 中的cout 邏輯運算子 關鍵字和算術運算子等的學習。同時還學習了組合語言編寫程式的基本框架,就如同對c 中的main函式 子函式等的學習,這個學習過程主要了解用組合語言編寫...

組合語言實驗二

預備知識 debug的使用 前面實驗中講了debug一些命令的用法,這裡再補充一些關於debug的知識。1 關於d命令 現在我們知道段位址是存放在暫存器中的,在d命令後面直接給出段位址,是debug提供的一種直觀的操作方式。d命令是由debug執行的,debug在執行d 1000 0這樣的命令時會先...

組合語言實驗二

datas segment 此處輸入資料段 datas ends stacks segment 此處輸入堆疊段 stacks ends codes segment assume cs codes,ds datas,ss stacks start mov ax,datas mov ds,ax 實驗二 ...