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

簡介

題目請對照書本緩存

代碼

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

結果

編譯、連接、執行便可獲得咱們想要的結果。oop

結果

相關文章
相關標籤/搜索