问题标签 [real-mode]

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.

0 投票
1 回答
887 浏览

assembly - 使用 int 0x10 和 ax = 0x07 在 16 位实模式程序集中更改文本颜色/颜色

我注意到在 0x07 中使用 0x07(滚动/清除屏幕)功能时,有一个屏幕颜色属性(以 bh 为单位)。我注意到help color列出了所有这些颜色,所以我将最初的 0x07(黑底白字)更改为 0x0a(黑底白字),但它没有按我预期的那样工作,屏幕保持黑底白字。我有一种需要更改显示模式的感觉,但我不确定该怎么做。

谢谢。

0 投票
1 回答
90 浏览

assembly - 使用 ax 而不是 dx 中断 21

在下面的代码中

如果我将 dx 更改为 ax

输出变成1 'Sum is 但是如果我使用lea ax,str它是正确的>Sum is :

我想不通原因!

为什么将 dx 更改为 ax 会导致错误的输出?

0 投票
2 回答
1902 浏览

x86 - 386+ 处理器中的复位向量

重置向量的维基百科页面说(对于 386+ 处理器):

复位时 CS 寄存器的选择器部分的值为 F000h,CS 寄存器的基数部分的值为 FFFF0000h,复位时 IP 寄存器的值为 FFF0h 形成实模式下的分段地址 FFFFF000h:FFF0h .

我所有关于计算机启动的阅读都说处理器以实模式启动,因此“选择器”不应该出现。那为什么要在这里提呢?另外,这里提到的“基本部分”是什么,它存储在哪个寄存器中?基本上,我不明白 386 处理器的复位向量与以前的处理器有何不同。

0 投票
3 回答
1790 浏览

assembly - 引导加载程序堆栈配置

以下是教育实模式 x86 操作系统 MikeOs 的代码开头。(mikeos.sourceforge.net) 据我了解,x86 堆栈向低内存“向下”增长,堆栈段寄存器 ss 指向堆栈段中可能的最低内存位置(偏移量 0)。那么,问题来了,为什么要在代码段中添加 4096bytes 才能创建 4K 堆栈呢?将 512 字节添加到代码段并将其存储在 ss 堆栈段中是否不够,因为引导扇区可能只有 512 字节长?

0 投票
2 回答
1238 浏览

assembly - 实模式 32 位寄存器

我正在编写一些实模式代码并使用 32 位寄存器来执行此操作(使用 0x66 前缀)。

我一直在查看英特尔的手册,但找不到我要查找的信息。请参阅: http: //www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html(我已经浏览了第 1 卷第 1-7 章,以及第 2 卷的具体说明)

英特尔是否保证实模式代码中以下代码的特定行为?它与保护模式代码相同吗?

注意:我并不关注具体实现的行为方式(即检查它的代码——除非每个实现都始终行为相同),而英特尔已经记录了这种行为。

相关:x86_64 寄存器 rax/eax/ax/al 覆盖完整的寄存器内容

有何不同:这个问题特别与实模式操作有关,以及来自链接问题的观察结果在实模式下是否有效。

谁能帮我找到在哪里可以找到实模式代码的文档?

0 投票
2 回答
520 浏览

ios - 为什么我的 Realm 数据库这么大?

下图显示了我所有的 Realm 类和数据,但它大于 300MB。

我为每个 RLMObject 实现了一个保存方法,它会解决问题吗?

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

0 投票
1 回答
1653 浏览

assembly - 在 CR0 中设置 PE 标志如何启用保护模式?

我试图了解机器如何从开机到运行内核。从我收集到的信息来看,在启动期间切换到保护模式以访问更多可寻址内存是很有用的,即使我们最终会切换到更传统的虚拟内存计划,其中页目录和页表以及分段关闭.

似乎要切换到保护模式,必须做 3 件事:

  1. 建立一个全局描述符表(gdt)并使用lgdt指令加载它
  2. 将控制寄存器 CR0 中的 PE 标志/位设置为启用(即值 1)
  3. 执行跳远ljmp

我想知道将段寄存器和指令指针转换为与 gdt 一起使用的索引和偏移量的逻辑。这个逻辑是硬件完成的吗?如果是,那是哪块硬件,为什么要执行ljmp部分过程?为什么不简单地将 CR0 中的 PE 标志设置为启用保护模式(没有后续ljmp)?

0 投票
2 回答
241 浏览

c - 从 BIOS 加载 Linux 操作系统内核

出书:上电后,CPU加载BIOS,建立中断向量表,并以实地址模式启动中断服务程序。由BIOSCPUINT 0x19。将第一个扇区 (512B) 加载到内存中ISRINT 0x19该扇区是 Linux 的引导部分,它将操作系统的其他部分加载到内存中。

第一个扇区是bootsect.s,它是用汇编编写的。它是第一个加载到内存中的系统代码。我怀疑是否已加载汇编指令或已编译的机器指令是否已加载到内存中。BIOS 是否具有assembler将程序集转换为机器指令的本机?

0 投票
1 回答
463 浏览

c - 内核开发:在实模式下设置 ES:DI

我正在开发一个用于娱乐和教育的玩具内核(不是课堂项目)。我开始在我的内存管理器上工作,所以我试图INT 0x15, EAX=E820在仍处于实模式时使用调用从 BIOS 获取内存映射。我正在从 osdev wiki 调整我的功能(这里,在“获取 E820 内存映射”部分)。但是,我希望这是一个可以从我的 C 代码中调用的函数,所以我正在尝试对其进行一些更改。我希望它接受两个参数:一个指向存储映射条目的位置的指针,以及一个指向整数的指针,该整数将按表中的条目数递增。

根据 wiki,ES:DI需要指向应该存储数据的位置,所以我将第一个参数分成两个(段选择器pointer_to_map / 16和偏移量pointer_to_map % 16)。这是C代码的一部分:

这是我的 ASM 代码的一部分:

这就是我要粘贴的全部内容,因为程序会出现三重故障并关闭那里的 VM。通过移动ret命令,我发现函数在第一行就崩溃了。如果我注释掉 C 中的调用,那么一切都会如您所愿。

我已经通过谷歌阅读了几乎没有理由ES:DI直接设置,并且在我发现的代码中,他们将其设置为文字。我应该如何设置ES:DI,如果我不应该直接设置,我应该如何让 C 和 ASM 以正确的方式交互?

0 投票
1 回答
386 浏览

x86 - 为什么不能写入 BIOS 以在保护模式下运行?

是否仍在使用基于 8088 的计算机或 80286 之前的计算机?如果那些旧处理器不再使用,为什么还要存在这种“实模式首次启动”的向后兼容特性?为什么处理器不能直接在保护模式下运行并避免所有兼容性黑客等?为什么不能将 BIOS 写入直接在保护模式下运行?