|
50鱼币
先直接上代码
***********************************************************************************************
assume cs:codesg,ds:datasg
datasg segment
db 3 dup ('w e l c o n e t o m a s m ! ') ;16个+16个空白
datasg ends
codesg segment
start:
mov ax,datasg ;跟ds挂钩
mov ds,ax
mov ax,0b800h ;es跟80x25显存挂钩
mov es,ax
mov cx,16 ;16个字符,循环16次
mov di,0
mov bx,0
s: mov byte ptr ds:[di+1],02h ;用s,s1,s2循环给字节设置属性
add di,2
loop s
mov cx,16
s1: mov byte ptr ds:[di+1],24h
add di,2
loop s1
mov cx,16
s2: mov byte ptr ds:[di+1],71h
add di,2
loop s2
mov cx,16
mov bx,0
mov di,0
s3: mov ax,ds:[bx] ;用s3,s4,s5循环把设置好的字符写入80x25显存中
mov es:[bx+6ffh],ax
add bx,2
loop s3
mov cx,16
mov bx,0
s4: mov ax,ds:[bx]
mov es:[bx+79fh],ax
add bx,2
loop s4
mov cx,16
mov bx,0
s5: mov ax,ds:[bx]
mov es:[bx+83fh],ax
add bx,2
loop s5
mov ax,4c00h
int 21
codesg ends
end start
;段地址b800开始
;行从偏移6e0h-77fh开始 字绿色 02
; 780h-81fh 绿地红色24
; 820h-8bfh 白底蓝字71
;列从+1f开始
*****************************************************************************************************
求错处,思路是这样的:
先把字节属性给设置了,然后再把设置好的字符写入80x25的显存中.可不是为什么出来的是小脸,想看debug看原因显存时时变动看不了,去看ds段的属性觉得没问题.问题就是写入显存的时候就变成笑脸了!
求高人点明错处!
|
最佳答案
查看完整内容
你的问题我找到了。你的思路没有错。关键是你的显存地址算错了。导致数据写入错位。附上调试图。
你再根据书本的p188仔细算算显存地址。我帮你改了第一行就立马显示对了一行。下面的两行自己改咯。
PS:你的原程序里面int 21h 写成了int 21 真坑爹啊
再附上我以前写的这个题的原程序,你参考参考咯。
|