我正在一个项目在16位TASM,其中相当大的一部分涉及访问视频内存相当广泛。该项目是320x200x256 VGA模式,我通过DOSBox中8086大会视频内存差异
例如我有以下的指令集来填充/在节目的开始擦拭屏幕上运行它:
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屏幕上显示的所有内容,但没有任何内容被分配给视频内存。一点也不。在程序结束时,我检查内部是否有任何东西,它全部为零。
当我按住F7几分钟,我可以看到数值被放置在寄存器中,所以我知道它们在那里,但是当我停止按住几百像素之后的按键并放开它时,值不再被分配。当我查看屏幕时,它是一半的颜色和另一半的颜色。
我不知道这是否与我的调试器或与dosbox或我的代码中的东西有问题,但我必须将这些值保留在某处,以便稍后可以访问它们。基本上,我的程序到底是什么?
编辑:我没有代表张贴图像,所以http://puu.sh/3iKhw.png是它看起来像是如果我按住F7 0x600像素,然后放开颜色0x3B。中间线只是一个偶然的点击
不知您对显存的位置? B800:xxxx是通常的输出 – ady
ret 2 - 这是什么意思? pop bx ax bp看起来很方便,在之前没有看到过 – ady
您没有向我们展示您将值分配给'es'的位置,因此很难说它是否预计会在某个特定点处具有某个值程序。顺便说一句,通过使用“REP STOSB”,您可以大量简化“FillScreen”过程。 – Michael