在解決完計算機對于表達(dá)這個世界后,對于最終使用計算機去解決現(xiàn)實問題,還有一步需要跨越,也就是現(xiàn)實的動態(tài)部分。
世界除了有著我們視角的靜態(tài)三維,還有這它最迷人的動態(tài)四維,一般來說以時間代指,時間使得我們世界從大爆炸一步步成為現(xiàn)在的樣子,我們常以河流來比喻,就像一股流狀態(tài)來驅(qū)動著所有靜態(tài)事物的改變。而計算機對于問題的描述當(dāng)然要模擬這個過程,前人們便去探索我們這復(fù)雜世界問題的那些基礎(chǔ)部分。
計算機科學(xué)家的結(jié)論很簡潔,一切的過程,用順序和分支加循環(huán)(核心是基于表示的狀態(tài)的轉(zhuǎn)化)就可以表達(dá),那么對于這個過程的構(gòu)建就是計算機構(gòu)建roadmap在解決表示的問題后的首要問題
就如我們有形形色色的方言一樣,計算機也有這自己的方言-指令集,雖然最終都是對于順序和分支的表達(dá),但是有自己不同的語調(diào)。而到了高級語言如C層面,借助于先人給我們的抽象層,語言又達(dá)到了歸一,一方面說明了抽象的強大和意義,另一方面也說明了整個計算機還是同一個渾然的體系。
指令集的構(gòu)建也是一個探索的過程,有點像雞和蛋的關(guān)系,沒有指令集便無法構(gòu)建出程序,而指令集也需要程序的需要和數(shù)字電路能夠?qū)崿F(xiàn)的邏輯去達(dá)到一個精妙的平衡點,慢慢相互磨合,便有了當(dāng)今的風(fēng)云指令集,8086系,程序從由c到8086匯編最終到一個個2進(jìn)制位,而機器則是從一個個2進(jìn)制位的執(zhí)行,最終完成我們想要的各種操作。
指令集自然要基本的完成對于整個計算機“計算”過程的抽象

在數(shù)據(jù)在處理器和內(nèi)存的倒騰中,我們需要一些憑借:
對于x86處理器來說我們需要
程序計數(shù)器(PC, Program counter) - 存著下一條指令的地址,在 x86-64 中稱為 RIP
寄存器(Register) - 用來存儲數(shù)據(jù)以便操作
條件代碼(Codition codes) - 通常保存最近的算術(shù)或邏輯操作的信息,用來做條件跳轉(zhuǎn)
簡單來說也就是處理器執(zhí)行 存取,計算(條件),傳輸?shù)墓δ?,而由此我們匯編語言也就自然而然的有了 指令 操作數(shù)1 (,操作數(shù)2 ,操作數(shù)3) 這樣的的一般形式
框架有了,下一步就是約定,寄存器本身結(jié)構(gòu)上沒有差異,但是我們可以賦予其含義,以X86系列為例
%rax(%eax) 用于做累加
%rcx(%ecx) 用于計數(shù)
%rdx(%edx) 用于保存數(shù)據(jù)
%rbx(%ebx) 用于做內(nèi)存查找的基礎(chǔ)地址
%rsi(%esi) 用于保存源索引值
%rdi(%edi) 用于保存目標(biāo)索引值
寄存器作為處理器的親兒子,有著當(dāng)前運算最緊要的數(shù)據(jù),但是奈何空間價格比與內(nèi)存差距巨大,最主要的大量數(shù)據(jù)還是在內(nèi)存中,而整個過程就是指令集要實現(xiàn)最基本的一個過程,也就是處理器要實現(xiàn)的過程。但是內(nèi)存又不像寄存器那樣直接對應(yīng)命名,處理這么一片廣饒的土地,那么又需要對整個內(nèi)存進(jìn)行抽象。簡言之,需要“尋址”這個過程的實現(xiàn)(TODO: 尋址展開)
而“計算框架”和“數(shù)據(jù)”都準(zhǔn)備好后,指令集要解決的問題就是“流程”了。
除了自然的通過“跳轉(zhuǎn)”來對流程進(jìn)行控制,還有一個重要的概念就是“過程調(diào)用”,正如我們現(xiàn)實的計算一般,一個計算的流程,往往最多的是類似的各種公式(過程調(diào)用)計算,然后再補上特定的整理(流程)計算。而過程調(diào)用主要包含三個方面
傳遞控制:包括如何開始執(zhí)行過程代碼,以及如何返回到開始的地方
傳遞數(shù)據(jù):包括過程需要的參數(shù)以及過程的返回值
內(nèi)存管理:如何在過程執(zhí)行的時候分配內(nèi)存,以及在返回之后釋放內(nèi)存
抽象的能力又閃亮登場了,先人們用“?!边@個結(jié)構(gòu)對過程調(diào)用完美的進(jìn)行了抽象,利用棧來完成過程調(diào)用 (TODO: 棧展開)