壓入和彈出棧資料
- 資料的入棧和出棧
-
- 資料入棧指令
- 資料出棧指令
資料的入棧和出棧
棧在處理函數調用過程中起到至關重要的作用。
棧是一種資料結構,可以添加或删除值,不過要遵循後進先出的原則。
通過push操作把資料壓入棧中,通過pop操作删除資料。
它具有一個屬性:彈出的值永遠是最近被壓入而且仍然在棧中的值。
棧可以實作為一個數組,總是從數組的一端插入和删除元素。這一端被稱為棧頂。
在x86-64中,程式棧存放在記憶體中某個區域。
棧向下增長,這樣一來,棧頂元素的位址是所有棧元素位址中最低的。
棧指針%rsp儲存着棧頂元素的位址。
資料入棧指令
指令 | 效果 | 描述 |
---|---|---|
p u s h q S pushq \quad S pushqS | R [ % r s p ] ← R [ % r s p ] − 8 ; M [ R [ % r s p ] ] ← S R[\%rsp]\leftarrow R[\%rsp]-8;\\M[R[\%rsp]] \leftarrow S R[%rsp]←R[%rsp]−8;M[R[%rsp]]←S | 将四字壓入棧中 |
pushq指令的功能是把資料壓入到棧上,将一個四字值壓入棧中,首先要将棧指針減8,然後将值寫道新的棧頂位址。
資料出棧指令
指令 | 效果 | 描述 |
---|---|---|
p o p q D popq \quad D popqD | D ← M [ R [ % r s p ] ] ; R [ % r s p ] ← R [ % r s p ] + 8 D \leftarrow M[R[\%rsp]]; \\R[\%rsp] \leftarrow R[\%rsp] + 8 D←M[R[%rsp]];R[%rsp]←R[%rsp]+8 | 将四字彈出棧 |
pop指令是彈出資料,彈出一個四字的操作包括從棧頂位置讀出資料,然後棧頂指針加8.
因為棧和程式代碼以及其他形式的程式資料都是放在同一記憶體中,是以程式可以用标準的記憶體尋址方法通路棧内的任意位置。