- xchg edi, esp ; Exchange edi and esp, edi will be assigned to the current esp pointer and esp will be Stack base + Stack size\r
- mov ebx, esp ; Put Stack base + Stack size in ebx\r
+ xchg edi, esp ; Exchange edi and esp, edi will be assigned to the current esp pointer and esp will be Stack base + Stack size\r
+\r
+SkipStackSwitch:\r
+ ;\r
+ ; If heap size % is 0:\r
+ ; EDI is FSPM_UPD_COMMON.StackBase and will hold ESP later (boot loader stack pointer)\r
+ ; ECX is FSPM_UPD_COMMON.StackSize\r
+ ; ESP is boot loader stack pointer (no stack switch)\r
+ ; BL is 0 to indicate no stack switch (EBX will hold FSPM_UPD_COMMON.StackBase later)\r
+ ;\r
+ ; If heap size % is not 0\r
+ ; EDI is boot loader stack pointer\r
+ ; ECX is FSPM_UPD_COMMON.StackSize\r
+ ; ESP is new stack (FSPM_UPD_COMMON.StackBase + FSPM_UPD_COMMON.StackSize)\r
+ ; BL is NOT 0 to indicate stack has switched\r
+ ;\r
+ cmp bl, 0\r
+ jnz StackHasBeenSwitched\r
+\r
+ mov ebx, edi ; Put FSPM_UPD_COMMON.StackBase to ebx as temp memory base\r
+ mov edi, esp ; Put boot loader stack pointer to edi\r
+ jmp StackSetupDone\r
+\r
+StackHasBeenSwitched:\r
+ mov ebx, esp ; Put Stack base + Stack size in ebx\r
+ sub ebx, ecx ; Stack base + Stack size - Stack size as temp memory base\r
+\r
+StackSetupDone:\r