【问题标题】:Can someone help me with segmentation and 8086 intel's microprocessor?有人可以帮我处理分段和 8086 英特尔的微处理器吗?
【发布时间】:2015-06-29 10:16:02
【问题描述】:

我正在阅读有关英特尔 8086 架构的信息,但无法弄清楚以下有关分段的内容:我知道段寄存器分别指向段并包含 64kb 长段的基地址。但是谁计算以及在哪一点设置段寄存器中的物理地址?另外,因为一个物理地址可以被多个段访问:偏移量对和段可以重叠,你怎么能确定你不会覆盖一些东西?我可以在哪里阅读更多相关信息?

【问题讨论】:

  • 很抱歉,您的问题太模糊,不容易理解。首先,了解您正在使用什么环境(DOS/BIOS/...)以及您是否可以更精确会很有帮助。例如,当您问“谁计算以及在哪一点设置段寄存器中的物理地址?”时,您想知道什么。你想知道CPU的哪一部分从段和偏移地址计算物理地址?想知道 CPU 复位时段寄存器的值是多少?您想知道在您的代码执行时它们的值是多少吗?
  • 我知道在我用 asm 编写代码后,它会被翻译成目标文件。现在我认为目标文件中的地址不是物理地址,因为它对我来说没有意义。段寄存器如何获得正确的物理地址?程序是如何加载到内存中的?你怎么知道代码段中的代码不会覆盖数据段中的某些内容等等(因为段可以重叠等)。我想我现在更清楚了。如果你有什么问题就问吧。谢谢。编辑:我想以某种方式解释整个过程,但我不知道在哪里阅读。

标签: x86-16 processor memory-segmentation


【解决方案1】:

一般来说,汇编器只会使用偏移地址来访问逻辑地址。例如看这段代码:

start   lea si,[hello]          ; Load effective address of string
        mov word [ds:si+10],0   ; Zero-terminate string after 10th letter
        jmp $                    ; Loop endlessly

; Fill rest of the segment with 0s
times 65536-($-$$) db 0x00

hello   db "I'm just outside of the current segment. Hello!",0

汇编器将尝试计算 'hello' 与程序原点的偏移量。由于没有定义原点,因此将假定为 0x0。但是,在这种情况下,'hello' 的偏移量将是 0x10000,它不适合 16 位。因此,汇编器会将地址截断为 0x0000。它不会改变任何段寄存器。但是它可能会发出警告,例如test.asm:1: warning: word data exceeds bounds。运行此程序时实际发生的情况是 jmp $ 行被零覆盖,因为 hello 的地址被环绕,CPU 将开始执行除了零之外的任何操作,这不是您打算做的。

当然,前提是代码段和数据段相同。现在谁保证是这样?真的没人。特别是因为我仍然不知道您正在为哪个平台编码。使用正确的值设置段寄存器完全是您的责任。最简单的方法是:

push cs   ; Push address of code segment to stack
pop ds    ; Pop address back into data segment
push cs   ; Same for extra data segment
pop es    ;

这样您就可以确定您正在访问正确数据段中的偏移量。

现在关于“如何确保代码段不与数据段重叠”,为什么不呢?当您的程序数据小于 64KB 时,如果您的代码和数据段相同,则实际上是访问数据的最简单方法。

你怎么能确定你不会覆盖任何重要的东西?汇编程序无法帮助您,您必须检查自己要写入的段:偏移地址是否已包含数据。

【讨论】:

  • 谢谢。我还有两个问题:段寄存器是否保存用作基地址的物理地址,或者因为段只能在段落边界上开始,段寄存器只保存该段边界的序号,然后乘以通过 10H 形成最终的物理基地址,然后添加偏移量。我说的对吗?
  • @J.M 是的,段寄存器包含一个 16 位段地址。每当 CPU 想要访问内存地址时,总线接口单元在内部将段地址左移 4 位并添加偏移地址以计算物理地址,从而执行 20 位地址查找。希望能回答您的问题!
  • 是的,这就是我要问的。再次感谢您的努力。
  • @MaxBenson 这不存在! mov es,ds
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-05
  • 2015-12-06
  • 2011-10-15
  • 2021-01-04
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多