;******************************************************************************
; ______
; .-" "-.
; / SSH ;
; |, .-. .-. ,|
; | )(__/ /__)( |
; |/ // /|
; (@_ (_ ^^ _)
; _ ) /_______/__|IIIIII|__/__________________________
; (_)@8@8{}<________|-/IIIIII/-|___________________________>
; )_/ / /
; (@ `--------`
;
;@Author : 蹩脚馒头
;@Data : 2008.04.19
;@Ver : 1.0
;@Email : sshc625@163.com
;@CopyRight : All
;@Des : 在屏幕上显示绿色, 绿底红字, 白底蓝字的字符串"welcome to masm!"
;@Annex :
;在屏幕上显示绿色, 绿底红字, 白底蓝字的字符串"welcome to masm!"
;[B8000H,B8F9FH]上的数据会被显示.
;
;一个字符需要用2个字节, 低字节存储字符, 高字节存储字符的属性.
;7 6 5 4 3 2 1 0
;BL R G B I R G B
;闪烁 背景 高亮 背景
;
;思路:
; 1.需要定位到[B8000H,B8F9FH]上, 利用ES做段寄存器, si做偏移地址. 将数据反复
; 传递给es:[si]. 伪代码为 :
;
; ;定位到[B8000H,B8F9FH]上.
; mov es,B800H
; mov si,0
;
; ;循环将16个字符存储到es:[si]上, 从而达到显示目的
; mov cx, 16
;s: mov es:[si], character
; mov es:[si+1], proptery-of-color
; add si, 2
; next character ;暂不实现.
; loop s
;
; 2.实现字符的递进
; mov ax, data
; mov ds, ax
;
; mov bx, 0
;
; mov cx, 16
;s: mov character, ds:[bx]
; inc bx
; loop
;******************************************************************************
assume ds:data, cs:code ;
data segment
MSG : db 'welcome to masm!' ; 占16个字节.
data ends
code segment
start:
;定位数据源src
mov ax, data
mov ds, ax
mov bx, 00h
; 定位数据输出区dest
mov dx, 0b800h
mov es, dx
mov di, 0
mov cx, 16
print: mov al, ds:[bx]
mov byte ptr es:[si], al ;al作为临时空间, 存储字符
mov byte ptr es:[si+1], 00000010b ;2表绿色
add si, 2 ;注意是加2, 因为还有一个字节用来存储字符属性.
inc bx
loop print
mov ax, 4c00h
int 21h
code ends
end start
;思考: print标号处可否不利用al做temp变量, 直接将ds:[bx]内的数据拷贝到es:[si]内? 为什么?
本文介绍使用MASM汇编语言在屏幕上显示带有颜色属性的字符串welcometomasm!的方法。通过设置不同颜色属性,实现了绿色、绿底红字及白底蓝字的效果。文章详细解释了内存地址定位、字符及其属性存储过程。
940

被折叠的 条评论
为什么被折叠?



