Memory 8086部件:读取视频存储器的数据错误

Memory 8086部件:读取视频存储器的数据错误,memory,assembly,x86-16,Memory,Assembly,X86 16,我正在为一个学校项目工作,这个项目是用8086汇编语言编写的一个小游戏。 我必须在屏幕上画图(给一些像素上色),为此我使用中断10h和模式13h(ax=13h)。这是一个320像素X 200像素的视频模式 (注意:您最好在另一个选项卡中打开代码来阅读下面的文本(您将更好地理解我用文字解释的内容)) 我想首先初始化屏幕,确保每个像素都是黑色的。为此,我首先用black=color number 0初始化调色板 之后,我使用我编写的原语for循环程序初始化屏幕(将每个像素设置为黑色)。我分别将开始索

我正在为一个学校项目工作,这个项目是用8086汇编语言编写的一个小游戏。 我必须在屏幕上画图(给一些像素上色),为此我使用中断10h和模式13h(ax=13h)。这是一个320像素X 200像素的视频模式

(注意:您最好在另一个选项卡中打开代码来阅读下面的文本(您将更好地理解我用文字解释的内容))

我想首先初始化屏幕,确保每个像素都是黑色的。为此,我首先用black=color number 0初始化调色板

之后,我使用我编写的原语for循环程序初始化屏幕(将每个像素设置为黑色)。我分别将开始索引(视频内存中的索引(即,第一个像素为0))、停止索引(64000,最后一个像素(320px 200px=64000))和索引必须递增的步长作为参数传递

因此它所做的就是从指定的开始地址循环到内存中指定的停止地址,并为每个地址设置0(因为黑色=调色板的颜色编号0)

所以通常情况下,我的屏幕上的每个像素都是黑色的。事实上,当我启动我的小程序时,会出现320x200视频模式,屏幕是黑色的

在程序中,我通常必须比较屏幕上像素的颜色。通常,当我访问视频内存中的某个地址时,该地址必须为0(因为我将整个屏幕初始化为黑色(颜色编号0)),除非我用另一种颜色对该像素着色

但是在测试我的程序时,我发现屏幕上的某些像素是黑色的(并且自从初始化以来,我从未改变过它们的颜色)但是当我显示它们的值时,它似乎是512而不是0。我不明白为什么,因为自从我初始化它们以来,我从未改变过颜色

我花了几个小时试着调试它,但我不明白为什么那个像素突然从调色板的颜色编号0(黑色)变为512

因为颜色值为512的像素在屏幕上也是黑色的,我想这也是该颜色的一个值,但我想显式地使用颜色数0表示黑色,这样我就可以比较它(因为现在有0表示黑色,也有512表示黑色,可能还有其他黑色值)

守则的有关部分:

mov ax, 0a000h ; begin address of video memory
mov es, ax
mov ax, [bp+4][0] ; We put the 1st argument (index) in register ax

mov di, ax
;;;; FOR DEBUGGING PURPOSES
mov ax, es:[di]
push ax ; We print the color of the pixel we are checking (normally has to be 0 if that pixel is black on the screen)
call tprint ; 70% of the time the printed color number is 0 but sometimes it prints color number 512 (also a black color but I don't want that, I initialized it to 0!!)
;;;; END DEBUG
;;;; ALSO STRANGE IS THAT WHEN I OUTCOMMENT THESE 3 LINES ABOVE, THE LAST PIXEL OF THE FIRST ROW IS COLORED
;;;; WHEN I LEAVE THESE 3 LINES LIKE NOW (PRINTING THE VALUE OF THAT PIXEL) IT IS THE NEXT PIXEL THAT IS COLORED
;;;; (strange but i don't really care since it was introduced only to debug)

CMP es:[di], 0 ; Comparison to see if the pixel we are checking is black.
; But when it is 512, my program will think it isn't the black color, and will stop executing (because after this call I do a JNZ jump to quit the loop)

谢谢你的帮助

正如@nrz所暗示的,问题在于数据大小,尽管与他描述的略有不同。实际上,您正在加载2个字节,因此一次加载2个像素,而不是1个。如果颜色为0的像素与颜色为2的像素相邻,则值为512


您需要将第182行更改为
movzx ax,byte ptr es:[di]
并将第190行更改为
cmp byte ptr es:[di],0
(使用您的汇编程序对字节操作支持的任何语法)。

在模式13h(320x200x8bit)中不能使用颜色512,因为每个像素只使用一个字节,因此无符号值的范围为0到255。在不检查代码的情况下,我假设您将零值从内存加载到低8位寄存器(
al
bl
cl
dl
),并在相应的高8位寄存器中具有值2(
ah
bh
ch
dh
)然后在相应的16位寄存器(
ax
bx
cx
dx
)中,自然有512(2*256+0)。为什么要删除代码?如果没有它,这个问题及其答案对网站的价值就会降低!