2014-11-04 59 views
0

我正在爲8086彙編語言編程的小遊戲開展一個學校項目。 我必須在屏幕上繪製(顏色一些像素),這樣做我使用模式13h(ax = 13h)的中斷10h。這是一個320像素×200像素的視頻模式。8086彙編:錯誤的數據讀取視頻內存

(注:你可以閱讀最底下與另一個選項卡中打開該代碼的文本(你會更好地瞭解我的話我解釋))

首先初始化所以我確定每個像素都是黑色的。爲此,我首先初始化一個黑色=顏色編號爲0的調色板。

之後,我使用原始循環過程寫入初始化屏幕(將每個像素設置爲黑色)。我分別以參數的形式傳遞開始索引(視頻內存中的索引(即第一個像素爲0)),停止索引(64 000,最後一個像素(320像素×200像素= 64 000))和索引具有的步長增加。

所以它所做的是從指定的開始地址循環到指定的停止地址在內存中,併爲每個地址0(因爲黑色=調色板的顏色編號0)。

所以一般現在我的屏幕上的每個像素都是黑色的。事實上,當我啓動我的小程序時,會出現320x200視頻模式,並且屏幕顯示爲黑色。

進一步在程序中我經常必須比較屏幕上像素的顏色。通常當我在視頻內存中訪問某個地址時,它必須是0(因爲我初始化了整個屏幕爲黑色(顏色編號0)),除非我用另一種顏色爲該像素着色。

但測試我的節目,我發現,特定像素是黑色的屏幕上時(且因爲初始化我從來沒有改變它們的顏色)但是當我展示了他們的價值,這似乎是512,而不是0 。我不明白爲什麼,因爲我初始化它們之後從未改變顏色。

我花了幾個小時試圖調試它,但我想不出由於顏色值512的像素也是黑色的,爲什麼該像素突然從調色板(黑色)的色數0更改爲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) 

感謝您的幫助!

+1

模式13h(320x200x8bit)中不能有彩色512,因爲每個像素只使用一個字節,所以無符號值的範圍是0到255.如果不經過您的代碼,我假設您從內存中加載了零值到低8位寄存器('al','bl','cl'或'dl'),並且在相應的高8位寄存器('ah','bh','ch', 'dh'),然後在相應的16位寄存器('ax','bx','cx'或'dx')中自然有512(2 * 256 + 0)。 – nrz 2014-11-04 00:47:09

+1

你爲什麼刪除你的代碼?沒有它,這個問題及其答案對網站來說就沒有多大價值! – STLDeveloper 2014-11-04 01:49:11

回答

0

正如@nrz暗示的那樣,問題在於數據大小,雖然與他所描述的略有不同。實際上,您正在加載2個字節,因此2個像素一次代替1個。如果像素的顏色爲0的像素位於像素的顏色2旁邊,則會得到512的值。

您需要將第182行更改爲movzx ax, byte ptr es:[di]並將行190到cmp byte ptr es:[di], 0(使用匯編器支持的任何語法進行字節操作)。