程式及指令的關係

2021-09-14 07:22:23 字數 2591 閱讀 4859

簡單點說,從指令週期的不同時期來判斷!

取指週期取的是指令,在執行的時候取運算元取的是資料!

詳細分析如下:

計算機可以從時間和空間兩方面來區分指令和資料,在時間上,取指週期從記憶體中取出的是指令,而執行週期從記憶體取出或往記憶體中寫入的是資料,在空間上,從記憶體中取出指令送控制器,而執行週期從記憶體從取的資料送運算器、往記憶體寫入的資料也是來自於運算器。

比如:要計算機做1+2=?中,「+」表示要做什麼和怎樣做,1和2則是做的時候需要的原始數。現在假設某cpu中,「+」用二進位制「00000001」來表示,「1、2」分別用「00000001、00000010」來表示。那麼,這段程式存入記憶體中就是這樣的:

***x1:00000001

***x2:00000001

***x3:00000010 前面的***x1 ***x2

***x3表示記憶體的位址

從上面可以看出,「+」指令和被加數是完全相同的,當然,這是我故意這樣假設的,但是,在實際情況中,這種情況是大量存在的。在正常情況下,cpu只能把***x1記憶體中的00000001作為指令,***x2記憶體中的00000001作為被加數才能得到正確的結果。那麼cpu如何才能做到不把第二個00000001也當成「+」呢?

1.人們把記憶體的某個位址規定為起始位址(又稱為復位位址),也就是說,當計算機開機或者被強行復位(也就是機箱上那個重啟動按鈕按下的的時候),cpu立即跳轉到這個位址中,並且把它裡面的**作為指令來執行,同時根據這個指令的長度和格式判斷下一條指令在什麼地方。

對於x86系列cpu(也就是現在人們常用的什麼奔xx、賽xx系列),它的復位位址是ffff0,如果表示成邏輯位址則是:ffff:0000。對debug比較熟悉的朋友或者會在一些高階語言中嵌入組合語言的朋友可以這樣做乙個試驗:

用debug執行一條指令(這是一條無條件跳轉指令):jmp

ffff:0000,或者在高階語言中嵌入這條彙編指令,執行後,你就會發現,計算機重新啟動了(純32位windows是不能進入實模式的,重啟以後到載入windows以前都是實模式,只有實模式才能重啟)。其實,用程式控制計算機重啟的最本質的操作就是這樣的。

2.給各種指令規定了相應的長度和格式。比如:某數+某數這條指令就規定:這條指令的長度是3個位元組,其中第乙個位元組表示「+」,後面兩個位元組表示被加數和加數。於是,當cpu到達這個指令後,就自動把第乙個**作為指令,後面兩個**作為資料,依次類推,第4個**就必然是指令

cs(codestring)指向的是指令段位址,指令段暫存器

ds(datastring)指向的是資料段位址,資料段暫存器

ss(stackstring)指向的是棧頂段位址,棧段暫存器

cs指向的段位址裡,存的是指令

ds指向的段位址裡,存的是資料

資料和程式在記憶體中都是已2進製的資料存貯,只有當2進製的資料被cs:ip指向時,才成為可執行的指令或程式。cpu要執行cs中的指令 指令用到的資料可能就存放在ds中,你可以把資料放到cs 但是cpu並不把它當成資料來使用,你也可以把指令放到ds中,但是cpu根本不去ds裡讀指令。[^1 ]

過程詳細解釋

幾乎所有的馮·諾伊曼型計算機的cpu,其工作都可以分為5個階段:取指令、指令解碼、執行指令、訪訪問數、結果寫回。

1.取指令階段

取指令(instruction fetch,if)階段是將一條指令從主存中取到指令暫存器的過程。

程式計數器pc中的數值,用來指示當前指令在主存中的位置。當一條指令被取出後,pc中的數值將根據指令字長度而自動遞增:若為單字長指令,則(pc)+1àpc;若為雙字長指令,則(pc)+2àpc,依此類推。

2.指令解碼階段

取出指令後,計算機立即進入指令解碼(instruction decode,id)階段。

在指令解碼階段,指令解碼器按照預定的指令格式,對取回的指令進行拆分和解釋,識別區分出不同的指令類別以及各種獲取運算元的方法。

3.執行指令階段

在取指令和指令解碼階段之後,接著進入執行指令(execute,ex)階段。

此階段的任務是完成指令所規定的各種操作,具體實現指令的功能。為此,cpu的不同部分被連線起來,以執行所需的操作。

例如,如果要求完成乙個加法運算,算術邏輯單元alu將被連線到一組輸入和一組輸出,輸入端提供需要相加的數值,輸出端將含有最後的運算結果。

4.訪訪問數階段

根據指令需要,有可能要訪問主存,讀取運算元,這樣就進入了訪訪問數(memory,mem)階段。

5.結果寫回階段

作為最後乙個階段,結果寫回(writeback,wb)階段把執行指令階段的執行結果資料「寫回」到某種儲存形式:結果資料經常被寫到cpu的內部暫存器中,以便被後續的指令快速地訪問;在有些情況下,結果資料也可被寫入相對較慢、但較廉價且容量較大的主存。許多指令還會改變程式狀態字暫存器中標誌位的狀態,這些標誌位標識著不同的操作結果,可被用來影響程式的動作。

許多新型cpu可以同時取出、解碼和執行多條指令,體現並行處理的特性。

[^1 ] cpu如何區分讀出的**是指令還是資料

[^2 ] cpu的執行和記憶體的介紹

[^3 ] 32位系統最大只能支援4gb記憶體原因

[^4 ] cpu執行程式的原理

機器指令與微指令的關係

機器指令和微指令的關係歸納如下 1.一條機器指令對應乙個微程式,這個微程式是由若干條微指令構成的。因此,一條機器指令的功能是若干條微指令組成的序列來實現的。簡而言之,一條機器指令所完成的操作劃分成若干條微指令來完成,由微指令進行解釋和執行。2.從指令與微指令,程式與微程式,位址與微位址的一一對應關係...

ubuntu安裝程式常用方式及指令

採用weget命令,例如獲取node.js的安裝包 wget採用curl的方式,獲取安裝包內容,直接進行安裝。例如安裝docker compose curl l s uname m o usr local bin docker compose其中uname s和uname m分別顯示作業系統名稱和電...

Linux許可權和指令的關係

1 讓使用者能進入某目錄稱為 可工作目錄 的基本許可權為何 可使用的指令 例如cd等變換工作目錄的指令 目錄所需許可權 使用者對這個目錄至少需要具有x的許可權 額外需求 如果使用者想要在這個目錄內利用ls查閱檔名,則使用者對此目錄還需要r的許可權 2 使用者在某目錄內讀取乙個檔案的基本許可權為何?可...