Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 了解摩托罗拉68k中的用户与系统堆栈指针_Assembly_Callstack_Motorola_68000_Stack Pointer - Fatal编程技术网

Assembly 了解摩托罗拉68k中的用户与系统堆栈指针

Assembly 了解摩托罗拉68k中的用户与系统堆栈指针,assembly,callstack,motorola,68000,stack-pointer,Assembly,Callstack,Motorola,68000,Stack Pointer,我试图理解汇编语言(Motorola68K)中堆栈的用法和实现 我知道MC 68k有8个地址寄存器,A7是一个特殊的地址寄存器。因为它是两个堆栈指针,共享“系统堆栈指针”的名称 我们有两种状态用户状态和监控状态。 其中: supervisor state- all system resources are available and A7 accesses the supervisor stack pointer 现在我不知道如何回答这两个问题: 为什么68000有两个硬件堆栈指针 编写代码

我试图理解汇编语言(Motorola68K)中堆栈的用法和实现

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

我们有两种状态用户状态和监控状态。 其中:

supervisor state-

 all system resources are available and A7 accesses the supervisor stack pointer
现在我不知道如何回答这两个问题:

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

编写代码到

  • 将寄存器D1、D3、A2-A6的长字值保存在runtimestack上

    MOVEM D1-D3/A2-A6, -(A7)
    
这是正确的吗


在这里,我不确定所谓的“runtimestack”,也不确定(SP)和(A7)到底有什么区别。任何帮助都将不胜感激。

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

从:

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

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


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

为什么68000有两个堆栈指针?不确定为什么,因为您可以还要问:为什么X86有一个堆栈指针,或者为什么ARM有5个堆栈指针?SP和A7是同一寄存器的两个不同名称。但是SP或A7在使用MOVEM指令时如何知道它处于哪个状态?处理器知道它当前处于什么状态,所以哪个SP/A7是活动的取决于当前状态e、 好的,那么我的MOVEM指令是否正确呢?而且,它有两个硬件堆栈指针来满足两种状态:用户和管理者?@rcgldr:x86有硬件支持,可以使用单独的用户和内核堆栈。这是保护内核完整性所必需的,因为多线程程序可能会修改另一个线程当内核在系统调用或其他线程的中断处理程序期间使用d的内存时。拥有多个HW stack Reg只是解决同一问题的另一种方法。噢,supercat的回答已经说过了。这当然有助于我理解堆栈指针,但它没有回答我的其他两个问题。(如果我写的代码是正确的),那么为什么他们有两个硬件堆栈指针呢?@tte-除了摩托罗拉决定实现它之外,没有真正的理由有两个硬件堆栈指针。X86(PC)只有一个堆栈指针,所以两个堆栈指针是一种选择,而不是必要的。所以我为MOVEM编写的代码肯定是编译的(easy68k),请注意,我不确定它是否在做问题所问的事情。@rcgldr-有两个肯定是有原因的,即使只是因为他们桌上放了一个备用的并决定将其插入。@RyanfaeScotland-这是一个实现选择。X86只有一个堆栈指针,但对于保护模式,其中一个控制块包含如果特权级别更改(如中断),则要加载到堆栈指针中的一些值。
MOVEM D1-D3/A2-A6, -(A7)