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 没有向堆栈指针添加或减去的指令,也没有将堆栈指针自动设置为新值的指令。因此,创建堆栈帧可能涉及:
至少有一个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)的架构上通过将数据堆栈放在其他地方来实现这一点。实际上,我不知道有哪种体系结构不能做到这一点,它只是意味着扔掉一个寄存器名。@dwelch6809
有两个堆栈指针,硬件堆栈和用户堆栈,带有PSHS
,PSHU
,PULS
和PULU
指令。这说明“2015年底,罗切斯特的MC6809投入生产,预计将于2016年7月开始生产。”任何CPU架构都可以实现多个堆栈。您不局限于使用CPU体系结构用于实现堆栈的任何特殊指令或寄存器(如果有)。如果你想