函數調用 push ebp 詳解

//假設函數a中調用 函數b - 0x123456
// 函數a
push ebp
mov ebp, esp
......................

push eax
push ebx
push ecx
call 0x123456 <--- 1. 函數調用前 使用ebp訪問參數, push EIP , jmp
xxxxxxxxx    <----- 6. ebp 正常使用
......................
mov esp, ebp
pop ebp

//函數b - 0x123456
push ebp  <------- 2. 保存上層用於訪問參數的ebp
mov ebp, esp <-----3. 設定新的ebp 訪問此函數的參數, 此時esp 指向ebp地址

.....................
mov esp, ebp <----- 4. 把指向ebp在找中的地址 給棧指針
pop ebp <------ 5.把ebp 恢復成調用者ebp
ret // 返回 , 返回時ebp 正常

保存ebp
1. Esp 用作分配棧空間 不能用作訪問參數
2. Ebp 用作訪問參數,意味每次調用函數ebp 也會被修改, 因為調用函數參數會壓棧,再次使用來訪問參數(不停調用 不停改變)
3. 因此 每次調用 也保存ebp 是為了調用者 返回後 仍讓調用者繼續訪問自己的參數

push ebp 也便於找函數返回地址

Comments

Post a Comment

Popular posts from this blog

Android Kernel Development - Kernel compilation and Hello World

How does Nested-Virtualization works?

Understanding ACPI and Device Tree