【发布时间】:2021-09-04 03:41:19
【问题描述】:
我正在开发一个简单的操作系统内核,并且我正在尝试制作一个可以工作的视频库,以便以后可以使用它。 (VBE 版本 3.0,1920 * 1080px,32bpp)。
我在 C 中编写了一个像素绘图函数,似乎工作正常:
void putPixelRGB(struct MODEINFOBLOCK mib, short x, short y, int color) {
int *pos = (char *)mib.framebuffer + x * 4 + y * 7680;
*pos = color;
}
然后我尝试使用这个函数和两个for 循环来填充整个屏幕:
for(int i = 0; i < 1920; i++) {
for(int j = 0; j < 1080; j++) {
putPixelRGB(mib, i, j, 0xFFFFFF);
}
}
(我什至尝试用 0xFF 填充视频内存中的每个单个字节,以确保我没有改变其他像素或东西:P...而且,嗯.. 我得到了相同的结果。)
dloop:
mov byte[eax], 0xFF ;eax contains the address of the FB memory.
inc eax
cmp eax, 829440 ;829440 = 1920 * 1080 * 4
jg done
jmp dloop
done:
hlt
知道为什么这不起作用吗?我是否以错误的方式访问内存?
编辑:
MODEINFOBLOCK 结构:
struct MODEINFOBLOCK {
int attributes;
char windowA, windowB;
int granularity;
int windowSize;
int segmentA, segmentB;
long winFuncPtr;
int pitch;
int resolutionX, resolutionY;
char wChar, yChar, planes, bpp, banks;
char memoryModel, bankSize, imagePages;
char reserved0;
char readMask, redPosition;
char greenMask, greenPosition;
char blueMask, bluePosition;
char reservedMask, reservedPosition;
char directColorAttributes;
char* framebuffer;
long offScreenMemOff;
int offScreenMemSize;
char reserved1 [206];
};
【问题讨论】:
-
modeinfo 说什么?另外,这不是minimal reproducible example。无论如何,很难找到具有正常工作 VBE3 的真正显卡。
-
@Jester 我会更新的。
-
我知道结构,我想知道当前模式的值。
标签: c assembly x86 kernel vesa