畫多張流程圖即可,將函數(shù)名作為一條語句在主程序流程中調(diào)用即可
在南皮等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站設計 網(wǎng)站設計制作定制網(wǎng)站開發(fā),公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站制作,網(wǎng)絡營銷推廣,外貿(mào)網(wǎng)站制作,南皮網(wǎng)站建設費用合理。
程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用。當一個函數(shù)執(zhí)行完畢時,程序要回到調(diào)用指令的下一條指令(緊接call指令)處繼續(xù)執(zhí)行。函數(shù)調(diào)用過程通常使用堆棧實現(xiàn),每個用戶態(tài)進程對應一個調(diào)用棧結(jié)構(gòu)(call stack)。編譯器使用堆棧傳遞函數(shù)參數(shù)、保存返回地址、臨時保存寄存器原有值(即函數(shù)調(diào)用的上下文)以備恢復以及存儲本地局部變量。
不同處理器和編譯器的堆棧布局、函數(shù)調(diào)用方法都可能不同,但堆棧的基本概念是一樣的。
寄存器是處理器加工數(shù)據(jù)或運行程序的重要載體,用于存放程序執(zhí)行中用到的數(shù)據(jù)和指令。因此函數(shù)調(diào)用棧的實現(xiàn)與處理器寄存器組密切相關。
AX(AH、AL):累加器。有些指令約定以AX(或AL)為源或目的寄存器。輸入/輸出指令必須通過AX或AL實現(xiàn),例如:端口地址為43H的內(nèi)容讀入CPU的指令為INAL,43H或INAX,43H。目的操作數(shù)只能是AL/AX,而不能是其他的寄存器。 [5]
BX(BH、BL): 基址寄存器 。BX可用作間接尋址的地址寄存器和 基地址寄存器 ,BH、BL可用作8位通用數(shù)據(jù)寄存器。 [5]
CX(CH、CL):計數(shù)寄存器。CX在循環(huán)和串操作中充當計數(shù)器,指令執(zhí)行后CX內(nèi)容自動修改,因此稱為計數(shù)寄存器。 [5]
DX(DH、DL):數(shù)據(jù)寄存器。除用作通用寄存器外,在 I/O指令 中可用作端口 地址寄存器 ,乘除指令中用作輔助累加器。 [5]
2.指針和 變址寄存器
BP( Base Pointer Register):基址指針寄存器。 [5]
SP( Stack Pointer Register): 堆棧指針寄存器 。 [5]
SI( Source Index Register):源變址寄存器。 [5]
DI( Destination Index Register):目的變址寄存器。 [5]
函數(shù)調(diào)用棧的典型內(nèi)存布局如下圖所示:
圖中給出主調(diào)函數(shù)(caller)和被調(diào)函數(shù)(callee)的棧幀布局,"m(%ebp)"表示以EBP為基地址、偏移量為m字節(jié)的內(nèi)存空間(中的內(nèi)容)。該圖基于兩個假設:第一,函數(shù)返回值不是結(jié)構(gòu)體或聯(lián)合體,否則第一個參數(shù)將位于"12(%ebp)" 處;第二,每個參數(shù)都是4字節(jié)大小(棧的粒度為4字節(jié))。在本文后續(xù)章節(jié)將就參數(shù)的傳遞和大小問題做進一步的探討。 此外,函數(shù)可以沒有參數(shù)和局部變量,故圖中“Argument(參數(shù))”和“Local Variable(局部變量)”不是函數(shù)棧幀結(jié)構(gòu)的必需部分。
其中,主調(diào)函數(shù)將參數(shù)按照調(diào)用約定依次入棧(圖中為從右到左),然后將指令指針EIP入棧以保存主調(diào)函數(shù)的返回地址(下一條待執(zhí)行指令的地址)。進入被調(diào)函數(shù)時,被調(diào)函數(shù)將主調(diào)函數(shù)的幀基指針EBP入棧,并將主調(diào)函數(shù)的棧頂指針ESP值賦給被調(diào)函數(shù)的EBP(作為被調(diào)函數(shù)的棧底),接著改變ESP值來為函數(shù)局部變量預留空間。此時被調(diào)函數(shù)幀基指針指向被調(diào)函數(shù)的棧底。以該地址為基準,向上(棧底方向)可獲取主調(diào)函數(shù)的返回地址、參數(shù)值,向下(棧頂方向)能獲取被調(diào)函數(shù)的局部變量值,而該地址處又存放著上一層主調(diào)函數(shù)的幀基指針值。本級調(diào)用結(jié)束后,將EBP指針值賦給ESP,使ESP再次指向被調(diào)函數(shù)棧底以釋放局部變量;再將已壓棧的主調(diào)函數(shù)幀基指針彈出到EBP,并彈出返回地址到EIP。ESP繼續(xù)上移越過參數(shù),最終回到函數(shù)調(diào)用前的狀態(tài),即恢復原來主調(diào)函數(shù)的棧幀。如此遞歸便形成函數(shù)調(diào)用棧。
EBP指針在當前函數(shù)運行過程中(未調(diào)用其他函數(shù)時)保持不變。在函數(shù)調(diào)用前,ESP指針指向棧頂?shù)刂?,也是棧底地址。在函?shù)完成現(xiàn)場保護之類的初始化工作后,ESP會始終指向當前函數(shù)棧幀的棧頂,此時,若
C語言中調(diào)用函數(shù)的方法及步驟:
工具/原料:C語言
1、首先需要輸入想要調(diào)用的函數(shù)。
2、然后當輸入一個括號后,即可觀察他的參數(shù)。
3、接著在對應的參數(shù)中輸入?yún)?shù)值。
4、然后,系統(tǒng)會發(fā)生一個警告。
5、接著需要調(diào)用它相應的頭文件。
6、最后再次編譯,發(fā)現(xiàn)沒有任何警告和錯誤即可。
初學C語言的同學應該首先了解C語言關鍵的核心概念(結(jié)構(gòu)化、WBR三個執(zhí)行流程、優(yōu)先級、指針、文檔、共用體、函數(shù)、作用域、WBR重載等
),WBR只有弄明白了這些才能在今后的學習中游刃有余的把握C語言的精髓WBR。這幾個概念就像邏輯線相同,把整個C語言的體系貫穿起來,WBR給人一種“結(jié)構(gòu)化”的思想體系。WBR下面我簡要談一下這幾個核心概念。
1、從宏觀角度來看,結(jié)構(gòu)化是C語言的編程思想基礎,WBR就是說C語言每一個功能模塊就是個結(jié)構(gòu),WBR每一個結(jié)構(gòu)實現(xiàn)一個運算或一個算法,這個結(jié)構(gòu)就用大括號表示“{
}”,大括號里面的就是算法。尤其注意的是大括號的“}”WBR括在那里,就決定在哪里結(jié)束算法功能。WBR這些是初學者經(jīng)常犯的錯誤,往往會把算法功能的結(jié)束點弄錯。
2、
三個執(zhí)行流程就是順序流程、條件流程、循環(huán)流程。WBR三個流程都是電腦通用的執(zhí)行流程,是必須了解的流程,WBR每一個算法都基于這三個流程執(zhí)行順序。
3、
優(yōu)先級是對多個函數(shù)并列時候優(yōu)先算法的特權(quán),WBR沒有注意優(yōu)先級的順序就會把算法出錯,這些優(yōu)先級是必須記住的。
4、
指針是C語言的重要特點,是對運算速度加快運算的重要精髓。WBR他是對數(shù)據(jù)地址的操作,而不是對數(shù)據(jù)的操作。
5、文檔和共用體是很簡單的概念,不用多說了。WBR文檔顧名思義和日常概念相同,WBR學過數(shù)據(jù)軟件的都對共用體了解不是太難。
6、從微觀角度來看,函數(shù)是C語言的驅(qū)動機制,WBR任何的語句都由函數(shù)驅(qū)動來實現(xiàn)的。WBR記住函數(shù)命令和相關的配置參數(shù),就能好好的利用C的優(yōu)勢。WBR注意的是,函數(shù)不能記錯,不然您將得出錯的結(jié)果。WBR假如能學會調(diào)試,那就會更深一層了解函數(shù)功能的作用。
7、作用域就像使用期限相同,說明從那里到那里所起的作用,WBR在這之外的就不起作用了(過期的東西就不值錢相同)。WBR把握好作用域的使用方式,就能明確函數(shù)的關系,WBR不會在巨大的函數(shù)名里面迷失方向。
8、重載就是為了方便用戶,WBR使用類似于調(diào)用的機制給用戶減少寫入時間的功能。WBR就像查字典相同,您不懂一個字,就要去查字典(WBR相當于調(diào)用別的工具來實現(xiàn)您要做的事),WBR而查字典是您已學會的東西,就能夠做這件事了。
學習C語言從大體上了解還不夠,要把各種原理在腦海里模擬一遍,WBR實現(xiàn)把電腦C的功能在人腦里運作,就能從宏觀上把握C的步驟。