问题标签 [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 投票
2 回答
386 浏览

assembly - DS 和 CS 在此代码中是否重叠

我正在学习实模式编程,并在这里找到了一篇关于 SO 的帖子,这对我来说非常有用但我对给定代码中的工作方式有些疑问

基本 NASM 引导程序

1)DS和CS在这里重叠吗?

2)CS是否从0h位置开始?在此处输入图像描述,所附图像显示了 512 个字节,它们是由汇编器生成的引导扇区

3)DS和CS都是从07c00H开始的吗??首先,代码部分是在放入文本字​​符串的数据之前填写的

4)堆栈从07c00+288开始??并且 mov sp,4096 将定义大小为 (07c00+288+4096-07c00+288) 的堆栈。

0 投票
2 回答
2413 浏览

assembly - 读取硬盘的引导扇区

我正在尝试在实模式下学习汇编。我想读取硬盘的引导扇区,所以下面是代码

我的执行环境是DosBox0.70,exe文件是.COM。我希望在屏幕上看到 512 字节,但是当我运行我的 .COM 文件时,它只是空白屏幕。我可以看到它背后的几个原因

1)给出的代码没有从 Bios 中断正确返回(int 13h)。2)字符串应该以 null 终止,这不会发生在这里。

但不确定是否是上述原因导致它发生,如果是,我该如何应对这些问题?

0 投票
2 回答
2788 浏览

x86 - x86 实模式下的段大小

我对实模式下段的大小有一个疑问,因为它们不能超过 64K,但可以小于 64K。我的问题是这些段大小和基地址是如何初始化的?就像在保护模式下有 GDT 和 LDT。实模式段也可以重叠、不相交或相邻。就像 BIOS 为特定的东西(如引导代码、视频缓冲区等)保留了一些区域一样,汇编程序是否需要做类似的事情?

0 投票
1 回答
80 浏览

assembly - 这个程序好吗?

我是汇编语言的新手,并试图通过代码来学习它,我发现一段代码说它将二进制转换为十进制并作为 ascii 输出到屏幕上。下面是代码

现在假设 dx 的初始值为 10 ,所以我猜输出应该是 2 。但实际输出为 10,根据代码流,这很明显。

如果这是一个问题,那么我应该做些什么改变来纠正这个问题。

0 投票
2 回答
1244 浏览

assembly - 我无法将 cpu 从实模式切换到保护模式

我是根据 Nick Blundell 的一本书来做的。我写了一个MBR程序,它首先在实模式下运行,程序中的一些指令会将cpu切换到保护模式。首先,我这样设置 GDT:

然后cpu运行以下指令:

该指令jmp CODE_SEG:init_pm将导致cpu崩溃并重新启动。如果我将其更改为jmp init_pm,则以下指令mov ax,10将导致 cpu 崩溃并重新启动。而且书上说切换操作需要跳远。

你能帮我做切换操作吗?

0 投票
2 回答
410 浏览

assembly - 实模式简单操作系统难度

我正在用实模式 ASM 编写一个简单的操作系统,以获得它的乐趣。我最近决定转向文件系统。我组装了代码

在我的引导加载程序中,我将文件系统加载到地址 0x1000:0000,将内核加载到 0x2000:0000。每个都是 512 字节(到目前为止)相当小。因此,为了测试我的新文件系统,我编写了内核来打印表中第一个文件名的第一个字母。它将值 0x2000 放入 si 中,将 si 中地址处的字节移动到 al 中。然后它将 0x0e 传递给 ah 并调用 int 0x10。然后它停止。但是,当我将操作系统引导到 qemu 时,它只是向我显示 BIOS 信息,说从软盘引导,然后什么也不做。没有信。没有什么。以下是相关代码:

相关引导加载程序代码

相关内核代码

相关文件系统代码

如果我在发布此内容时做错了什么,请原谅我,因为这是我的第一篇文章。

0 投票
1 回答
53 浏览

assembly - 当我们尝试设置当前执行代码的寄存器时会发生什么?

CodeProject 有一篇文章

CS 始终保存当前执行代码的段。您不能使用 mov cs,ax 来设置 CS。当您调用驻留在另一个段中的函数(FAR 调用),或者当您跳转到另一个段(FAR 跳转)时,CS 会发生变化。

那么当我们尝试使用 直接修改寄存器时会发生什么mov cs, ax

0 投票
1 回答
4093 浏览

assembly - 冒号 : 在 x86 汇编 GAS 语法中是什么意思,如 %ds:(%bx)?

我是 x86 程序集的新手,我正在尝试理解本文档中的代码:http ://www.cs.cmu.edu/~410-s07/p4/p4-boot.pdf第 3 页:

但我不理解命令:

为什么连接 %ds 与 (%bx) 与 ((%ds << 4) | %bx) 相同?

因为我处于实模式(16 位),串联不应该是 %ds << 8?而不是 %ds << 4

为什么括号就在 %bx 附近?而不是围绕整个结构,例如: movw $0x1337, (%ds:%bx) ?

0 投票
3 回答
22412 浏览

operating-system - 实模式程序和保护模式程序之间的真正区别是什么?

从操作系统和硬件的角度来看,我知道实模式和保护模式之间的区别。

但我想弄清楚程序“知道”实模式还是保护模式?在查看源代码/目标代码时,你怎么能说它是一个实模式程序?

寻找答案,我能想到的只是“实模式”程序使用 BIOS 子例程和 OS 子例程,而“保护模式”程序仅使用 OS 子例程。指令代码不同,因为寄存器的操作码不同并且偏移地址的长度不同。是否有任何其他功能可以区分真实模式和保护模式程序?

0 投票
1 回答
1809 浏览

assembly - 近/远 jmp/呼叫细节

我无法完全掌握 jmp/call 远/近版本的细节。据我了解, jmp/call 指令附近使用指令本身的相对偏移量作为操作数。Far jmp/call 指令使用绝对地址作为操作数。

1)在保护模式下,这个绝对地址只是编译器放置的虚拟地址。
2)在实模式下,您通常会写:

然后绝对地址由公式计算:

这实际上是实模式下的物理地址。

执行 far jmp/call 时 CPU 会自动更新 CS 吗?例如,当 BIOS 代码跳转到加载的引导扇区代码时。我没有在引导扇区文件的源代码中看到设置 CS 值。

在保护模式下:cs = index in descriptor table = absolute address / page size
在实模式下:cs = segment index in RAM = specified "new number of code segment"

我的假设正确吗?