问题标签 [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.
c - 在哪里可以找到 c 编程语言的 dos.h 参考?
我正在寻找dos.h
API 的参考/文档。(特别是对于 openwatcom 特定版本)。
从哪里获取文档?
memory - 关于实模式物理内存寻址
我和我的朋友正在集思广益,讨论一个关于实模式下物理内存寻址的问题,但我们无法解决这个问题。开始。
在实模式下,16 乘以段选择器寄存器并添加到偏移寄存器以获得 20 位物理地址。这因此导致重叠片段的可能性。
EG “段选择器 -> 0040 & 偏移量 -> 0010” = “段选择器 -> 0030 & 偏移量 -> 0110”
据我们了解,段选择器在添加到偏移量之前会移动 4 位。因此,为了避免这种分段,他们为什么不将分段选择器移动 6(将其乘以 64),然后再将其添加到偏移量。在我们看来,这将消除内存重叠的可能性。
这是否与他们在那段时间面临的任何硬件限制有关,或者仅仅是一个设计决定。
x86 - cpu如何在实模式下计算20位地址
我知道它使用物理地址 = 段寄存器 << 4 + 偏移寄存器。虽然这两个寄存器都是 16 位的,但是 8086 怎么能处理一个 20 位的加运算呢?
assembly - 什么是段落(当提到记忆时)
问一些看起来应该很容易查找的东西,我觉得很傻,但正如您可能猜到的那样,搜索段落会得到很多与我想知道的内容无关的结果。
过去几天我一直在学习汇编(编写一个小型引导加载程序,那种练习的东西),我看到了一些对称为段落的内存块的引用。我有一段遥远的记忆,一段是两个词,但我真的不确定。段落到底是什么,它的意义是什么?
compiler-construction - 寻找 x86 的 16 位 c 编译器
我正在将 uc/OS-II 从 DOS 移植到 x86(实模式)。我需要:
生成实模式 16 位 x86 程序集的编译器
将生成的程序集组装成目标文件的汇编程序
将目标文件链接在一起并输出可执行文件的链接器(原始二进制文件、COFF、PE 或 ELF 格式都可以)
一个不调用任何 DOS 服务的标准库(
int 21h
),只依赖于 BIOS 服务。
我想知道是否有任何工具链可以做到这一点。
spacing - 我能得到一些关于实模式段的信息吗
我一直在尝试理解分段内存,我在这个网站上看到了这个声明:website。第一句话最让我困惑。。
“值得注意的是,尽管段的大小为 64KB,但它们在内存中的间隔为 16 个字节。如果您了解处理器在实模式下计算物理地址时所采取的过程,这对您来说应该是非常有意义的。由于段寄存器的内容构成了物理地址的高 16 位,因此它总是能被 16 整除,并且其最低四位设置为零。”
我不明白 64KB 段如何仅间隔 16 个字节......
assembly - 我是否在实模式下正确设置了堆栈段?
我正在编写一个引导加载程序,并这样设置我的堆栈......
我这样做是否分配了 1024 字节的堆栈空间?是否适合在 0x00900 加载其他内容?0x00900 应该在我的堆栈数据之后...
variables - 从堆栈及其段更新位于数据段中的变量
我目前有三个内存段,我的主要数据段、堆栈段和我的 API 所在的段。以下指令从数据段执行,它们推送 cursorRow 和 welcomeMsg 的地址,然后对我的 API 段中的函数进行远调用。cursorRow 变量位于调用 API 函数的主数据段中。调用如下所示:
如何通过堆栈更改我的 API 所在段内的 cursorRow?cursorRow 需要从 API 更新。没有 API 函数改变数据段。我尝试过类似的东西:inc byte [ds:bp+8]
和add [ds:bp+8], 1
。这是被调用的 API 过程:
它打印字符串,但 cursorRow 变量没有正确更新。我希望我对我的问题足够清楚。很难解释:D
c - 实模式内核的 16 位 C 代码
我不知道如何为 16 位实模式编译我的 C 内核。我尝试了各种编译器,但都没有运气。我的引导加载程序只是将原始扇区从软盘(我的内核就在磁盘上的第一个扇区之后)加载到物理内存地址 1000h:0000h 然后跳转到它。如何编译我的 C 内核以在 16 位实模式下工作?
我的基本内核:
我尝试过的编译器是 GCC、tinyCC 和 DMC。我的目标是获得一个可以跳转以开始执行的平面二进制文件。
assembly - 是否可以在实模式下使用 32 位寄存器/指令?
在研究一些简单的 os 源代码时,我对一个简单的汇编问题感到困惑。
在这个网站:http ://wiki.osdev.org/Babystep7下面的代码是从实模式切换到保护模式
我知道如何从实模式切换到保护模式。
但我的问题是,既然程序还处于实模式,它怎么能使用 32 位寄存器或指令呢?
是否可以在实模式下使用 32 位寄存器/指令?