问题标签 [bochs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - Bochs:汇编远跳转在伪造的内存区域中丢失(无效的操作码错误)
我开始在(NASM)汇编中开发一个小玩具操作系统,只是为了我的娱乐。我编写了一个引导加载程序,它将第一个(也是唯一一个)文件从名为“kernel.sys”的 FAT12 文件系统加载到内存的 offset0x7E00
中。在实模式下,内核只通过 BIOS 设置合适的视频模式,进入 32 位(受保护)模式。这就是我的问题所在。
首先,我设置了一个带有 3 个描述符(null、ring 0 代码、ring 0 数据)的 GDT,并将其直接加载到内存区域0x0500
。然后我用LGDT
指令告诉处理器,然后我设置寄存器PE
中的位CR0
,我想通过远跳转进入保护模式以设置适当的段(0x08 - GDT中的代码段)和指令指针。
第一个版本在 QEMU 中工作,但在 Bochs 中没有。Bochs 需要在远跳之前设置段,所以我在我的代码中修改了这个:直接在远跳之前,我从我的 GDT 中加载带有数据段的选择器。但是,由于“操作码无效”错误,Bochs 仍然无法进入保护模式。
请帮我解决这个错误!
这是我的内核代码:(请注意,标签b32
从未达到!)
这是博克斯日志:
这是我的引导程序:
assembly - 为什么在循环调用过程时这段代码会崩溃?
我尝试编写自己的简单引导加载程序,我有以下代码:
在保护模式下一段时间后它会崩溃。
我正在使用 GNU Assembler v2.24、Ubuntu 14.04 并在 bochs 中进行测试。
来自bochs的日志:
谁能解释为什么它崩溃了?
有什么办法可以解决吗?
assembly - 如何从我的引导加载程序将 545 字节(或更多)的文件加载到内存中?
我正在编写引导加载程序并坚持使用一个 545 字节的文件,我不知道如何加载。如果它是一个 512 字节的文件存储在第 2 扇区,它可以很容易地加载到内存中。但这对我来说似乎有点奇怪。
我该怎么做呢?
assembly - 从引导扇区打印字符串仅显示第一个字符
作为学习操作系统开发的一部分,我正在 x86 引导扇区中开发代码。我希望我的代码将其打印到控制台:
你好
我得到了这个:
H
为什么它只打印一个字符而不是整个字符串?我怎样才能解决这个问题?
这是我的代码片段:
nasm - 将 ASCII 字符转换为 HEX 值的程序集
我正在修改假设将 ASCII 字符转换为十六进制值的代码。我的第一个版本运行良好,没有任何问题,但是我的新功能有一些问题。
这是我将 ASCII 值转换为十六进制值的新函数:
但是这个函数似乎不能正常工作 - 当从这个函数发送输出时int 13
,bochs 正在返回错误 - read/write/verify parameter out of range
。我使用的数字是 00 Head
, 00cylinder
和 01 sector
,所以我想这不是我写的论点的实际问题。
我还使用了我以前的函数和相同的参数,它正确加载了我想要的扇区。
我之前尝试使用 Bochs 调试器来跟踪内存中int 0x13
的寄存器,但是看起来寄存器具有我输入的相同值。
我以前的功能是:
我不希望代码的任何其他部分被损坏,因为我没有修改它。如果需要,我将包含完整的代码,但是它很长。
新功能有什么遗漏或错误吗?
编辑:忘了提到代码正在运行16 bit real mode
gcc - Gcc inline assembly: what's wrong with the dynamic allocated register `r` in input operand?
When I test the GCC inline-assembly, I use the test
function to display a character on the screen with the BOCHS emulator. This code is running in 32-bit protected mode. The code is as follows:
The red character on the screen isn't displaying B
correctly. However, when I changed the input register r
to c
like this: ::"c"(ch):);
, which is the last line of the above code, the character 'B' displays normally:
What's the difference? I accessed the video memory through the data segment directly after the computer entered into protected mode.
I have trace the assembly code, I have found that the code has been assembled to mov al, al
when the r
register is chosen and the value of ax
is 0x0010
, so al
is 0x10
. The result should be like this, but why did it choose the al
register. Isn't it supposed to choose the register which hasn't been used before? When I add the clobbers
list, I have solved the problem.
assembly - 装配 - 在图形模式下打印字符
我试图在图形模式下打印一个字符。通常当我打印一个我正在做的角色时:
这次不行了。我想问题是我切换到图形模式:
那么我怎样才能仍然使用图形模式(我需要它)并打印一个字符?我正在使用 nasm 编译器、bochs 调试器和 8086 平台。
非常感谢!
assembly - Bochs 仿真中不存在的段访问
我正在编写一个引导加载程序,当我使用 Bochs 运行它时,我收到错误“不存在的段访问”。我找不到问题。我的代码如下:
请帮我解决这个问题。
operating-system - Pintos 安装 SIGVTALRM() 重新定义错误
我在安装过程中没有出错,所有的 make 命令都运行良好,但最后当我运行“pintos run alarm-multiple”时,我收到以下错误
任何帮助将不胜感激。谢谢。
assembly - 切换到保护模式并进行远跳后出错
我正在使用FASM(平面汇编程序)编写引导加载程序。我在 16 位模式下成功,但在切换到 32 位模式时遇到错误。我查看了一个类似的答案(实际上在跳到保护模式后在 GPF 出现了同样的问题),但该解决方案并没有解决我的问题。
这是我的引导加载程序 -
这是 GDT -
她是 Bochs 控制台输出 -
谁能帮我解决这个问题?这个问题困扰我很久了。。
编辑-
这是 print32 代码-
以及引导加载程序的更改代码 -