Ben*_*ler 13 x86 assembly inline-assembly rust
我正在通过关于在Rust中编写操作系统的Phil-Opp教程,并且在稍微玩了一下后,我想摆弄在屏幕上显示真实图形.
我已经想到我应该从使用线性帧缓冲器开始,使用VESA.我在这里和这里找到了osdev.org上的一些教程,但他们继续谈论"功能代码"和es:di.第二个链接说:
功能:获取VESA BIOS信息
功能码:0x4F00
说明:返回VESA BIOS信息,包括制造商,支持的模式,可用的视频内存等...输入:AX = 0x4F00
输入:ES:DI =段:偏移指向存储VESA BIOS信息结构的位置的指针.
输出:成功时AX = 0x004F,其他值表示不支持VESA BIOS.
无论如何,上面的函数返回以下结构并将它存储在ES:DI中,因为它们在输入时.在输入时,ES:DI应包含指向以下结构的指针:
vbe_info_structure: .signature db "VBE2" ; indicate support for VBE 2.0+ .table_data: resb 512-4 ; reserve space for the table below
虽然我已经看了一些汇编语言教程,但我不知道"功能代码"是什么.根据我的理解,如果我mov ax, 0x4f00,并创建一个类似上面的结构,它将神奇地覆盖结构,然后我可以作为参数传递给我的Rust代码?我如何,或者我需要设置我的es:di?(从研究开始,我认为它只是在现代处理器上自动设置)
我应该在Inline Assembly中完成所有这些工作吗?我应该只使用UEFI并重写我的内核吗?如果您能举例说明如何在Rust代码中访问vbe_info_structure(我正在运行long mode),我很乐意.
boot.asm到目前为止,这是我的文件,但它还没有工作:https://gist.github.com/nebrelbug/5a0042d4de32f942bb72e71fe282bdd2.谢谢!
在 boot.asm 文件中,您有:
get_vesa_info:
mov ax, 0x4f00
mov [es:di], vbe_info_structure
int 0x10
ret
Run Code Online (Sandbox Code Playgroud)
第三行必须替换为
mov di, vbe_info_structure
Run Code Online (Sandbox Code Playgroud)
解释:就像现在一样,它尝试在 es:di 指向的地址写入常量 vbe_info_struct (在您的情况下未定义)。相反,您想要的是将地址 vbe_info_struct 加载到 di 中,然后将其传递给 int 0x10 例程。
顺便说一句,int 0x10 执行多种功能。为了告诉它你想调用哪一个,你可以在 ax 寄存器中传递“功能代码”。将函数代码视为函数的名称(汇编中没有名称,只有数字和地址)。
另外,您需要正确设置 es。要么做
push ds
pop es
Run Code Online (Sandbox Code Playgroud)
假设 ds 已经指向section.data,或者使用汇编程序指令(assume es section.data? - 不确定这一点,自从我使用汇编程序以来已经很长时间了)。或者也许像这样:
mov ax, @section.data
mov es, ax
Run Code Online (Sandbox Code Playgroud)
当然,这应该在将 0x4f00 加载到 ax 之前完成。
| 归档时间: |
|
| 查看次数: |
484 次 |
| 最近记录: |