2011-07-26 40 views
2

我目前正在學習x86彙編和「Linux中的彙編語言指南」,並且在第241頁中寫到只有16位字或32位字被保存到堆棧中,但是這是真的? 我的意思是在一個char數組由單個字節組成,並且這些被保存到堆棧中,因爲C由使用調用堆棧的函數組成,對吧?那麼我究竟錯了什麼?x86調用堆棧保存單字節

+1

可能的重複[爲什麼無法將字節推入Pentium IA-32上的堆棧?](http://stackoverflow.com/questions/2586591/why-is-it-not-possible-to -push-a-byte-on-a-stack-on-pentium-ia-32)分解你編譯的內容,然後讓我們討論一下。 –

回答

5

偶數字節在被推入前用零填充並轉換爲16位或32位字。

將堆棧看作特定尺寸(16或32)的一堆板。有沒有辦法推出一半尺寸的板子?不是嗎?即使你想推大一半的尺寸,你也可以用它來製作全尺寸的印版,然後再推。

+0

我想在其他帖子上發表評論,但有人或作者刪除了它,無論在這裏,我的另一個問題:所以基本上C會做這樣的初始化char數組的第一個元素:movb $ 65,(%esp)for索引0?並在此之前,它會做一些像sub sizeofarray,%esp? – rob

+0

@rob:我現在已經沒有錯誤了,現在它再也沒有錯了:-)基本上可以,但是要仔細查看反彙編以確切瞭解您的實現。數組的開始是否正好在'esp'上,取決於你擁有的其他自動變量。 –

2

這是push指令的說法,但這不是使用堆棧的唯一方法。 x86還具有esp寄存器來存儲指向當前堆棧位置的指針。

函數參數放在堆棧上,如果你檢查一些反彙編,你會看到編譯器如何獲取它們。在x86的通常調用約定中,參數char每個佔用4個字節。數組無法通過值傳遞,所以如果可以的話,char數組將不會被保存。

自動變量也佔用堆棧,但數組元素沒有單獨使用「push」保存到堆棧中。一般來說,函數會在開始時爲所有自動變量創建空間 - 查找涉及「esp」的「子」指令。然後,數組的起始位置與esp的偏移量相同,就像任何自動變量一樣,編譯器將使用此偏移量來生成對數組的訪問。在元素之間不需要填充,雖然在數組結束之後可能會有一些填充以保持堆棧指針正確對齊。