cpu怎樣區別指令和資料

2021-06-18 11:45:40 字數 1440 閱讀 6637

指令和資料都是以二進位制存放在記憶體中,執行的時候cpu怎麼來區分呢?

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

比如:要計算機做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裡讀指令。

cpu如何區分指令和資料

計算機載入的第一條肯定是指令,然後根據這條指令去取二進位制數,如果這條指令要取運算元,那麼取出來的就是運算元 如果這條指令要取下一條指令,那麼取出來得就是指令。把指令和資料分開放是為了安全和邏輯結構清晰。隨便指令和資料存放的格式一樣,但是訪問他們的時機不同 在取指令時期,cpu通過指令流取指令,存放...

指令和資料的定址方式

在馮諾依曼結構計算機中,儲存器既可以用來存放資料也可以用來存放指令。與其說儲存器存放的是指令和資料,不如說的是儲存器僅僅用來存放 資料 cpu用於加工資料。在儲存器中,運算元或指令字寫入或讀出的方式,有位址指定方式 相聯儲存方式和堆疊儲存方式。幾乎所有的計算機,在記憶體中都採用位址指定方式。當採用位...

mov指令和資料傳輸

1.mov指令的順序是從右到左,如mov a,b,則把b的值複製給a。如 mov 目的運算元 a 源運算元 b 即a b 2.除了之前提到的movb,movw,movl,movq,還有movabsq,代表傳送絕對的四字,movq雖可傳四字,但一旦要傳立即數,則只能傳32位補碼表示的立即數,隨後把它符...