我正在學習英特爾 X86 組裝和逆向工程,因為我想創建游戲作弊。
我正在嘗試了解記憶體以及堆疊的作業原理。我知道這是一個后進先出,有人說把它想象成一堆書,你可以在上面添加并從頂部取出。但是,您是否必須想象它會下降,而不是書本往上走?
For example:
push 1
push 2
push 3
pop x
push would equal:
1
2
3 <- esp
pop would equal:
1
2 <- esp
uj5u.com熱心網友回復:
垂直向上/向下不是唯一可能的可視化——我們也可以使用水平:
lower addresses ... higher addresses
----------------------------------------------
| (free stack) | 3 | 2 | 1 | (in use) |
----------------------------------------------
^
|
esp
這種可視化允許在“向前”方向(從左到右)查看結構;最后推到第一個的引數串列。Push 將堆疊向左擴展,這仍然感覺很自然。
YMMV
uj5u.com熱心網友回復:
您基本上可以隨心所欲地可視化堆疊。更常遇到的表示堆疊的方式是,堆疊被稱為向下增長,從較高地址到較低地址。
為了支持這種敘述,堆疊通常被可視化為
------------------ <- top of memory = 0x10000
| used_stack |
| |
------------------
| local variables | <- top of stack = 0xff00
| [red zone] | <- red zone is guaranteed to be unused
| unused memory | by exception handlers
| |
| ---------------- |
| HEAP | <- dynamically allocated memory
------------------ address = 0x0000
我個人覺得這不直觀,因為這顛倒了其他記憶體結構或陣列通常呈現的順序。CPU沒有任何故障。
| offset description. hex dump
----------- ---------------- ------------------------
| 0 | char header[4] | 01 02 03 04
| 8 | int16 width | 08 00
| 10 | int16 height | 04 00
| 12 | int32 size | 20 00 00 00
vs.
struct FileFormat {
char header[4];
int16_t width{8};
int16_t height{4};
int32_t size{32};
};
當堆疊被可視化為鐘乳石(像冰柱一樣懸掛)時,它在物理上會向下生長,但它會失去與現實生活中的堆疊的聯系,就像一堆盤子或書籍一樣,它們會長大。
A B
------------- --------------
| ceil of stk | <-high addresses | unused | <-small addresses
| 20 00 00 00 | | |
| 08 00 04 00 | | |
| 01 02 03 04 | <-- top of stack -> | 01 02 03 04 |
| | | 08 00 04 00 |
| | | 20 00 00 00 |
| unused/heap | |bottom of stck|
------------- --------------
格式 A 至少在您有像這樣的書面文本時更方便
push 1
push 2
push 3
在樣式 A 中,這是按原樣表示的,在樣式 B 中,值是相反的。
uj5u.com熱心網友回復:
“成長”只是用來匹配大多數作業系統設定 x86 堆疊的方式。硬體能夠處理在任一方向增長的堆疊,但作業系統將 CPU 設定為讓堆疊使用越來越低的記憶體地址,因為更多的專案被推入堆疊。
當系統是單 CPU 并且通常會運行單執行緒行程來控制整個系統時,讓堆疊向下增長是一個特別有用的選擇。堆疊位于可用記憶體的頂部,堆位于底部,它們將各自增長以與另一個相遇。在現代多執行緒行程中,它的作業并不那么簡單,每個執行緒都需要一個獨立的堆疊,盡管堆可以由整個行程共享。創建執行緒時,執行緒將選擇某個最大大小,如果該空間用盡,則需要生成某種錯誤條件。但是請注意,在這種情況下,“執行緒”和“行程”完全取決于作業系統設計,CPU 只是被告知要運行什么代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/479744.html
上一篇:如何為他們開發的語言實作標準庫?
下一篇:了解x86匯編程式
