回答
-0x30(%ebp)
並不意味着要使用的值%ebp - 0x30
。這是一個內存地址來讀取。該指令(cmpl
)的後綴爲l
,所以它處理的是4字節的數量。所以實際發生的是它從地址%ebp - 0x30
中讀取一個4字節的數字並檢查它是否爲零。
(該$
前綴意味着它是一個直接的價值,而不是一個地址。這就是爲什麼0x0
是從字面上,而不是取消引用。)
非常感謝!但是現在我怎麼才能知道%ebp的價值是什麼,因爲它直接讀取4字節內存。我對此一無所知。 – James
@James好吧,假設代碼在調用'read_six_numbers'之前將'%ebp-0x30'的地址加載到'%rsi'(第一個參數)中,我認爲這是'read_six_numbers'放置結果的地方;即它是6個整數的緩衝區的開始。這與48 = 6 \ * 8的大小(對於6個8字節整數)是一致的......除非這樣做沒有意義,因爲我們只比較4個字節的整數。嗯... – melpomene
它是'%rbp',而不是'%ebp'。這是一個64位指針(對4個字節的內存)。它在這個函數中被用作幀指針,所以它的高32位不全是零,'0x30(%ebp)'會出現段錯誤。 –
你不需要知道的rbp
值拆除炸彈的引信,它的總是用相對的方式來處理某些內存部分。它設置在啓動由序列:
pushq %rbp
movq %rsp, %rbp
pushq %r12
pushq %rbx
subq $0x20, %rsp
這確實推動老rbp
值到棧(保存它),然後將rbp
到當前堆棧指針值(rsp
)。所以(%rbp)
現在包含舊的rbp
。然後通過將另外兩個寄存器r12
和rbx
推入堆棧(現在生成rsp == rbp - 16
)來保存它們。然後rsp
再次被減去32,即rsp == rbp - 48
。
這是常見的模式,如何爲局部變量分配內存空間,即任何進一步的push
指令都將使用低於rbp - 48
的內存。內存從rbp - 48
到rbp - 17
(增量)未定義,可以自由用作「局部變量」內存。然後在rbp - 16
存儲8字節原始rbx
值,在rbp - 8
存儲原始r12
值,並在rbp
存儲舊rbp
。 (我的意思是所有的「rbp-x」被用作內存地址來存儲內存中的值)
然後你的代碼調用輸入6個數字,我猜的意思是32位整數(由下面的代碼判斷),所以它提供了地址爲rbp - 48
。 6 * 4 = 24 =>輸入值將存儲在地址rbp - 48
直到(含)rbp - 25
的存儲器中。
注「未使用的內存」從rbp - 24
高達rbp - 17
的差距,這是另一個8個字節的備用本地存儲,不使用你發佈的代碼,這是由編譯器中加入極有可能的留白,使rsp
callq read_six_numbers
之前正確對齊。
所以基本上你不需要知道哪兒rsp/rbp
點,它指向一些有效的堆棧存儲器(可能是,或代碼將崩潰,而炸彈將不爆炸......有點怪設計:))))。您可以在開始時選取任意值,如0x8000
(rsp
),然後用此模擬運行。 (即<+11> leaq -0x30,(%rbp), %rsi
然後rsi = 0x7FC8;
(爲0x8000 - 8 - 的0x30)
什麼-x(%rbp)
意味着各種指令(要注意的「內存操作數」使用的lea
VS <any other instruction>
語義差別休息時,lea
確實只有內存地址計算,而其他指令只是以此爲起點,使用計算得到的地址訪問存儲在內存中的實際值)在其他答案+註釋中進行了描述,並使用x86指令參考指南並通過一些教程再次閱讀,直到它
- 1. x86 cmpl和jne
- 2. 如何在gdb中打印-0x4(%rbp)?
- 3. 爲什麼%rbp指向沒有?
- 4. 如何使用地圖API更改GoogleMaps物理救濟Flex
- 5. 理解爲,理解
- 6. 將斐濟圖像處理作爲Java中的庫使用
- 7. 如何獲得特定經濟和經濟附近的地點列表
- 8. 如何理解$()?
- 9. 如何將其轉換爲理解? (Python)
- 10. 如何理解tensforflow
- 11. 如何理解numpy.nextafter
- 12. 如何理解rootScope?
- 13. 如何理解LinkedList?
- 14. 地形或救濟數據
- 15. 如何理解JIT編譯的代碼在C#中的「使用」與異常處理
- 16. 與太平洋/斐濟
- 17. 菜單欄的救濟
- 18. R中的經濟模擬
- 19. 經濟模擬算法?
- 20. 如何讓java的解釋器將Math.pow理解爲Math.pow?
- 21. 我如何理解&*(x + i)?
- 22. 什麼是平鋪紋理的更經濟的方法?
- 23. 斐濟彙編奇怪
- 24. 我如何理解「PieChart.Data」?
- 25. 如何在列表理解
- 26. 如何使用列表理解作爲列表理解的條件?
- 27. 如何理解Anorm解析器?
- 28. 如何理解ndarray.reshape函數?
- 29. CS學生的微觀經濟學
- 30. Profilling結果 - 如何理解
通過進入「read_six_numbers」我知道輸入是6個數字,並且有一些模式 – James
Do不張貼文字的圖片。從終端複製/粘貼。 –
[請勿放置文字圖像](https://meta.stackoverflow.com/q/303812/995714) –