2

我正在尝试以汇编语言(摩托罗拉 68k)了解堆栈的使用和实现。

我知道 MC 68k 有 8 个地址寄存器,A7 是特殊的。由于它是两个堆栈指针,因此共享“系统堆栈指针”的名称。

我们有两种状态用户状态和主管状态。在哪里:

user state- 

certain system resources are blocked and A7 accesses the user stack pointer.

supervisor state-

 all system resources are available and A7 accesses the supervisor stack pointer

现在我不确定如何回答这两个问题:

为什么68000有两个硬件堆栈指针?

写代码到

  • 将寄存器 D1、D3、A2-A6 的长字值保存在运行时堆栈上。

    MOVEM D1-D3/A2-A6, -(A7)
    

这是正确的吗?

在这里,我不确定所谓的“运行时堆栈”是什么,我不确定 (SP) 和 (A7) 的真正区别是什么。任何帮助将非常感激。

4

2 回答 2

9

操作系统的一个常见要求是用户程序必须具有非常有限的破坏整个系统的能力。许多程序需要能够以相对任意的方式更改自己的堆栈指针的值,但是任何可以更改用于处理中断的堆栈指针的程序都可能通过将该堆栈指针设置为该堆栈指针的地址来破坏任意主管内存记忆; 因此,下一个中断将丢弃用于中断的堆栈指针标识的任何内存。由于用户程序不能这样做,因此他们必须不能修改用于处理中断的堆栈指针。

68000 通过有两个独立的堆栈指针寄存器来处理这个问题,并说一个将在系统处于用户模式时使用,另一个将在系统处于管理员模式时使用。有一种方法可以让主管模式代码读取或设置在用户模式代码中使用的堆栈指针是非常有帮助的,但是不需要反向功能(让用户模式看到主管堆栈),并且主管- 模式代码通常不会非常频繁地操作用户模式堆栈指针,因此 68000 不需要使用八个编号的地址寄存器之一来访问用户模式堆栈指针,而是要求通过一些特殊的方式完成对它的所有访问指示。

于 2015-11-30T21:52:07.213 回答
1

我从来没有写过任何 68000 汇编程序,但从我可以从你的问题中读出的内容,这似乎是关于用户模式与主管模式的。也许您应该从头开始阅读手册?

来自M68000 系列程序员参考手册

1.3.1 地址寄存器 7 (A7) 在管理程序模型寄存器中,A7 指的是中断堆栈指针 A7'(ISP) 和主堆栈指针 A7" (MSP)。管理程序堆栈指针是活动堆栈指针(ISP 或 MSP)。对于不支持 ISP 或 MSP 的处理器,系统堆栈是系统堆栈指针 (SSP)。ISP 和 MSP 是主管模式的通用地址寄存器。它们可以用作软件堆栈指针、索引寄存器或基地址寄存器。ISP 和 MSP 可用于字和长字操作。

于 2015-11-30T21:39:44.780 回答