我一直在遵循https://wiki.osdev.org/Bare_Bones的Bare Bones内核指南,但我不理解这些方法。有人能解释一下为什么方法中的位运算符是必要的吗?提前感谢!
enum vga_color {
VGA_COLOR_BLACK = 0,
VGA_COLOR_BLUE = 1,
VGA_COLOR_GREEN = 2,
VGA_COLOR_CYAN = 3,
VGA_COLOR_RED = 4,
VGA_COLOR_MAGENTA = 5,
VGA_COLOR_BROWN = 6,
VGA_COLOR_LIGHT_GREY = 7,
VGA_COLOR_DARK_GREY = 8,
VGA_COLOR_LIGHT_BLUE = 9,
VGA_COLOR_LIGHT_GREEN = 10,
VGA_COLOR_LIGHT_CYAN = 11,
VGA_COLOR_LIGHT_RED = 12,
VGA_COLOR_LIGHT_MAGENTA = 13,
VGA_COLOR_LIGHT_BROWN = 14,
VGA_COLOR_WHITE = 15,
};
static inline uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg)
{
return fg | bg << 4;
}
static inline uint16_t vga_entry(unsigned char uc, uint8_t color)
{
return (uint16_t) uc | (uint16_t) color << 8;
}发布于 2019-04-20 18:54:56
该代码用于生成VGA Compatible Text Mode,
枚举指定了一个采用四位的颜色表。第一个函数接受前景和背景颜色,并对背景颜色进行位移位,以便这两种颜色适合八位无符号整数。
第二个函数接受上面定义的8位uint,并将其附加到8位字符,以产生定义字母、背景色和前景色的16位值。
发布于 2019-04-21 07:37:03
看起来你是在一个每像素4位的模型中操作。因此,每个字节需要两个值。位碎片将两个4位值放入一个8位字节中。
https://stackoverflow.com/questions/55767742
复制相似问题