簡體   English   中英

將單個字節復制到 XV6 8086 程序集 0x13 VGA(實模式)中的多個 memory 位置

[英]Copy single byte to multiple memory locations in XV6 8086 Assembly 0x13 VGA (Real Mode)

在有人告訴我這項技術已經過時之前,我知道該項目的 scope 非常具體。

我的要求是通過直接寫入視頻 memory(實模式下為 0x13)來將填充的矩形打印到 output。 我通過沿 x 軸繪制每條線並將顏色字節(在本例中為 11)存儲到 VGA memory 0xa0000 + 偏移量來實現這一點。 然而,這個項目的要求要求一種比循環繪制每個像素更有效的方法,因為我直接處理視頻 memory。

我似乎無法弄清楚是否有辦法跨多個 memory 位置復制單個字節(值:11)。 作為實驗,我嘗試通過將字節乘以 0x01010 來跨寄存器復制字節...然后將整個兩個字節移動到 memory。該實驗成功了,它產生了一條從 memory 位置開始的兩個像素長度的水平線由 0xa0000 + 偏移量定義。

我遇到的問題是,這只是兩位。 0x13 模式的分辨率是 320x200,這樣使用寄存器的效率很低。 我曾考慮過使用 of.string 等,但這也違反了 scope 的要求。繪制一個數組並分配一個總計 64kb 的大小,以防其中一些像素可能被使用,這聽起來也非常低效,即使可能的話在實模式下。 所以這對我來說排除了。

這不起作用的另一個因素是有時可能需要向下而不是水平繪制線,並且不會像存儲從 memory 地址開始的字節塊那樣簡單。

然而話雖如此,如果我能想出一種方法將相同字節的動態數字復制到從給定位置開始的 memory 塊,那么我可以取得巨大進步,所以這就是我當前的目標。

有沒有辦法在不事先分配大量空間的情況下做到這一點? 假設我想畫一條 18 像素長的線,我想將值 11 的字節復制到從給定偏移量開始的段的 18 字節中。

在此先感謝,我希望我的描述已經足夠了。

我的要求是通過直接寫入視頻 memory(實模式下為 0x13)來將填充的矩形打印到 output。
然而,這個項目的要求要求一種比循環繪制每個像素更有效的方法,因為我直接處理視頻 memory。

繪制每個像素確實效率低下。 我在下面顯示的代碼:

  • 只計算左上角像素的地址
  • 一次寫入 2 個像素
  • 避免在奇數地址寫一個字

我選擇在寄存器中傳遞 arguments,但如果您願意,可以更改它以便它使用堆棧。 這是純 8086 代碼。 如果你針對的是后面cpu的real mode,那么一次至少輸出4個pixel是可以的。

; BL is color [0,255]
; CX is X [0,319]
; DX is Y [0,199]
; SI is width [1,320]
; DI is height [1,200]
; IN (bl,cx,dx,si,di) OUT () MOD (ax,bx,cx,dx)
PaintRectangle:
  push es           ; DirectionFlag (DF) assumed 0
  push di

  mov  ax, 0A000h   ; Video buffer for 256-color mode 13h (320 x 200)
  mov  es, ax
  mov  ax, 320      ; BytesPerScanline (BPS)
  mul  dx           ; Y * 320
  add  ax, cx       ; Y * 320 + X
  xchg ax, di       ; DI is address, AX is height
  xchg ax, bx       ; BX is height, AL is color
  mov  ah, al       ; AH is color too

.loop:
  mov  cx, si       ; Width 1+
  test di, 1
  jz   .even
  stosb             ; First/only pixel on an odd offset address
  dec  cx
.even:
  shr  cx, 1
  rep stosw         ; Two pixels together on an even offset address
  jnc  .done
  stosb             ; Last pixel on an even offset address
.done:
  sub  di, si       ; Back to left side of rectangle
  add  di, 320      ; Descending one scanline
  dec  bx           ; Height--
  jnz  .loop

  pop  di
  pop  es
  ret

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM