撰寫初構/終解程式碼的考量因素
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
下列範例包含自訂的初構和終解 naked 函式的序列使用 __LOCAL_SIZE 在初構序列中的符號:
// 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
}
}