王爽《匯編語言》(第三版)實驗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

結果

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

結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM