我正在开发一个 16 位 TASM 项目,其中很大一部分涉及非常广泛地访问视频内存。该项目处于 320x200x256 VGA 模式,我正在通过 Dosbox 运行它
例如,我有以下一组指令来在程序开始时填充/擦除屏幕:
GFXMode proc ;Initialize 256-Color Graphics Mode [Args: None] [Returns: None]
push ax
mov ax, 0013h
int 10h
mov ax, 0a000h
mov es, ax
pop ax
ret
GFXMode endp
RefreshOff proc ;Disables screen refresh while drawing [Args: None] [Returns: None]
push ax bx
mov ax, 1201h
mov bl, 36h
int 10h
pop bx ax
ret
RefreshOff endp
FillScreen proc ;Fills screen with a certain color [Args: 8-bit Color] [Returns: None]
push bp
mov bp, sp
push ax bx
mov al, ss:[bp + 4] ;Color
mov bx, 0h
_fillScreenNextPixel:
mov es:[bx], al
inc bx
cmp bx, 0ffffh
jb _fillScreenNextPixel
pop bx ax bp
ret 2
FillScreen endp
RefreshOn proc ;Shows changes on screen [Args: None] [Returns: None]
push ax bx
mov ax, 1200h
mov bl, 36h
int 10h
pop bx ax
ret
RefreshOn endp
并且函数 FillScreen 通常被赋予 0FFh,因此它应该绘制为白色。
自从我使用 TASM 以来,我一直在使用 Turbo Debugger 进行调试。并且发生了一些非常奇怪的事情——我可以在调试器中按 F7 逐行推进,或者我可以按 F9 跳到最后。所以我正在看 es 段的内容(在两种情况下都设置为 A000),两次,一次是按 F9,然后是按 F7(直到我不能再按住)
当我按 F9 时,一切都显示在屏幕上,但没有分配给视频内存。一点也不。在程序结束时,我检查 es 内是否有任何内容,并且全为零。
当我按住 F7 几分钟时,我可以看到值被放置在寄存器中,所以我知道它们在那里,但是当我在几百个像素后停止按住键并放开它时,值停止被分配。当我查看屏幕时,一半是一种颜色,一半是另一种。
我不知道这是否是我的调试器或 dosbox 或我的代码中的某些东西的问题,但我必须将这些值保存在某个地方,以便以后可以访问它们。基本上,我的程序到底是怎么回事?
编辑:我没有代表发布图像,所以如果我按住 F7 为 0x600 像素然后放开颜色 0x3B,http: //puu.sh/3iKhw.png就是它的样子。中间的那条线是误点击才出现的