1. 程式人生 > >王爽《匯編語言》(第三版)實驗9解析

王爽《匯編語言》(第三版)實驗9解析

src p s 代碼 出棧 語言 註意 指向 .com 第一個

簡介

題目請對照書本

代碼

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

結果

編譯、鏈接、執行即可得到我們想要的結果。

技術分享圖片

王爽《匯編語言》(第三版)實驗9解析