Posts

Showing posts from March, 2015

函數調用 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 也便於找函數返回地址