1.程序是指令和數(shù)據(jù)的組合體.
2.CPU能夠直接識別和執(zhí)行的只有機器語言.
3.硬盤和磁盤等媒介上保存的程序只有被復(fù)制到內(nèi)存后才能運行.
4.內(nèi)存中保存指令和數(shù)據(jù)的場所,通過地址來標記和制定.
5.計算機的構(gòu)成元件中,根據(jù)程序的指令來進行數(shù)據(jù)運算,并控制整個計算機的設(shè)備稱作CPU.
CPU負責(zé)解釋和運行最終轉(zhuǎn)化為機器語言的程序內(nèi)容.
CPU內(nèi)部由寄存器、控制器、運算器和時鐘四部分構(gòu)成.寄存器可用來暫存指令、數(shù)據(jù)等處理對象,可看成內(nèi)存的一種,不同種類cpu會有多個寄存器.控制器負責(zé)把內(nèi)存上的指令、數(shù)據(jù)等讀入寄存器并根據(jù)指令的執(zhí)行結(jié)果來控制整個計算機.運算器負責(zé)運算從內(nèi)存讀入寄存器的數(shù)據(jù).時鐘負責(zé)發(fā)出CPU開始計時的時鐘信號.
程序運行流程:C語言等高級語言-->編譯后的機器語言.exe文件-->運行時在內(nèi)存中.exe文件的副本-->CPU解釋并執(zhí)行程序內(nèi)容.
程序啟動后,根據(jù)時鐘信號,控制器會從內(nèi)存中讀取指令和數(shù)據(jù)到寄存器中,通過對指令解釋和運行,運算器就會對數(shù)據(jù)進行運算,控制器根據(jù)運算結(jié)果來控制計算機.
程序是把寄存器當(dāng)作對象來描述的.機器語言級別的程序時通過寄存器來處理的.也就是說,使用高級語言編寫的程序在編譯后轉(zhuǎn)化為機器語言,然后再通過CPU內(nèi)部的寄存器來處理.
寄存器的主要種類和功能
累加寄存器 存儲執(zhí)行運算的數(shù)據(jù)和運算后的數(shù)據(jù) 1個
標志寄存器 存儲運算處理后的CPU的狀態(tài) 1個
程序計數(shù)器 存儲下一條指令所在內(nèi)存的地址 1個
基址寄存器 存儲數(shù)據(jù)內(nèi)存的起始地址 多個
變址寄存器 存儲基址寄存器的相對地址 多個
通用寄存器 存儲任意數(shù)據(jù) 多個
指令寄存器 存儲指令.CPU內(nèi)部使用,程序員無法對其進行讀寫操作 1個
棧寄存器 存儲棧區(qū)域的起始地址 1個
CPU每執(zhí)行一條指令,程序計數(shù)器的值就會加1,控制器參照程序計數(shù)器的值,從內(nèi)存中讀取指令并執(zhí)行,也就是說,程序計數(shù)器決定著程序的流程.
函數(shù)的調(diào)用機制
哪怕是高級語言編寫的程序,函數(shù)調(diào)用處理也是通過把程序計數(shù)器的值設(shè)定為函數(shù)的存儲地址來實現(xiàn)的.單純的跳轉(zhuǎn)無法實現(xiàn)函數(shù)的調(diào)用,函數(shù)的調(diào)用需要在完成函數(shù)的內(nèi)部處理后,處理流程再回到函數(shù)的調(diào)用點(函數(shù)調(diào)用指令的下一個指令).因此,如果只是跳轉(zhuǎn)到函數(shù)的入口地址,處理流程久不知道應(yīng)該返回至哪里了.
機器語言的call和return指令可以解決這個問題.在函數(shù)的入口地址設(shè)定到程序計數(shù)器之前,call指令會把調(diào)用函數(shù)后要執(zhí)行的指令地址存儲在名為棧的主內(nèi)存.函數(shù)處理完畢后,再通過函數(shù)的出口來執(zhí)行return命令.return指令的功能是把保存在棧中的地址設(shè)定到程序計數(shù)器中.
CPU會把基址寄存器+變址寄存器的值解釋為實際查看的內(nèi)存地址.變址寄存器久相當(dāng)于高級語言程序中數(shù)組的索引功能. 實際地址 = 基址寄存器的值+變址寄存器的值.
機器語言指令的主要類型和功能:
數(shù)據(jù)轉(zhuǎn)送指令:寄存器和內(nèi)存、內(nèi)存和內(nèi)存、寄存器和外圍設(shè)備之間的數(shù)據(jù)讀寫操作.
運算指令:用累加寄存器執(zhí)行算數(shù)運算、邏輯運算、比較運算和位移運算.
跳轉(zhuǎn)指令:實現(xiàn)條件分支、循環(huán)、強制跳轉(zhuǎn)等.
call/return指令:函數(shù)的調(diào)用/返回調(diào)用前的地址.