例如,x86伊萨有一些特定的指令来处理栈相关的操作,如push
和pop
,但是栈可以通过一些内存访问操作完全在软件中实现,如mov
,甚至后者的性能更好:Why use Push/Pop instead of Mov to put a number in a register in shellcode?
在ARM中,push/pop
只是内存操作的别名,仅供参考:Push and Pop in arm
为什么我们需要让伊萨意识到堆栈的存在?为什么我们不让硬件忘记“堆栈”,而把它留给软件实现呢?就我所见,这有两个好处:
1.可以简化硬件设计,
1.给予软件更大的灵活性。
没有stack
概念,也就是没有push
、pop
、%rsp
、%rbp
等概念,是否可以实现伊萨?
1条答案
按热度按时间bsxbgnwa1#
为什么我们需要让伊萨知道堆栈的存在?为什么我们不让硬件忘记“堆栈”,而把它留给软件实现?
这不是CPU工作所必需的,这是肯定的。确实有CPU这样做,MIPS是其中之一。虽然有一个寄存器称为
$sp
,MIPS与其他通用寄存器之间没有硬件强制的差异。MIPS没有隐式更改$sp
的push
或pop
指令。要将寄存器push
到MIPS汇编中的堆栈上,必须手动执行:那么为什么硬件要知道堆栈呢?一个好处似乎是,在大多数确实有“硬件堆栈”的架构上,“
pop
操作往往比用存储器中的值加载目的寄存器快-即使不计算用所需地址加载源寄存器的动作,情况也是如此。某些汇编程序员会滥用此方法,将堆栈临时重新定位到数组(其值以相反顺序存储,当然)并使用pop
将每个条目写入不同的寄存器。尽管需要禁用中断并将堆栈指针保存在内存中的其他地方会带来一些开销,但在非常特殊的情况下,您可以比正常情况下更快地从内存中复制,具体取决于需要读取的值的数量。CPU允许的寻址模式等。