2011-10-08 49 views
1

我正在執行幾個已經需要使用源索引的進程。如果我需要使用已經用於其他項目的源索引,我該怎麼做?有沒有辦法將edi保存爲數據,然後在必要時檢索它?如何在程序集中保存esi或edi

謝謝。

回答

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 

你並不需要清除記憶,一旦空間被再次使用它會被覆蓋。

+0

好吧,它會有點類似於這個? 'lea edi,evens push edi lea edi,賠率 pop edi' 在哪一點我只是推動和彈出必要的兩個之間進行切換? – xboxmods

+0

將%edi中的值推入堆棧後,您可以隨意使用該寄存器。一旦你需要登記註冊一些不同的東西,你就會推,如果你需要返回值,就會彈出。但是,如果您必須在兩者之間切換,請考慮製作自己的堆棧並使用正常的內存操作。 – Femaref

+0

這裏的最後一個代碼片段有點令人困惑。它是英特爾和AT&T語法的混合體(英特爾命令,AT&T語法)。您還覆蓋保存的'ebp'的值。可用空間在*下面開始*,而不是*在*它。你也應該展示如何摧毀堆棧框架。 – ughoavgfhw

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 
相關問題