天天看點

AT&T彙編——壓入和彈出棧資料資料的入棧和出棧

壓入和彈出棧資料

  • 資料的入棧和出棧
    • 資料入棧指令
    • 資料出棧指令

資料的入棧和出棧

棧在處理函數調用過程中起到至關重要的作用。

棧是一種資料結構,可以添加或删除值,不過要遵循後進先出的原則。

通過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.

因為棧和程式代碼以及其他形式的程式資料都是放在同一記憶體中,是以程式可以用标準的記憶體尋址方法通路棧内的任意位置。

繼續閱讀