Assembly 现在有没有两个堆栈的CPU体系结构?

Assembly 现在有没有两个堆栈的CPU体系结构?,assembly,cpu-architecture,Assembly,Cpu Architecture,通常使用两个堆栈防止缓冲区溢出是否更简单? 一个堆栈用于变量和传递参数,另一个堆栈用于返回地址 或者像NX/XD位(在AMD/Intel x86上)这样的非执行堆栈做得更好?安腾有两个堆栈。我相信其中一个用于存储局部变量(比如数组和其他东西),而另一个用于返回地址。这样,就不能通过溢出缓冲区来覆盖返回地址 安腾有两个堆栈。我相信其中一个用于存储局部变量(比如数组和其他东西),而另一个用于返回地址。这样,就不能通过溢出缓冲区来覆盖返回地址 32位ARM 除了使用r13作为堆栈指针从完整的下行堆栈加

通常使用两个堆栈防止缓冲区溢出是否更简单? 一个堆栈用于变量和传递参数,另一个堆栈用于返回地址


或者像NX/XD位(在AMD/Intel x86上)这样的非执行堆栈做得更好?

安腾有两个堆栈。我相信其中一个用于存储局部变量(比如数组和其他东西),而另一个用于返回地址。这样,就不能通过溢出缓冲区来覆盖返回地址


安腾有两个堆栈。我相信其中一个用于存储局部变量(比如数组和其他东西),而另一个用于返回地址。这样,就不能通过溢出缓冲区来覆盖返回地址

32位ARM 除了使用r13作为堆栈指针从完整的下行堆栈加载程序计数器被视为用于分支预测的返回之外,指令集对于用作堆栈指针的寄存器或堆栈增长方向是中性的。在汇编语言中,“push”和“pop”只是加载和存储指令的替代名称

Thumb是一种16位宽的指令集,具有首选的堆栈指针,但其他寄存器也可以同样好地使用

catch is multiple stack需要多个push/pop指令

AVR 没有向堆栈指针添加或减去的指令,也没有将堆栈指针自动设置为新值的指令。因此,创建堆栈帧可能涉及:

  • 加载堆栈指针的低位字节
  • 加载堆栈指针的高位字节
  • 执行16位减法
  • 保存中断启用状态
  • 禁用中断
  • 存储堆栈指针的高位字节
  • 存储堆栈指针的低位字节
  • 恢复中断启用状态
  • 未能禁用中断可能会导致浪费200字节的RAM,从而导致堆栈溢出。(一些AVR型号有1024字节的RAM)

    至少有一个C编译器使用一对通用寄存器作为数据堆栈指针,该指针可以原子地加到或减去。

    32位ARM 除了使用r13作为堆栈指针从完整的下行堆栈加载程序计数器被视为用于分支预测的返回之外,指令集对于用作堆栈指针的寄存器或堆栈增长方向是中性的。在汇编语言中,“push”和“pop”只是加载和存储指令的替代名称

    Thumb是一种16位宽的指令集,具有首选的堆栈指针,但其他寄存器也可以同样好地使用

    catch is multiple stack需要多个push/pop指令

    AVR 没有向堆栈指针添加或减去的指令,也没有将堆栈指针自动设置为新值的指令。因此,创建堆栈帧可能涉及:

  • 加载堆栈指针的低位字节
  • 加载堆栈指针的高位字节
  • 执行16位减法
  • 保存中断启用状态
  • 禁用中断
  • 存储堆栈指针的高位字节
  • 存储堆栈指针的低位字节
  • 恢复中断启用状态
  • 未能禁用中断可能会导致浪费200字节的RAM,从而导致堆栈溢出。(一些AVR型号有1024字节的RAM)


    至少有一个C编译器使用一对通用寄存器作为数据堆栈指针,可以对其进行原子添加或减去。

    有些体系结构默认情况下不会在堆栈上推送“跳转和链接”类型指令的返回地址,这算吗?您可以手动将其放置在任何位置,当然包括“第二个堆栈”。使用注册窗口的体系结构,如SPARC或安腾,跃然纸上。更直接地说,很多嵌入式8位MCU(如PIC18F系列)也使用专用返回堆栈。按照@harold所说的,您可以在使用推送返回地址(x86)的架构上通过将数据堆栈放在其他地方来实现这一点。实际上,我不知道有哪种体系结构不能做到这一点,它只是意味着扔掉一个寄存器名。@dwelch
    6809
    有两个堆栈指针,硬件堆栈和用户堆栈,带有
    PSHS
    PSHU
    PULS
    PULU
    指令。这说明“2015年底,罗切斯特的MC6809投入生产,预计将于2016年7月开始生产。”任何CPU架构都可以实现多个堆栈。您不局限于使用CPU体系结构用于实现堆栈的任何特殊指令或寄存器(如果有)。如果您希望ARM、x86或6502 CPU上有多个堆栈,没有什么可以阻止您。有些体系结构在默认情况下不会为“跳转和链接”类型的指令在堆栈上推送返回地址,这算不算?您可以手动将其放置在任何位置,当然包括“第二个堆栈”。使用注册窗口的体系结构,如SPARC或安腾,跃然纸上。更直接地说,很多嵌入式8位MCU(如PIC18F系列)也使用专用返回堆栈。按照@harold所说的,您可以在使用推送返回地址(x86)的架构上通过将数据堆栈放在其他地方来实现这一点。实际上,我不知道有哪种体系结构不能做到这一点,它只是意味着扔掉一个寄存器名。@dwelch
    6809
    有两个堆栈指针,硬件堆栈和用户堆栈,带有
    PSHS
    PSHU
    PULS
    PULU
    指令。这说明“2015年底,罗切斯特的MC6809投入生产,预计将于2016年7月开始生产。”任何CPU架构都可以实现多个堆栈。您不局限于使用CPU体系结构用于实现堆栈的任何特殊指令或寄存器(如果有)。如果你想