程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 匯編語言之屏幕字符顯示

匯編語言之屏幕字符顯示

編輯:C++入門知識

在屏幕中間分別顯示不同顏色的字符串“Jackill Love You”
在內存地址空間,B8000H~BFFFFH共32K空間,在此空間寫入數據會顯示在顯示器上;在80*25彩色字符模式下,顯示器可以顯示25行,80個字符,一個字符占兩個字節,低位為ASCII碼,高位為字節存儲字符的屬性。 00~01/9E~9F單元分別對應第一列和第80列;字符屬性略-察看9.9; 例如在0行0列顯示黑底綠色字符A,緩沖區裡的內容應該為:
B800:0000 ->41(ASCII) 02(屬性) ////////////////////////////////////////////////////////////////////
assume cs:code,ds:data,ss:stack
data segment
db 'Jackill Love You' ;定義要顯示的字符串(共16字節)
db 02h,24h,71h ;定義三種顏色屬性
data ends stack segment
dw 8 dup(0)
stack ends code segment
start:

mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,10h
mov bx,0
mov di,0
mov ax,0b872h ;算出屏幕第12行中間的顯存的段起始位置放入ax中
mov cx,3 ;外循環為3次,因為要顯示三個字符串 s3: push cx ;三個進棧操作為外循環s3保存相關寄存器的值
push ax ;以防止它們的值在內循環中被破壞
push di
mov es,ax ;此時es為屏幕第12行中間的顯存的段起始位置
mov si,0
mov di,0
mov cx,10h ;內循環為10h次,因為一個字符串中含10h個字節 s1: mov al,ds:[bx+si]
mov es:[bx+di],al
inc si
add di,2
loop s1 ;此循環實現偶地址中存放字符
mov si,1 ;si的值設為1,從而為在顯存奇地址中存放字符的顏色屬性做准備
pop di ;將di的值恢復成進入內循環之前的時候的值
mov al,ds:10h[bx+di] ;取顏色屬性[源OP尋址方式:相對基址變址]
mov cx,10h ;第二個內循環也為10h次
s2: mov es:[bx+si],al
add si,2
loop s2 ;此循環實現奇地址中存放字符的顏色屬性
;以下4句為下一趟外循環做准備
inc di
pop ax
add ax,0ah ;將顯存的段起始地址設為當前行的下一行
;[在段地址中加0ah,相當於在偏移地址中加了0a0h(=160d)]
pop cx
loop s3
mov ax,4c00h
int 21h
code ends
end start

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved