RAV*_*eus 2 x86 assembly kernel osdev vga
我目前正在编写自己的操作系统(只是为了好玩,我 16 岁)并且我创建的 outprint 函数有问题。我想更改文本颜色(不是背景颜色),但它不起作用。
我已经创建了自己的printf函数SystemOutPrint/ln(以 Java 命名,因为那是我的“主要”语言,对于那些受伤的人)并发现我可以通过在 AH 寄存器中写入来更改背景颜色。在此功能之前,我在内核中什么也没做,引导加载程序只将 GDT、LDT 和模式从 16 位设置为 32 位。所以在 mov ebx, 0xb8000 之前,视频内存是不变的。
相关代码:
kmain:
mov ebx, 0xb8000 ;Video Memory
mov esi, kernelVersion
mov ah, 0x0
;setting ah to 0x0 is not neccessary, because its the default but if you
;would put in A for example it would be light green, etc.
call SystemOutPrintln
SystemOutPrintln:
mov ecx, ebx
.printChar:
lodsb
test al,al
jz .newLine
or eax,0x0F00
mov word [ebx], ax
add ebx, 2
jmp .printChar
.newLine:
mov edx, ebx
sub edx, ecx
mov ecx, 0x000A0
sub ecx, edx
add ebx, ecx
ret
kernelVersion: db "Kernel Version: 0.0.1", 0
Run Code Online (Sandbox Code Playgroud)
我尝试过的:更改 eax 中的每个字节以查找前景色的属性字节。通过进行这种尝试和错误,我发现更改 ah 适用于背景颜色,但 al 用于测试 al, al 以找到字符串的结尾,而 eax 中不是 ax 的部分被简单地驳回功能。我没有尝试更改其他寄存器中的某些内容,因为它们用于其他用途或根本不用于任何用途,因此对我来说没有意义。一个网站(我没有找到链接它)说属性字节的定义如下:BG 颜色的十六进制值(例如 F 表示白色)* 16 = F0 + FG 颜色的十六进制值(让 A 表示浅绿色)什么应该是FA。如果我执行“mov ah, 0xFA”,我会将背景更改为白色,但前景仍然是白色(默认)。
为此提供一个最小的可复制示例将不再是最小的,因为我还必须为您提供引导加载程序和 GDT。但是,如果有人能告诉我哪个字节是前景色属性字节,那就足够了,这样我就可以专注于尝试使该字节起作用,而不必在尝试和错误中重写整个视频内存。
第一的; 让我们稍微优化一下您的代码。具体来说,对于这个循环:
.printChar:
lodsb
or al,al
jz .newLine
or eax,0x0F00
mov word [ebx], ax
add ebx, 2
jmp .printChar
Run Code Online (Sandbox Code Playgroud)
..第一次迭代后,中的值ah不会改变;以便指令可以从循环中解除以提高性能。也or eax,0x0F000与较短的or ah,0x0F. 有了这两个变化,它最终是这样的:
or ah,0x0F
.printChar:
lodsb
or al,al
jz .newLine
mov word [ebx], ax
add ebx, 2
jmp .printChar
Run Code Online (Sandbox Code Playgroud)
现在添加一些注释,如下所示:
or ah,0x0F ;Force the foreground colour for all characters to be white
.printChar:
lodsb ;al = next character
or al,al ;Is the next character zero?
jz .newLine ; yes, don't print it and move to the next line instead
mov word [ebx], ax ;Store next character (from string) and attribute (from outside the loop)
add ebx, 2 ;bx = address to store next character and attribute
jmp .printChar
Run Code Online (Sandbox Code Playgroud)
请注意,注释(例如“强制所有字符的前景色为白色”)很有用,因为:
他们减少了理解代码应该做什么的时间
他们可以很容易地看到指令没有按照评论所说的去做的错误
| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |