问题标签 [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.
assembly - DS 和 CS 在此代码中是否重叠
我正在学习实模式编程,并在这里找到了一篇关于 SO 的帖子,这对我来说非常有用但我对给定代码中的工作方式有些疑问
1)DS和CS在这里重叠吗?
2)CS是否从0h位置开始?,所附图像显示了 512 个字节,它们是由汇编器生成的引导扇区
3)DS和CS都是从07c00H开始的吗??首先,代码部分是在放入文本字符串的数据之前填写的
4)堆栈从07c00+288开始??并且 mov sp,4096 将定义大小为 (07c00+288+4096-07c00+288) 的堆栈。
assembly - 读取硬盘的引导扇区
我正在尝试在实模式下学习汇编。我想读取硬盘的引导扇区,所以下面是代码
我的执行环境是DosBox0.70,exe文件是.COM。我希望在屏幕上看到 512 字节,但是当我运行我的 .COM 文件时,它只是空白屏幕。我可以看到它背后的几个原因
1)给出的代码没有从 Bios 中断正确返回(int 13h)。2)字符串应该以 null 终止,这不会发生在这里。
但不确定是否是上述原因导致它发生,如果是,我该如何应对这些问题?
x86 - x86 实模式下的段大小
我对实模式下段的大小有一个疑问,因为它们不能超过 64K,但可以小于 64K。我的问题是这些段大小和基地址是如何初始化的?就像在保护模式下有 GDT 和 LDT。实模式段也可以重叠、不相交或相邻。就像 BIOS 为特定的东西(如引导代码、视频缓冲区等)保留了一些区域一样,汇编程序是否需要做类似的事情?
assembly - 这个程序好吗?
我是汇编语言的新手,并试图通过代码来学习它,我发现一段代码说它将二进制转换为十进制并作为 ascii 输出到屏幕上。下面是代码
现在假设 dx 的初始值为 10 ,所以我猜输出应该是 2 。但实际输出为 10,根据代码流,这很明显。
如果这是一个问题,那么我应该做些什么改变来纠正这个问题。
assembly - 我无法将 cpu 从实模式切换到保护模式
我是根据 Nick Blundell 的一本书来做的。我写了一个MBR程序,它首先在实模式下运行,程序中的一些指令会将cpu切换到保护模式。首先,我这样设置 GDT:
然后cpu运行以下指令:
该指令jmp CODE_SEG:init_pm
将导致cpu崩溃并重新启动。如果我将其更改为jmp init_pm
,则以下指令mov ax,10
将导致 cpu 崩溃并重新启动。而且书上说切换操作需要跳远。
你能帮我做切换操作吗?
assembly - 实模式简单操作系统难度
我正在用实模式 ASM 编写一个简单的操作系统,以获得它的乐趣。我最近决定转向文件系统。我组装了代码
在我的引导加载程序中,我将文件系统加载到地址 0x1000:0000,将内核加载到 0x2000:0000。每个都是 512 字节(到目前为止)相当小。因此,为了测试我的新文件系统,我编写了内核来打印表中第一个文件名的第一个字母。它将值 0x2000 放入 si 中,将 si 中地址处的字节移动到 al 中。然后它将 0x0e 传递给 ah 并调用 int 0x10。然后它停止。但是,当我将操作系统引导到 qemu 时,它只是向我显示 BIOS 信息,说从软盘引导,然后什么也不做。没有信。没有什么。以下是相关代码:
相关引导加载程序代码
相关内核代码
相关文件系统代码
如果我在发布此内容时做错了什么,请原谅我,因为这是我的第一篇文章。
assembly - 当我们尝试设置当前执行代码的寄存器时会发生什么?
CodeProject 有一篇文章:
CS 始终保存当前执行代码的段。您不能使用 mov cs,ax 来设置 CS。当您调用驻留在另一个段中的函数(FAR 调用),或者当您跳转到另一个段(FAR 跳转)时,CS 会发生变化。
那么当我们尝试使用 直接修改寄存器时会发生什么mov cs, ax
?
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) ?
operating-system - 实模式程序和保护模式程序之间的真正区别是什么?
从操作系统和硬件的角度来看,我知道实模式和保护模式之间的区别。
但我想弄清楚程序“知道”实模式还是保护模式?在查看源代码/目标代码时,你怎么能说它是一个实模式程序?
寻找答案,我能想到的只是“实模式”程序使用 BIOS 子例程和 OS 子例程,而“保护模式”程序仅使用 OS 子例程。指令代码不同,因为寄存器的操作码不同并且偏移地址的长度不同。是否有任何其他功能可以区分真实模式和保护模式程序?
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"
我的假设正确吗?