; 完成目标:在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串“welcome to masm!” ; 其它需要知道的知识点: ; 1.
内存空间中,B8000H-BFFFFH共32KB的空间,为80X25彩色字符模式的显示缓冲区,向这个地址空间写入数据,写入地数据将立架出现在显示器山。
; 1. 显示器显示25行,每行80个字符,每个字符可以有256种属性。 ; 2.
一个字符在显示缓冲区就要占两个字节,分别存放字符的ASCII码和属性。 ; 3. 一屏的内容在显示缓冲区中共占4000个字节。
80x25=2000 ; 4. 一个字节,低位字节存储字符的ASCII码,高位字节存储字符的属性。 ; 5. 7 6 5 4 3 2 1 0
; BL R G B I R G B ; 闪烁 背景色 高亮 前景 ; ; 6. 如: 黑底绿字: 0000 0010B => 02H ;
闪烁+绿底白字: 1010 0100B => A4H ; 白底蓝字: 0111 0001B => 71H ; ; 7. ‘welcome
to masm!’对应的十六进制为:77H, 65H, 6CH, 63H, 6FH, 6DH, 65H, 20H, 74H, 6F,
20H, 6DH, 61H, 73H, 6D, 21H。 ; 7. 闪烁的效果必须在全屏DOS下才能看到。
我的代码出现了点小bug,貌似只能显示两行
assume ds:data,cs:code,ss:stack
data segment
db ‘welcome to masm!’
db 00000010b,00100100b,10001001b,0,0,0,0,0,0,0,0,0,0,0,0,0;使用分段数据的好处
;每次循环的时候只要调用相应的数据即可
;这段为颜色字段
dw 16012+64,16013+64,160*14+64,0,0,0,0,0
;加64为程序中间位置,用行数乘以偏移地址量得到最终的起始地址
;这段数据为偏移量字段
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start:mov ax,stack
mov ss,ax
;ss = 076d
mov sp,0010h
;sp = 0010h
mov ax,data
;让ax保存程序数据的起始地址
;ax = 076ah
mov cx,3
;cx = 0003
mov di,0
;di = 0000
s1:push cx;076d:000e = 0003
mov si,ax
;si = 076ah
inc si;ax挪移一格
;si = 076bh
mov es,si;程序打到颜色字段部分
;es = 076bh
mov dl,es:[di]
;dl负责保存颜色字段
;dl = 02h
mov si,ax
inc si
inc si;ax挪移两格
mov es,si;段地址为偏移量字段
;es = 076c
mov bp,es:[di]
;bp负责保存偏移量字段
;bp = 0780
;将076c:0000中的值放入bp中
;即bp = 07c0
mov cx,16
;cx = 0010
mov si,0;内层循环所用数据
;si = 0000
mov es,ax;es中存放data的地址
;es = 076ah
inc di
s2:mov bx,0b800h
mov ds,bx
;ds = 0b800h
mov bl,es:[si];将相应的asc码存放入相应的地址
;将076a:0000中的值放入bl之中
;位置:ip = 0031,bl = 77
mov ds:[bp],bl
;将bl = 77中的值放入b800:07c0中去
;ip = 0034
;ip = 0034位置程序出现bug的位置!!!!!!!!!
inc bp
mov ds:[bp],dl;dl负责保存颜色字段,将颜色放入第二位
inc bp
inc si;进入下一个数据的asc码
loop s2
pop cx
loop s1
mov ax,4c00h
int 21h
code ends
end start
最后运行完之后发现出现bug,一个是只能显示两次,少显示了一次循环,第二个是循环之后地址中的数据貌似并没有变成自己想要的?从ip = 0034开始
这里试图将bl中的数据存放到b800:07c0的位置,现在尚未运行这一条语句,我们先查看一下b800:07c0位置的数据
程序出现问题,程序运行后面显示ds:07c0 = 20,但是查看b800:07c0位置的数据却为63
接下来我们看看运行过后程序是否有问题
这里又出现了问题,本来bx = b877,bl=77,但是运行这个数据之后
内存中的数却改为了30,这说明通过查看内存的方式不能查看到存入显示区的正确的值,究其原因我认为是dos显示屏在不断变化,所以显示内存中不能正确的显示相应的数据。
这里本人大胆猜测,显示屏中的数据应该是存放在其他的位置中去了,每当赋值完一行时就会正常显示,因为这里程序运行完之后仍然能够显示正常的数据