簡介
題目請對照書本
代碼
assume cs:code
data segment
db 'welcome to masm!'
db 02h,24h,71h ; 要求的三個顏色對應的16進制代碼
data ends
stack segment
db 16 dup(0)
; 也可以是下面的定義法:
; dw 8 dup(0)
stack ends
code segment
start:
; 設置data段,以及ds:bx指向data段的第一個單元,
; 即ds:[bx]的內容就是data段第一個單元的內容
mov ax,data
mov ds,ax
;設置顯示緩存區段
mov ax,0b800h ;設置起始緩存
mov es,ax
;設置棧段
mov ax,stack
mov ss,ax
mov sp,10h ;指向棧頂
;初始化三個寄存器
mov bx,780h ; 行 從12-14行(注意:從第1行開始計數)
mov si,10h ; 顏色的偏移量,三次循環每次
; 增加 1h 指向下一個顏色
mov cx,3 ; 三次循環改變行
s: mov ah,ds:[si] ;顏色事先存放在ah中
push cx
push si
mov cx,16 ; 16次循環改變列
mov si,64 ; 這里的si的意義是多少列,
; 為什么從64列開始呢?
; (1)字符串為32字節,16字節ASCLL碼,16字節屬性
; (2)每一行有160列,那么余下有 160-32=128列為空白
; 要使得字符串居中顯示,那么字符串的左邊和右邊
; 都應該是64字節(128/2),而列數是從0開始計數,
; 所以左邊的64字節為0-63,所以這里偏移量為64
mov di,0
s0: mov al,ds:[di] ;將date段中的字符一個一個傳入es中
mov es:[bx+si],al ; 低位存放字符
mov es:[bx+si+1],ah ; 高位存放顏色
add si,2 ;顯示緩存區字符ASCII碼偏移量為2
add di,1 ;data段字符的偏移量,每次加 1
loop s0
pop si
pop cx ;后進先出,先出棧si,再出棧cx
add si,1h ;指向下一個顏色
add bx,0a0h ;指向下一行 160=0a0h
loop s
mov ax,4c00h
int 21h
code ends
end start
結果
編譯、鏈接、執行即可得到我們想要的結果。