我正在瀏覽C代碼,我必須弄清楚特定程序跟蹤中使用的寄存器數量。每遇到push或pop命令,代碼都會忽略存儲ESP寄存器。我還提到了X86指令,它寫在那裏「ESP,堆棧指針,不應該使用」。爲什麼在使用PUSH或POP指令時不鼓勵使用ESP寄存器?
回答
它不應該被用作通用寄存器。請適當謹慎地將其用作堆棧指針。例如。您可以使用'sub esp,...'指令爲堆棧上的本地變量保留一些內存,但是必須在ret指令之前恢復其原始值
在x86上,ESP
是堆棧指針。最初,在16位8088和8086處理器上,寄存器簡稱爲SP
,對於S大頭針P ointer。當在386處理器中添加32位支持時,E
前綴(用於「擴展」)被添加到所有寄存器名稱,因此它變成了ESP
。在當前模式下,堆棧指針始終具有與處理器本機字大小相同的位寬。也就是說,如果您在32位保護模式下執行,堆棧指針將爲32位寬,並存儲在ESP
中。如果你在16位實模式下執行,堆棧指針將是16位寬,並存儲在SP
中。
x86體系結構(不同地稱爲AMD64,x86-64或僅64位)的64位擴展將寄存器擴展爲64位,並添加了前綴R
。因此,RSP
寄存器包含堆棧指針,它在長(64位)模式下執行時爲64位寬。
雖然這個寄存器在概念上類似於其他寄存器(EAX
,ECX
,EDX
,EBX
,ESI
,EDI
,和EBP
),它不能以同等的方式使用。它被設計爲只有來保存堆棧指針,不能用作通用寄存器。
你沒有明確推送或彈出堆棧指針的原因是因爲這是由其他指令隱式完成的。實際上,PUSH
和POP
指令是操縱堆棧指針的指令,因爲它們將東西壓入堆棧並將其彈出。
在x86,堆棧總是在存儲器向下增長,所以PUSH
將減去(根據操作數的大小)從堆棧指針字節的適當數目,而POP
將添加字節的適當數目。
CALL
和RET
指令還隱式地操縱堆棧指針。通過閱讀Intel x86體系結構手冊available here可以找到更多的細節。 x86標記wiki中還有很多其他資源可用。
您將看到ESP
寄存器被明確操作的唯一時間是當它被用作ADD
或SUB
指令中的目標操作數時。這些通常通過優化編譯器,根據需要遞增或遞減堆棧指針,以便騰出空間來存儲值或清理堆棧,從而插入到函數的序言和尾聲中。它們的功能類似於PUSH
和POP
,只是它們可以具有連續多次推送和彈出的效果。例如:
push eax
push eax
push eax
push eax
...
pop eax
pop eax
pop eax
pop eax
可以簡單地進行更換:
sub eax, 16
...
add eax, 16
(假設你沒有真正試圖店的EAX
值並只使用PUSH
使在房間堆棧)。
- 1. 爲什麼不鼓勵使用Resources.getIdentifier()
- 2. 爲什麼使用`!重要`不鼓勵?
- 3. 爲什麼不鼓勵LD_PRELOAD的使用?
- 4. 爲什麼sun.misc不鼓勵使用?
- 5. 爲什麼在Silverlight 4中不鼓勵使用觸發器?
- 6. 爲什麼setAnimationDidStopSelector不鼓勵?
- 7. 爲什麼Debug.Print不鼓勵?
- 8. 爲什麼不鼓勵在Shiny includeScript()中使用絕對路徑?
- 9. 編譯器爲什麼會生成一個push/pop指令對?
- 10. 爲什麼不鼓勵使用單身模式?
- 11. 爲什麼jQuery似乎不鼓勵使用常規的OOP?
- 12. 爲什麼傘架不鼓勵?
- 13. 爲什麼mysql_escape_string非常不鼓勵?
- 14. 什麼是ESP和EBP寄存器?
- 15. 爲什麼django社區鼓勵使用Postgres over Mysql?
- 16. 爲什麼鼓勵使用處理程序的私有變量?
- 17. 爲什麼mov指令直接使用ax而不是兩個段寄存器?
- 18. 不鼓勵使用的方法
- 19. 什麼時候esp寄存器在linux中設置?
- 20. 爲什麼我鼓勵在本地下載jQuery而不是使用CDN?
- 21. 如何使用push和pop來交換2個寄存器的內容?
- 22. 爲什麼不鼓勵Java EE容器中的產卵線程?
- 23. 爲什麼使用臨時寄存器將值傳遞給段寄存器?
- 24. 爲什麼棱鏡鼓勵使用服務定位器反模式?
- 25. 爲什麼當InnoDB被鼓勵使用時,MySQL mysql表仍然是MYISAM?
- 26. 爲什麼在編程一個web應用程序時不鼓勵$ _Post
- 27. 「ObjectMessage的用法一般不鼓勵」,用什麼來代替?
- 28. 在使用「addEventListener」方法時,是否不鼓勵在HTML元素中使用「onlclick」?
- 29. 爲什麼std :: string/std :: map不鼓勵在堆上創建?
- 30. 爲什麼在SQLAlchemy中不鼓勵這種模式?
從你的回答我發現,它的值必須恢復,因爲這是唯一的寄存器指向哪裏將數據存儲在堆棧儀式>?所以是他們阻止它搞亂事情的原因? – archies50
是的,絕對正確。 – Serge