我知道 push 意味着在堆栈上放置一个值,而 pop 意味着从堆栈中检索值(如果我错了,请纠正我),但是这样做的目的是什么?我什么时候需要使用 Push 和 Pop 以及现实生活?请举个例子让我明白。
问问题
1551 次
3 回答
1
Push 和 Pop 分别用于在栈上存储数据和从栈中取数据。
堆栈基本上就像一堆卡片一样工作。您使用 Push 指令将卡片放在顶部,然后使用 Pop 指令将卡片从顶部取出。
例如,如果一个函数可以接受 100 个参数(有时是“printf”函数),则没有足够的寄存器来存储每个参数,因此您可以将信息压入堆栈,调用函数,然后将其弹出到寄存器中以工作用它。您有时还需要使用堆栈来存储函数调用的返回地址。
于 2014-12-08T20:03:33.330 回答
0
在中断的情况下——无论处理器在做什么都会中断处理器的异步事件——中断例程必须保存寄存器的状态。通常,这是通过将它们推入堆栈来完成的。然后它们在返回之前从堆栈中弹出。
push a ; save registers
push b
push d
push h
;
; now do whatever the interrupt routine does
;
; and then restore the registers
pop h
pop d
pop b
pop a
ei ; re-enable interrupts
ret
如果中断处理程序没有这样做,则寄存器在返回时将处于某种未知状态。正如他们所说,那样会很糟糕。
于 2014-12-09T03:32:23.100 回答
0
我们数据段中的每个已知内存位置都可以非常容易地一次又一次地读写,并且不受堆栈机制的密切联盟影响,并且不受堆栈指针位置的影响,并且不会在返回地址和返回地址之间混合呼叫深度。所以我的感觉是 push 和 pop 指令可以替换为 write 和 read 指令,因此它们不是绝对需要的,但有时很有帮助。
于 2014-12-09T01:14:52.363 回答