下面題目是別人打的,省略一些東西。我的環境是windows xp
實驗9 根據材料編程
在屏幕中間分別顯示綠色,綠底紅色,白底藍色的字符串“welcome to masm!”。
材料:
內存地址空間中,B8000H~BFFFFH共32K的空間,為80*25彩色字符模式的顯示緩沖區。向這個地址空間寫入數據,寫入的內容將立即出現在顯示器上。
在80*25彩色字符模式下,顯示器可以顯示25行,每行80個字符,每個字符可以有256種屬性(背景色、前景色、閃爍、高亮等組合信息)。
這樣,一個字符在顯示緩沖區中就要占兩個字節,分別存放字符的ASCII碼(低位)和屬性(高位)。80*25模式下,一屏的內容在顯示緩沖區中共占4000個字節。
顯示緩沖區分為8頁,每頁4KB,顯示器可以顯示任意一頁內容。一般情況下,顯示第0頁內容。也就是通常情況下,B8000~B8F9F中的4000個字節將出現在屏幕上。
屬性字節的格式:
7 6 5 4 3 2 1 0
BL(閃爍) R(背景) G(背景) B(背景) I(高亮) R(前景) G(前景) B(前景)
這個題目倒是很容易,沒什么問題,我的解法是
assume cs:cseg,ds:data
data segment
db 'welcome to masm!'
data ends
cseg segment
start:
mov ax,data
mov ds,ax
mov ax,0B800H
mov es,ax
mov bx,0f00h
mov si,0
mov cx,16
s:mov al,[si]
mov es:[bx],al
mov al,02h
mov es:[bx+1],al
add bx,2
inc si
loop s
;系統調用
mov ax,4c00H
INT 21H
cseg ends
end start
但是,我調試的時候確不能達到我的顯示目的,而且每次mov es:[bx],al之后es:[bx]並沒有被修改。后來才發現原來這個彩色字符顯示緩沖區的第一行就是從命令行的窗口的第一行開始算起的,也就是說我調試的時候每次一執行指令,屏幕就會向上滾動,也就相當於清屏了,所以我的顯示就被清掉了。
於是我將要顯示的字符定位在25行,這樣就可以看到效果了。