C語言彙編-函式呼叫棧
阿新 • • 發佈:2018-12-10
函式呼叫大家都不陌生,呼叫者向被呼叫者傳遞一些引數,然後執行被呼叫者的程式碼,最後被呼叫者向呼叫者返回結果,還有大家比較熟悉的一句話,就是函式呼叫是在棧上發生的,那麼在計算機內部到底是如何實現的呢?
對於程式,編譯器會對其分配一段記憶體,在邏輯上可以分為程式碼段,資料段,堆,棧
程式碼段:儲存程式文字,指令指標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; }