1. 程式人生 > >組合語言實現功能(4)顯示功能

組合語言實現功能(4)顯示功能

問題1:在螢幕中間分別顯示綠底,綠底紅色,白底藍色的字串“Welcome to masm!”

分析:

1 如何確定字元要顯示的位置

  • 在80*25的彩色字元模式顯示緩衝區在記憶體地址的B8000H~BFFFFH共32KB的空間中
  • 在該模式下,顯示器可以顯示25行,80列
  • 所以在一行中就有80個字元,共佔據160個位元組,每個字元低位位元組儲存字元的ASCII碼,高位位元組儲存字元的顏色屬性
  • 偏移0000~009F對應的就是顯示器上的第一行;
  • 偏移0A00~13F0對應的就是顯示器上的第二行;......依次類推

確定3行字元在每一行的起始位置

  • 因為顯示的在螢幕的中間,共需要32個位元組,螢幕中一行共160個位元組,所以開始位元組為(160 - 32)/ 2 = 64

確定3行字元在螢幕中的哪一行

  • 因為螢幕中一共25行,要顯示3行字串,一行有160個字串,則第一行的開始位置是(25 - 3)/ 2 * 160 = 6E0H
  • 第二行的開始位置是6E0H + 160 = 780H
  • 第三行的開始位置是780H + 160 = 820H

2 如何確定字元要顯示的顏色屬性

  • 每個字元的顏色屬性佔據一個位元組,每一位表示的不同的顏色屬性,則共有256種顏色屬性
  • 屬性位元組的格式:
  • 7        (6  5  4)    3    (2  1  0)
  • BL   (R G B)  I   (R G B)
  • 閃爍    背景    高亮      前景
  • 綠底黑色:0 010 0 000B (20H)
  • 綠底紅色:0 010 0 100B (42H) 
  • 白底藍色:0 111 0 001B (71H)
assume cs:code,ds:data
data segment
	db 'Welcome to masm!'	
data ends

code segment
start:		        mov ax,data
			mov ds,ax
			mov bx,0			;ds:bx指向資料段起始位置

			mov ax,0B800H	
			mov es,ax			;設定顯示記憶體空間的起始位置

			mov si,64			;設定字串在一行中的中間位置
			
			mov cx,16			;設定迴圈的次數為字串的長度

s:			mov al,ds:[bx]		
			
			mov ah,20H			;設定第一行的開始位置和顏色
			mov es:[si+6E0H],ax
			
			mov ah,42h			;設定第二行的開始位置和顏色
			mov es:[si+780H],ax
			
			mov ah,71h			;設定第三行的開始位置和顏色
			mov es:[si+820H],ax

			inc bx 				;設定字串的偏移
			add si,2			;設定下一次迴圈的寫入位置

			loop s

			mov ax,4c00h
			int 21h

code ends
end start

問題2:設計一個子程式,使呼叫者決定顯示的位置,內容和顏色

分析:

  • 要實現的功能:在指定的位置,用指定的顏色,顯示一個用0結束的字串
  • 指定的引數:行號-dh(取值範圍0~24),列號-dl(取值範圍0~79),取值範圍主要是根據顯示器螢幕的大小
  • 顏色-cl,ds:si指向字串的首地址