你需要一個RAM中的緩衝區(320 * 200 = 64000字節)。這個緩衝區幾乎填滿了一個段,因此最好確保緩衝區起始地址是「segment:0x0000」。您可以通過在RAM中設置此緩衝區中的像素/字節來繪製圖形。例如,要設置的(x,y)的像素,以顏色C你可能會做:
mov ax,[y]
mov dx,320
mul dx ;dx:ax = y * 320
mov di,[x] ;di = x
add di,ax ;di = y * 320 + x
mov bx,[bufferSeg] ;bx = segment of video buffer
mov es,bx ;es:di = address of pixel
mov al,[c] ;al = colour
mov [es:di],al ;Store colour in buffer at (x,y)
正如你可以看到這種計算是凌亂/慢;你不想爲每一個像素做。幸運的是,您幾乎從不需要繪製單個像素(通常是繪製線條或字符,或「精靈」),通常您可以計算第一個像素的地址,然後添加一些內容以找到下一個像素的地址從頭開始計算下一個像素的地址。例如,對於繪製垂直線,下一個像素的地址是前一個像素的地址+ 320.
對於圖形模式0x13;顯示內存在物理地址0x000A0000(或0xA000:0x0000)。繪製完所有內容後,您需要將所有內容從緩衝區複製到顯示內存。例如:
mov ds,ax ;ds = segment for buffer
xor si,si ;si:si = address for buffer
mov ax,0xA000 ;ax = segment for display memory
mov di,ax ;di = segment for display memory
mov es,ax ;es:di = address for display memory
mov cx,320*200/2 ;cx = number of words to copy
cld ;Make sure direction flag is clear
rep movsw ;Copy 320*200/2 words from buffer to display memory
這不是一個彙編本身的問題,而是你的代碼將運行在哪個硬件和軟件環境中。你使用的是操作系統嗎?如果是這樣的話? –
這個以前是通過翻頁25年前完成的。他的法拉利得到了John Carmack。那麼,1990年的模型,直到他厭倦了他們,並開始火箭。 –