assembly 如何在汇编中进行线性帧缓冲

nwnhqdif  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(134)

我正在使用Bochs,并试图开发一个简单的操作系统,使用汇编和C。
我已经选择使用1024 x768的24 bpp,但我不能写入屏幕的大部分,因为0xa 0000到0xaffff没有足够的空间(只有64 KB)。
我尝试将像素写入屏幕,但正如我所说的,几乎什么都写不出来。我只是做了一个测试,看看我是否可以写入屏幕,但失败了:

如何使用/启用帧缓冲区,以便写入所有屏幕?

uemypmqf

uemypmqf1#

当文档中提到“帧缓冲区位于0xa0000 - 0xaffff”时,他们指的是物理寻址,这不是8086 CPU能够寻址内存的方式。它使用段偏移系统,这意味着您需要使用段寄存器dses来指向高四个十六进制数字。这有点令人困惑,但最终发生的是DS或ES中的值实际上乘以16,然后SI或DI中的值与该值相加,该值用于计算要写入的地址。这一切都是自动发生的。
这个例子使用VGA模式13H(320x200,8bpp),但是你会明白的。

mov al,13h
int 10h     ;enter 256 color VGA mode

mov ax,0A000h
mov es,ax  ;you can't MOV a constant directly into ES so you need to use another register first.

mov di,0    ;when combined together, [es:di] aliases address 0xA0000
mov al,0FFh ;white
mov [es:di],al  ;makes the top left pixel of the screen white
;I could have just written "mov [di],al" since it defaults to using ES anyway.

希望这有帮助,我从来没有使用过386 CPU,所以我所知道的是16位版本。

相关问题