1
A
回答
2
堆棧是爲:
push %esi
push %edi
...
...
...
pop %edi
pop %esi
平時要注意順序。另外,請使用push
/pop
的適當版本。
如果您需要同時保存和訪問不同的值,那麼製作自己的堆棧是更好的解決方案。
實施例(在函數開始時,AT & T語法):
push %ebp // save the old ebp
mov %esp, %ebp // ebp now points to the top of the stack
sub X, %ebp // reserve X bytes for the current function
現在可以在參考引用的存儲單元來的%ebp,例如:
movl $1, -4(%ebp) // moves constant 1 to the first free location
movl $1, -8(%ebp) // moves constant 1 to the next free location
addl -4(%ebp), -8(%ebp) // add -4(%ebp) and -8(%ebp) together and write in -8(%ebp)
Similiary,你可以將你的第一個變量保存在-4(%ebp)中,而你的第二個變量保存在-8(%ebp)中。
到了破壞的StackFrame和返回:
movl %ebp, %esp
popl %ebp
ret
你並不需要清除記憶,一旦空間被再次使用它會被覆蓋。
2
一種常見的方式做,這是使用CPU堆棧:
push esi
; ... do whatever needs esi
pop esi
如果有之間的push
和跳轉別處pop
,你必須確保堆棧進行適當清理什麼。
+0
這不是CPU堆棧。堆棧在內存中。 – Femaref
+2
這是由CPU管理並由'esp'寄存器指向的堆棧。它是CPU唯一的堆棧,因此它是「CPU堆棧」。是的,CPU堆棧在內存中。 –
1
push edi
; ... code that uses edi
pop edi
相關問題
- 1. 使用ebp/esp與edi/esi
- 2. 錯誤組裝'push [ebp + 12] [edi] [esi]'
- 3. GDB/GNU程序集:測試%esi,%esi返回不等於?
- 4. 如何保存.rar程序或SQL Server
- 5. 爲什麼%ebx%esi%edi%ebp這些寄存器在x86彙編中的線程切換時被壓入堆棧
- 6. 如何在程序中保存圖像?
- 7. 如何保存存儲在內存中的動態生成的程序集?
- 8. 程序集如何保存和恢復寄存器
- 9. 是mov%esi,%esi一個no-op或不在x86-64上?
- 10. 如何保存程序中的更改?
- 11. 保存對話框與程序集
- 12. 如何在內存中存儲程序集
- 13. 如何使用Mono.Cecil保存更改後的程序集?
- 14. 如何將程序集保存到磁盤?
- 15. 如何構建程序集並保存它?
- 16. 如何在整個應用程序中保存文件的集合?
- 17. 如何在iphone應用程序中將圖像集保存到照片庫
- 18. PHP應用程序如何將數據保存在內存中?
- 19. BizTalk如何爲EDI
- 20. 「System.IO.FileNotFoundException:無法加載文件或程序集」實際上存在程序集時
- 21. 如何使用ESI構建Symfony2應用程序?
- 22. 如何在整個android應用程序中保持java集合
- 23. 如何使用鈦在應用程序中保存數據或一組列表?
- 24. 如何製作保存功能或Android應用程序?
- 25. 如何在mvn程序集中包含log4j.properties:程序集?
- 26. 使用AssemblyBuilder,如何使所有或任何引用的程序集嵌入,而不是在已保存的程序集中鏈接?
- 27. 將數據集保存在內存或多個SQL查詢中
- 28. 的Symfony2:ESI setMaxAge緩存
- 29. Smooks:如何在EDI X12中以不同順序處理分段?
- 30. 如何在應用程序中保存圖庫中的圖片?
好吧,它會有點類似於這個? 'lea edi,evens push edi lea edi,賠率 pop edi' 在哪一點我只是推動和彈出必要的兩個之間進行切換? – xboxmods
將%edi中的值推入堆棧後,您可以隨意使用該寄存器。一旦你需要登記註冊一些不同的東西,你就會推,如果你需要返回值,就會彈出。但是,如果您必須在兩者之間切換,請考慮製作自己的堆棧並使用正常的內存操作。 – Femaref
這裏的最後一個代碼片段有點令人困惑。它是英特爾和AT&T語法的混合體(英特爾命令,AT&T語法)。您還覆蓋保存的'ebp'的值。可用空間在*下面開始*,而不是*在*它。你也應該展示如何摧毀堆棧框架。 – ughoavgfhw