組合語言(七) 堆疊

2021-10-19 07:37:31 字數 936 閱讀 6666

堆疊資料結構(stack data structure)的原理與盤子堆疊相同:新值新增到棧頂,刪除值也在棧頂移除。堆疊也被稱為 lifo 結構(後進先出,last-in first-out),,其原因是,最後進入堆疊的值也是第乙個出堆疊的值。(資料結構就有講)

執行時堆疊是記憶體陣列,cpu 用 esp(擴充套件堆疊指標,extended stack pointer)暫存器對其進行直接管理,該暫存器被稱為堆疊指標暫存器(stack pointer register)。32位模式下,esp 暫存器存放的是堆疊中某個位置的 32 位偏移量。esp 基本上不會直接被程式設計師控制,反之,它是用 call、ret、push 和 pop 等指令間接進行修改。esp 總是指向新增,或壓入(pushed)到棧頂的最後乙個數值。執行時堆疊工作於系統層,處理子程式呼叫。堆疊 adt 是程式設計結構,用於實現基於後進先出操作的演算法。

push 指令首先減少 esp 的值,再將源運算元複製到堆疊。

pop 指令首先把 esp 指向的堆疊元素內容複製到乙個 16 位或 32 位目的運算元中,再增加 esp 的值。

pushfd 指令把 32 位 eflags 暫存器內容壓入堆疊,而 popfd 指令則把棧頂單元內容彈出到 eflags 暫存器。不能用 mov 指令把標識暫存器內容複製給乙個變數,因此,pushfd 可能就是儲存標誌位的最佳途徑。有些時候儲存標誌暫存器的副本是非常有用的,這樣之後就可以恢復標誌暫存器原來的值。

pushad 指令按照 eax、ecx、edx、ebx、esp(執行 pushad 之前的值)、ebp、esi 和 edi 的順序,將所有 32 位通用暫存器壓入堆疊。

popad 指令按照相反順序將同樣的暫存器彈出堆疊。與之相似,pusha 指令按序(ax、cx、dx、bx、sp、bp、si 和 di)將 16 位通用暫存器壓入堆疊。

popa 指令按照相反順序將同樣的暫存器彈出堆疊。在 16 位模式下,只能使用 pusha 和 popa 指令。

組合語言之堆疊框架

堆疊框架 stack frame 也稱活動框架 activation record 他是為傳遞的引數 子例程的返回位址 區域性變數和儲存的暫存器保留的堆疊空間。堆疊框架的建立步驟 1 如果有傳遞的引數,則壓入堆疊 2 子例程被呼叫,子例程的返回位址壓入堆疊 3 子例程開始執行時,ebp被壓入堆疊 4...

組合語言作業(七)

班級 計算機14 1姓名 許愷 學號 2014011329日期 2016.4.29 一 編寫程式 1.從鍵盤輸入乙個不超過8的個位數,計算該數的階乘,並以十進位制制式輸出。要求 1 輸入資料在主程式中實現 2 計算階乘的功能用子程式實現,子程式的名字為 fac 3 以十進位制形式輸出結果的功能用子程...

彙編 學習筆記(九) 堆疊

堆疊 先進後出 的儲存區,存在於堆疊段中,sp在任何時候都指向棧頂。1 格式 push 源運算元 字 push ax ax進棧2 功能 1 首先將棧頂指標減2,即 sp 2 sp 2 然後將源運算元 字 sp 1,sp 高位元組,低位元組 即執行操作 3 說明 高位元組先進棧,低位元組在棧頂 1 格...