撰寫初構/終解程式碼的考量
Microsoft 特定的
在撰寫您自己的初構和表文程式碼序列之前,請務必瞭解堆疊框架的配置方式。瞭解如何使用 __LOCAL_SIZE
符號也很有用。
堆疊框架配置
這個範例將示範可能出現在 32 位元函式中的標準初構程式碼:
push ebp ; Save ebp
mov ebp, esp ; Set stack frame pointer
sub esp, localbytes ; Allocate space for locals
push <registers> ; Save registers
localbytes
變數代表區域變數堆疊上所需的位元組數目,而 <registers>
變數是預留位置,代表要儲存在堆疊上的暫存器清單。 推入暫存器之後,您就可以在堆疊上放置任何適當的資料。 以下是對應的終解程式碼:
pop <registers> ; Restore registers
mov esp, ebp ; Restore stack pointer
pop ebp ; Restore ebp
ret ; Return from function
堆疊一律從高到低排列 (從高到低記憶體位址)。 基底指標 (ebp
) 會指向 ebp
的推送值。 區域是從 ebp-4
開始。 若要存取區域變數,請從 ebp
減去適當的值計算 ebp
的位移。
__LOCAL_SIZE
編譯器提供符號 , __LOCAL_SIZE
用於函式初構程式碼的內嵌組譯工具區塊。 這個符號是用來在自訂初構程式碼中堆疊框架上為區域變數配置空間。
編譯器會決定 的值 __LOCAL_SIZE
。 其值是所有使用者定義之區域變數和編譯器所產生之暫存變數的位元組總數。 __LOCAL_SIZE
只能當做直接運算元使用;它不能用在運算式中。 您不得變更或重新定義這個符號的值。 例如:
mov eax, __LOCAL_SIZE ;Immediate operand--Okay
mov eax, [ebp - __LOCAL_SIZE] ;Error
下列包含自訂初構和表結序列的裸體函式範例會 __LOCAL_SIZE
使用 prolog 序列中的符號:
// the__local_size_symbol.cpp
// processor: x86
__declspec ( naked ) int main() {
int i;
int j;
__asm { /* prolog */
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
}
/* Function body */
__asm { /* epilog */
mov esp, ebp
pop ebp
ret
}
}
END Microsoft 特定的
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應