我目前正在學習x86彙編和「Linux中的彙編語言指南」,並且在第241頁中寫到只有16位字或32位字被保存到堆棧中,但是這是真的? 我的意思是在一個char數組由單個字節組成,並且這些被保存到堆棧中,因爲C由使用調用堆棧的函數組成,對吧?那麼我究竟錯了什麼?x86調用堆棧保存單字節
回答
偶數字節在被推入前用零填充並轉換爲16位或32位字。
將堆棧看作特定尺寸(16或32)的一堆板。有沒有辦法推出一半尺寸的板子?不是嗎?即使你想推大一半的尺寸,你也可以用它來製作全尺寸的印版,然後再推。
我想在其他帖子上發表評論,但有人或作者刪除了它,無論在這裏,我的另一個問題:所以基本上C會做這樣的初始化char數組的第一個元素:movb $ 65,(%esp)for索引0?並在此之前,它會做一些像sub sizeofarray,%esp? – rob
@rob:我現在已經沒有錯誤了,現在它再也沒有錯了:-)基本上可以,但是要仔細查看反彙編以確切瞭解您的實現。數組的開始是否正好在'esp'上,取決於你擁有的其他自動變量。 –
這是push
指令的說法,但這不是使用堆棧的唯一方法。 x86還具有esp寄存器來存儲指向當前堆棧位置的指針。
函數參數放在堆棧上,如果你檢查一些反彙編,你會看到編譯器如何獲取它們。在x86的通常調用約定中,參數char
每個佔用4個字節。數組無法通過值傳遞,所以如果可以的話,char數組將不會被保存。
自動變量也佔用堆棧,但數組元素沒有單獨使用「push」保存到堆棧中。一般來說,函數會在開始時爲所有自動變量創建空間 - 查找涉及「esp」的「子」指令。然後,數組的起始位置與esp的偏移量相同,就像任何自動變量一樣,編譯器將使用此偏移量來生成對數組的訪問。在元素之間不需要填充,雖然在數組結束之後可能會有一些填充以保持堆棧指針正確對齊。
- 1. x86 32位保護模式:從調用堆棧讀取?
- 2. 導致堆棧異常(x86)
- 3. 調用堆棧
- 4. 堆棧上的C++存儲保存在堆棧上
- 5. 使用GDB檢查堆棧(x86)
- 6. 如何定義Windows x86堆棧中的堆棧?
- 7. JavaScript調用堆棧
- 8. erlang調用堆棧
- 9. jQuery調用堆棧?
- 10. 功能調用時的堆棧存儲
- 11. POSIX調用堆棧內存分配
- 12. x86 - 將8位值推入堆棧
- 13. 字符堆棧,字符串堆棧,整數堆棧,整數數組堆棧等
- 14. DIY堆棧保護
- 15. 將字符保存到堆棧上的字符串類型?
- 16. 爲什麼setjmp不能保存堆棧?
- 17. java保存文件堆棧跟蹤
- 18. 保存堆棧溢出帖子
- 19. 調用保留調用堆棧的私有方法
- 20. 循環和調用堆棧
- 21. 協程調用堆棧
- 22. 調用堆棧性病:: bad_function_call
- 23. 調用堆棧管理
- 24. 調用堆棧問題
- 25. 函數調用,堆棧
- 26. 服務調用堆棧
- 27. PHP調用堆棧問題
- 28. 調用堆棧錯誤 - C#
- 29. 訪問Java調用堆棧
- 30. 非託管調用堆棧
可能的重複[爲什麼無法將字節推入Pentium IA-32上的堆棧?](http://stackoverflow.com/questions/2586591/why-is-it-not-possible-to -push-a-byte-on-a-stack-on-pentium-ia-32)分解你編譯的內容,然後讓我們討論一下。 –