2014-07-11 35 views
0

因此,當我們引用「棧頂」時,請記住它位於棧的內存底部。瞭解「堆棧」

我正在閱讀x86 ASM的教程,它有這個。我甚至不能開始理解這是如何使任何黨的意義。我認爲它與某些硬件級別的事情有關,至今我對硬件一無所知。

有人可能解釋它嗎?一個圖是非常有益的,但也許只是解釋了爲什麼「堆棧的頂部」的意思是「棧底」

+1

想象一下「鐘乳石」:https://www.google.com/search?q=stalactite&tbm=isch –

+0

相關:http://stackoverflow.com/questions/14296088/what-is-this-assembly-code -doing – nrz

回答

0

我肯定不會選擇86作爲第一個彙編語言......但是,所有的他們幾乎有一個堆棧。

想想看一堆筆記卡片,他們每個人只能寫一張筆記。說一個購物清單,一個說雞蛋,另一個牛奶另一個麪包。所以你可以看看最上面的那個,我需要麪包,把麪包扔掉。下一杯牛奶吧,去拿那個,丟掉卡片,等等。哦,我需要黃油,把它寫在一張新的卡片上,把它放在頂部,然後去掉它,丟棄它。等等。

如果說你有20張牌,如果頂牌的牌號是0,那麼下面的牌是1,而下面的牌是2,或者頂牌是19,下面的牌是18,然後17?不,只要每個關心編號規則的人遵循規則,那麼它並不重要。

爲什麼我們會關心編號?因爲該號碼是用於該項目的內存地址。如果你的數字從0到N,你的堆棧在內存中成長,最老的東西是0,最新的東西是N,或者你的堆棧可能會從堆棧中最高的地址和最新的東西只要每個人都知道規則,它就是武斷的。

我們關心的另一個原因是某些處理器/許多人有辦法跳過,我想偷看第三張卡片,但是當偷看時我無法刪除它,所以我只能從堆棧頂部刪除或添加。你可以做什麼,但也取代了第三張卡。爲什麼我們會喜歡做這樣的事情?想一想C函數中的局部變量,也許我有兩個局部變量,它們是函數中的整數。 C是遞歸的,所以每次我調用函數時都需要存儲兩個以上的整數。該堆棧非常適合。一旦我在函數中,我將兩張空白卡添加到堆棧中,如果我需要訪問這些整數,則運行該函數,讀取它們或寫入它們,我可以偷看或用具有一些新值的卡替換這些卡。當我退出這個功能時,我將兩張牌取出並丟棄它們,就像我到達那裏時發現它一樣。這個堆棧在函數中是臨時存儲的,但是我不在乎地址是什麼,我只關心頂部的兩張卡片是我的,而且我可以得到他們兩個堆棧可能是1000張卡片高或8745卡高無關我只關心前兩名,我下面的所有卡都屬於稱爲函數的函數。每個退出的功能都會清理屬於它的卡片。

該堆棧只是內存,並指向一個稱爲堆棧指針的指針寄存器。這使得我們不關心具體地址是什麼,我們只關心它們與棧指針相關的內容。我們必須知道並遵循該處理器或該處理器或該環境的約定的規則,才能知道偏移的方式,如果堆棧向下增長意味着sp = sp-3(位置)將三張空白卡添加到堆棧,並且sp + 0是頂部sp + 1是堆疊中的下一個等等。如果堆棧在地址空間中增長(並不是所有常見但有一些可以或者可以做到的),那麼sp = sp + 3(地址)就是如何向堆棧添加3個新東西,而sp-1是第一個向下,等等。

這不是計算的黑暗時代,我推薦學習C好一點,或者一些編程語言使用任何語言編程的東西都可以下來,能夠將問題分解成步驟並執行步驟以完成任務。然後,ASM只是將這些步驟分解成更小的步驟並按順序執行。再次,我推薦幾乎任何東西,但x86作爲第一個指令集,並且我建議您在開始掌握它的時候使用指令集模擬器(模擬器或仿真器),而不是真正的硬件來完成第一個彙編語言,特別是調試asm你會完全理解,尤其是如果你從一個更直接的指令集開始,然後再看看x86。 msp430,arm,pdp11(是的,我非常認真),avr和其他一些都是很好的第一批指令集。但在潛入asm之前,可以通過C或類似的東西獲得某種程度的經驗。