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