gpt4 book ai didi

assembly - 8086 无操作系统编程;分割

转载 作者:行者123 更新时间:2023-12-04 23:48:51 26 4
gpt4 key购买 nike

伙计们,这是一个难以解决的问题,因为它涉及很多硬件细节,所以我想把它放到 EE.SE,但它的主要重点是编程,所以我决定坚持在这里。

我最近怀旧(以及渴望回到 CPU 内在函数),所以我决定自制一个 8086 微型计算机板。假设我熟悉 x86 汇编(在某种程度上,正如您将看到的)并且我已经知道如何将我的代码放到计算机板上,让我们来解决实际问题。出于了解的目的,我正在使用 NASM,尽管我还没有完全了解其语法。

显然,工作在 The Mode(实模式还没有被称为实模式)的 8086 在开始时将前 1,024 个字节分开用于 255 个 2+2 字节中断向量,因此实际指令列表从 0x3FF 开始。 .

这里的问题是因为系统内存分段的怪癖,以及我可能正在编写一个 BIOS,从系统的角度来看。是否必须设置段寄存器,如果是,我如何确定在那里放置什么?假设我使用 EEPROM 或某种形式的闪存来存储我的代码,所以我有这样的东西:

section .text
org 0x0000
; Interrupt vectors reserved
ivt: times 1024 db 0
main:
cli ; Clear out interrupts because no addresses are defined yet
; Problems HERE.
; Set up interrupt addresses

我知道这可能非常糟糕,而且很可能是明显错误的语法,但它说明了我想要表达的观点。我是否必须手动设置分段寄存器,例如 mov CS, blahblahblah ,如果是这样,我如何确定代码体中不同段/节出现的地址?

这个问题的标题提到了这样一个事实,即虽然我已经做了很多谷歌搜索,但我一生都找不到 8086 的无操作系统编程的引用。我能找到的所有来源假设我正在为一个已经到位的系统编写代码,其中中断向量和段等已经设置并弄清楚了,而我正在尝试制作一个从头开始做所有事情的仿冒微 Controller 。

最佳答案

8086 使用一种非常简单的形式分段,其中每个内存引用都基于四个分段寄存器之一,CS , DS , SS , 或 ES .这意味着无论在指令中是否明确,每次内存访问都会使用分段。为了解析内存引用,CPU 将适当段寄存器中的值乘以 16,并将其添加到 16 位偏移量,给出 20 位物理地址。这就是现代英特尔处理器中所谓的实模式分段。
CS register 确定代码段的基址。所有指令提取都在该段中完成,位于 IP 提供的偏移量处。登记。正如内森·费尔曼 (Nathan Fellman) 的回答所指出的那样 CS:IP已加载 FFFF:0000在处理器初始化期间,给出一个声明的物理地址 FFFF0h ,所以你需要在这个地址有一个 EEPROM 或其他东西。正如您的问题所指出的,您可能还需要在中断向量表的物理地址空间的开头使用一些表单内存。

您在哪里找到其他任何东西取决于您。您需要加载 DS注册以便它指向要存储大部分数据的位置,因为大多数内存操作数默认使用此段。您可能还需要一个堆栈,因此您还需要加载 SS (和 SP )具有合适的值。您可以将相同的值加载到 SSDS如果你想。 ES register 不需要加载任何特定值,因为只有少数指令隐式使用它( MOVSSCASCMPS )。您可能希望它可以自由地用作“额外的”暂存段寄存器来访问除 CS 引用的内存区域之外的内存区域。 , DS , 或 SS .

请注意,假设您有一个真正的 Intel 8086 或 80186 处理器。如果您实际上有一个 80286 或更高版本的处理器,您只想在实模式下使用,那么起始地址将有所不同。如果您有某种克隆 8086 处理器,您应该查阅它的数据表,看看它是否也有任何不同之处。

关于assembly - 8086 无操作系统编程;分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27647014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com