assembly 将单个字节复制到XV6 8086组件0x13 VGA(真实的模式)中的多个存储器位置

lb3vh1jj  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(100)

在任何人告诉我这项技术已经过时之前,我知道这个项目的范围是非常具体的。
我的要求是通过直接写入视频存储器将填充矩形打印到输出(真实的模式下为0x13)。我通过沿着x轴绘制每一行并存储颜色字节来实现这一点(在本例中为11)到VGA存储器0xa0000 +偏移量。然而,本项目的要求要求是一种比循环将每个像素绘制为I'M直接寻址视频存储器。
我似乎不知道是否有办法复制单个字节(值:11)。作为一个实验,我尝试通过将字节乘以0x01010......然后将整个两个字节移动到内存中来跨寄存器复制字节。该实验是成功的,它产生了一条两个像素长的水平线,从0xa0000 + offset定义的内存位置开始。
我的问题是,这只有两个位。0x13模式的分辨率是320x200,使得寄存器的使用效率很低。我曾考虑过使用.string等,但这也违反了范围的要求。绘制一个数组并分配一个总计64kb的大小,万一其中一些像素可能会被使用,听起来效率也很低。如果在真实的模式下可能的话。所以我排除了这个可能。
另一个不起作用的因素是,有时线可能需要向下而不是水平绘制,并且不会像存储从内存地址开始的字节块那样简单。
不过,如果我能找到一种方法,将相同字节的动态数字复制到从给定位置开始的内存块中,那么我就可以取得巨大的进步,这就是我目前的目标。
有没有什么方法可以做到这一点,而不事先分配大量的空间?假设我想画一条18像素长的线,我想复制一个字节的值11到18字节的一个段开始在给定的偏移量。
谢谢你,我希望我已经描述得够详细了。

qni6mghb

qni6mghb1#

我的要求是通过直接写入视频存储器(真实的模式下为0x13)将填充矩形打印到输出。
然而,这个项目的需求要求一个比循环绘制每个像素更有效的方法,因为我直接寻址视频内存。
绘制每一个像素确实是低效的。我显示的代码如下:

  • 只计算左上角像素的地址
  • 一次写入2个像素
  • 避免在奇数地址写入字

我选择在寄存器中传递参数,但是如果你愿意你可以改变它,使它使用堆栈。这是纯粹的8086代码,如果你的目标是后期cpu的真实的模式,那么一次输出至少4个像素是可能的。

; 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

相关问题