繁体   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