3.7 過程

要對(duì)過程提供機(jī)器級(jí)支持,需要實(shí)現(xiàn)三個(gè)動(dòng)作機(jī)制,現(xiàn)在假設(shè)過程P調(diào)用過程Q,Q執(zhí)行后返回到P:


屏幕快照 2017-09-30 下午3.13.07.png

3.7.1 運(yùn)行時(shí)棧

  1. 棧用來(lái)傳遞參數(shù)、存儲(chǔ)返回信息、保存寄存器以及局部存儲(chǔ)。
  2. 當(dāng)過程P調(diào)用過程Q時(shí),會(huì)把返回地址壓入棧內(nèi),指明當(dāng)Q返回時(shí),要從P的哪個(gè)位置繼續(xù)執(zhí)行。
  3. 大多數(shù)過程的棧幀都是定長(zhǎng)的,在過程的開始就分配好了,但是有些過程需要變長(zhǎng)的幀。
  4. 通過寄存器,過程P可以傳遞最多6個(gè)整數(shù)值(指針和整數(shù)),但是如果Q需要更多的參數(shù),P可以在調(diào)用Q之前在自己的棧幀里存儲(chǔ)好這些參數(shù)。


    屏幕快照 2017-09-30 下午3.16.45.png

3.7.2 轉(zhuǎn)移控制
關(guān)鍵點(diǎn)就是調(diào)用call指令時(shí),會(huì)把父過程繼續(xù)執(zhí)行的地址壓入棧內(nèi),這樣在子過程調(diào)用完成后,會(huì)彈出棧頂,程序計(jì)數(shù)器PC更新為彈出的棧頂值,程序流轉(zhuǎn)回正確的父過程執(zhí)行位置。


屏幕快照 2017-09-30 下午3.26.54.png

3.7.3 數(shù)據(jù)傳送

  1. x86-64中,大部分過程間的數(shù)據(jù)傳送是通過寄存器實(shí)現(xiàn)的,比如常見的%rdi、%rsi,而返回值可以通過訪問寄存器%rax。
  2. 通過寄存器最多可以傳遞6個(gè)參數(shù),寄存器使用有特殊順序,并且使用的名字跟傳遞的參數(shù)大小也有關(guān)系。


    屏幕快照 2017-09-30 下午3.48.25.png
  3. 如果一個(gè)函數(shù)有大于6個(gè)整型參數(shù),超過6個(gè)的部分要通過棧來(lái)傳遞。通過棧傳遞參數(shù),所有的參數(shù)大小都向8的整數(shù)倍對(duì)齊。參數(shù)到位以后,再調(diào)用call指令進(jìn)行控制轉(zhuǎn)移。

3.7.4 棧上的局部存儲(chǔ)
有些時(shí)候,局部數(shù)據(jù)必須存放在內(nèi)存中,常見情況如下:


屏幕快照 2017-09-30 下午3.56.50.png

3.7.5 寄存器中的局部存儲(chǔ)空間

  1. 寄存器是唯一被所有過程共享的資源。
  2. 寄存器%rbx、%rbp、%r12-%r15被劃分為被調(diào)用者保存寄存器。
  3. 過程P調(diào)用過程Q,為了保證P的一些寄存器的值不被Q覆蓋,調(diào)用之前必須把這些寄存器內(nèi)的值入棧保存起來(lái),然后在Q執(zhí)行完返回后,把這些值恢復(fù)到寄存器內(nèi)


    屏幕快照 2017-09-30 下午4.14.13.png

3.7.6 遞歸過程
遞歸調(diào)用一個(gè)函數(shù)本身和調(diào)用其他函數(shù)是一樣的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 原文地址:C語(yǔ)言函數(shù)調(diào)用棧(一)C語(yǔ)言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用。當(dāng)一個(gè)函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,704評(píng)論 1 19
  • 8086匯編 本筆記是筆者觀看小甲魚老師(魚C論壇)《零基礎(chǔ)入門學(xué)習(xí)匯編語(yǔ)言》系列視頻的筆記,在此感謝他和像他一樣...
    Gibbs基閱讀 37,411評(píng)論 8 114
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,981評(píng)論 19 139
  • 一、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡(jiǎn)單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運(yùn)行的地址不確定 關(guān)于...
    SeanCST閱讀 7,883評(píng)論 0 27
  • 趁著小寶睡覺的時(shí)候趴在窗邊完成了這幅兒童畫的線稿 傳上來(lái)看看,才發(fā)現(xiàn)很多不足。線條的連接不流暢,花枝該粗的地方細(xì)了...
    夏秋愛畫閱讀 831評(píng)論 2 1