2012-10-19 58 views
1

我明白EBP和ESP寄存器的基本語義,但我稍微用以下困惑:移動另一個寄存器EBP註冊

mov ebp, eax 

下一行是:

mov edi, dword ptr [ebp] 

我以爲ebp寄存器是我們走棧的參考點,增加它給我們參數,減去獲取局部變量。所以通過將eax移動到ebp,這不會導致問題嗎?

我可以理解說:

mov [ebp+12], eax 

我猜想,是一起移動到EAX out參數的線路?

回答

5

無法看出使用這些指令訪問哪些實體而不會看到更多的代碼。

x86 CPU中的任何內容都不允許您將ebp用於訪問子例程參數和局部變量以外的內容。

在32位模式下,您可以通過esp訪問堆棧變量,因爲存在[esp+something]的內存操作數編碼。在16位模式下,您不能使用sp來完成此操作,並且需要使用以下列表中的一個寄存器:bpbx,si,di

某些編譯器可以選擇使用[esp+something]而不是[ebp+something]來訪問棧內數據。這爲您購買了一個額外的通用寄存器,您可以將其用於其他事情。

只要您的代碼不需要保留ebp的值或只要它將ebp恢復到預期值,就可以在做mov ebp, eax時發生任何錯誤。