1. 程式人生 > >C語言彙編-函式呼叫棧

C語言彙編-函式呼叫棧

函式呼叫大家都不陌生,呼叫者向被呼叫者傳遞一些引數,然後執行被呼叫者的程式碼,最後被呼叫者向呼叫者返回結果,還有大家比較熟悉的一句話,就是函式呼叫是在棧上發生的,那麼在計算機內部到底是如何實現的呢? 對於程式,編譯器會對其分配一段記憶體,在邏輯上可以分為程式碼段,資料段,堆,棧 程式碼段:儲存程式文字,指令指標EIP就是指向程式碼段,可讀可執行不可寫 資料段:儲存初始化的全域性變數和靜態變數,可讀可寫不可執行 BSS:未初始化的全域性變數和靜態變數 堆(Heap):動態分配記憶體,向地址增大的方向增長,可讀可寫可執行 棧(Stack):存放區域性變數,函式引數,當前狀態,函式呼叫資訊等,向地址減小的方向增長,非常非常重要,可讀可寫可執行 如圖所示 暫存器 EAX:累加(Accumulator)暫存器,常用於函式返回值 EBX:基址(Base)暫存器,以它為基址訪問記憶體 ECX:計數器(Counter)暫存器,常用作字串和迴圈操作中的計數器 EDX:資料(Data)暫存器,常用於乘除法和I/O指標 ESI:源變址暫存器 DSI:目的變址暫存器 ESP:堆疊(Stack)指標暫存器,指向堆疊頂部 EBP:基址指標暫存器,指向當前堆疊底部 EIP:指令暫存器,指向下一條指令的地址 原始碼 複製程式碼
int print_out(int begin, int end)
{
 printf("%d ", begin++);
 int *p;
 p = (int
*)(int(&begin) - 4); if(begin <= end) *p -= 5; return 1; }