汇编语言写颜色闪烁的时候出现bug问题,探究显示屏显示内存区域单步调试问题

; 完成目标:在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串“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显示屏在不断变化,所以显示内存中不能正确的显示相应的数据。
这里本人大胆猜测,显示屏中的数据应该是存放在其他的位置中去了,每当赋值完一行时就会正常显示,因为这里程序运行完之后仍然能够显示正常的数据
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值