我正在爲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)
感謝您的幫助!
模式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
你爲什麼刪除你的代碼?沒有它,這個問題及其答案對網站來說就沒有多大價值! – STLDeveloper 2014-11-04 01:49:11