王爽老師實驗9中的內容是對前面數據分配以及數據結構化的總結,通過對dosbox中B800H-BFFFH內存空間進行操作,寫入的內容可以顯現在顯示器上,下面是對實驗9題目的解答以及分析
題目信息
在屏幕中間分別顯示綠色,綠地紅色,白底藍色的字符串‘welcome to masm!’.
題目答案
assume cs:code,ds:data,ss:stack
code segment
start: mov ax,data
mov ds,ax ;數據那裏來
mov ax,0b800H
mov es,ax ;數據到哪裏去
mov bx,0 ;數據通過bx寄存器獲取
mov si,10H ;數據顏色通過si寄存器獲取
mov di,160*10+ 30*2 ;顯示數據的位置(數據到哪裏去?)
mov dx,0 ;臨時存放數據寄存器
mov cx,3
showmasm:push bx ;外層循環控制顯示行數
push cx
push si
push di
mov cx,16
ShowRow:mov dh,ds:[si] ;內循環控制每一行數據的存儲
mov dl,ds:[bx] ;
mov es:[di],dx
add di,2
inc bx
loop ShowRow
pop di
pop si
pop cx
pop bx
inc si
add di,160
loop showmasm
mov ax,4c00H
int 21H
code ends
data segment
;0123456789ABCDEF
db 'welcome to masm!'
db 10001010B
db 00100100B
db 01110001B
data ends
stack segment
db 128 dup(0)
stack ends
end start
題目分析
根據老師給出的提示,緩存區中偶地址存放字符,奇地址存放的是字符的顏色,而且得知了顏色屬性字節的格式:
7 6 5 4 3 2 1 0
含義:BL(R G B) I (R G B)
閃爍 背景 高亮 前景
8個字節分別代表了不同的含義,而我們需要的三種顏色可以通過格式得出: 需要哪一位就把值置位1
綠色: 0 000 1010B B代表bytes 一個字節
綠色是字體綠色,因此是前景色 我加了高亮,剩下的同理
綠底紅色: 00100100B
白底藍色:01110001B
其他邏輯我都放在註釋中了!
對內層循環進行分析:
ShowRow:mov dh,ds:[si] ;內循環控制每一行數據的存儲
mov dl,ds:[bx] ;
mov es:[di],dx
add di,2
inc bx
loop ShowRow
首先將dx寄存器分爲dl和dh兩個八位寄存器,分別存放數據以及數據的屬性,前面提到偶數位存放的是數據,奇數位存放數據的屬性,在內存中地址是低到高排放的,根據這個特點,我們把數據放在dl寄存器中,數據屬性放在dh寄存器中就可以實現偶數位存放的是數據,奇數位存放數據
.其他的就沒什麼了!