0

我很困惑学习了一段时间的汇编,并回顾了许多关于它的优秀教程。

除了记住一些指令来做一些你不完全理解的事情之外,我必须说要完全理解它的整个用处是非常困难的。

我想成为一名操作系统开发人员和设计人员,所以我必须了解低级硬件数据处理、内存管理、处理器获取、解码和内存分段、内存使用、位和字节使用、调用堆栈和硬件堆栈,以及硬件本身的机器级程序的机制。

以下是我感到困惑的主要问题:

处理器从 RAM 中获取字节。在编写引导加载程序时,您在编写指令之前“跳转”到一个地址。跳转到内存中的地址后执行的第一条指令,例如移动/数据复制MOV AL, MOV BL类型的指令,在 CPU 的流水线上检索不直接在内存中使用的数据。但是,如果指令是从内存中加载/获取的,处理器如何在其管道上生成代码数据段呢?还是我在这里都错了?微处理器在引导加载程序中执行的基本步骤是什么,如果指令全部从内存中获取,CPU如何在不使用内存的情况下从流水线生成代码数据(例如,汇编中的代码段,但数据段和文本段都是指令对于处理器)?

此外,对于比我更有经验的人来说,我的下一个主要问题可能很容易回答:

为什么 x86 和其他架构上的内存/RAM 存储为带有偏移的“段”?对我来说,这比它需要的要复杂得多。为什么所有内存都不能是线性的、寻址的、获取的、存储的和计算的,以及以更直接的方式移入和移出寄存器到存储单元?与让大量寄存器处理基于内存的数据存储和访问的二维分段相比,这不会使架构的说明和理解更容易理解和更直接吗?

4

1 回答 1

0

它不仅仅是“汇编”与“高级语言”。

真正的问题是“真实”与“受保护”(虚拟内存)模式。

不幸的是,大多数 x86 汇编示例恰好是DOS示例。恕我直言,这与当代 32/64 位虚拟内存架构(包括但不限于 x86)几乎没有相关性。

优秀的底漆:

从头开始编程

PS:在大多数现代操作系统(包括 Windows、Linux 和 Mac OS)上,地址空间实际上线性的,x86 事件。x86 段寄存器在很大程度上是 DOS 时代的不合时宜的东西。

如果您有兴趣,这里是 Linux 启动过程的一个很好的概述:

于 2013-01-08T23:15:42.847 回答