;******************************************************************************
;
______
;
.-" "-.
;
/ 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]内? 为什么?