題目請對照書本緩存
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