計算機只能識別0和1、計算機是二進位制;虛擬數字是怎麼控制實物計算機的?使用者1031961929712019-04-27 15:18:37

1、二進位制控制實體計算機的理論基礎是邏輯運算,透過0和1來進行與、或、非等運算。2、實體基礎是閘電路,比如與門、或門、非門。它們的特點是輸入和輸出都只有0和1兩種狀態,用電壓的高低來區分。每個閘電路都會有一個開關,控制閘電路是否進行輸出。3、利用多個閘電路,可以組成各種各樣的運算器,比如加法器、乘法器等。比如一個8位二進位制數的加法器有16個輸入腳(每8個腳),8個輸出腳。00000011 + 00001110 = 00010001。4、在運算器的每個腳上加上一個暫時儲存電壓高低的“充電器”,就可以有節奏地進行運算。可以把每8個“充電器”編成一組,叫把每組做一個暫存器。暫存器有兩種模式,一是往裡充電,高電壓表示1,低電壓表示0。另一種是向外供電。假設輸入腳對應的兩個暫存器是A和B,輸出腳對應的暫存器是C。比如我們要把7加三次1。先將A和B置為“充電模式”,或者說寫模式,在第一個輸出暫存器中充入00000111(十進位制的7),第二個暫存器充入00000001(十進位制的1)。將A和B的置為“供電模式”,即讀模式,向運算器的輸入腳供電。然後開啟運算器,這樣它的輸出端直接能呈現計算結果00001000(十進位制的8)對應的高低電壓了。將C置為“充電模式”,就能將8存到C中。將C置為“供電模式”,A置為“充電模式”,就能將8存到A裡。重複上面的操作,可以進行8+1=9,並將9存到A裡。再重複一次,可以進行9+1=10,最後C裡存就是10了。對4做一個總結:上面的操作都是可以透過暫存器的狀態轉換以及運算器的開關進行。而狀態和開關都可以用0和1即高電壓和低電壓來區分。那麼如何控制它們有節奏地進行狀態轉換和開關呢?5、計算的過程可以用“指令”抽象一下,並進行編碼,然後記錄在記憶體中,就能順序控制開關進行想要的操作。比如上面的過程用抽象一點的概念可以這麼寫:mov A, 7; 把7放到Amov B, 1; 把1放到Badd A, B; 把A+B放到Aadd A, B; 把A+B放到Aadd A, B; 把A+B放到A上面的過程中我直接省略了C,這隻需要稍微改一下電路以及暫存器狀態和運算器開關的順序。然後對指令進行編碼,比如定義指令格式為xxxxyyyyzzzz,其中xxxx是操作碼,yyyy是第一個操作的物件,zzzz是第二個操作的物件。比如我們把mov編碼成0001,add編碼成0010,暫存器A是0001,暫存器B是0010。然後規定電路中,mov指令的第二個操作物件是一個常數。那上述的指令就可以編譯成二進位制碼:0001 0001 01110001 0010 00010010 0001 00100010 0001 00100010 0001 0010我們把這些東西存到記憶體裡,並規定12位為一條指令,指令順序存放。如果有辦法依次讀取這些指令,然後透過複雜的電路把它翻譯成運算器的開關和暫存器的狀態轉換操作,就好了!複雜的電路不進行討論。可以增加一個程式計數器和一個指令暫存器,分別用來記錄指令對應的記憶體地址,以及指令的內容。根據程式計數器找到對應的記憶體地址,把記憶體中對應的指令讀取到指令暫存器中。這些操作都可以透過開關電路和前面說的充電供電的過程進行。讀取指令後就可以將程式計數器加1。如此反覆便能夠順序執行上面的指令了。6、更復雜的操作都是透過簡單的指令來完成的比如給定出生年份,計算出這個人是幾歲,列印到螢幕上。前面的計算不用說,列印到螢幕的過程其實也是計算和資料的傳輸(供電、充電)。把歲數,比如18,複製到一塊特定的記憶體(常常稱為視訊記憶體),並在緊跟著的記憶體中放入其顏色等資訊,顯示器讀取這塊記憶體,和顏色等資訊,透過計算或電路控制每個畫素點對應的色值,這樣就能在螢幕上看到18了。再說判斷和迴圈,其實只需要改變程式計數器就能完成。例如cmp A, 10 ;對A和10做比較je 10086 ;je=jump if equals,如果A和10相等,就跳轉到10086號指令(在程式計數器中直接填上10086對應的二進位制),否則不改變原有行為(程式計數器加1,也就是繼續執行下一條指令)7、糾正上面的一些不嚴謹的地方。其實暫存器分為8位、16位、32位和64位暫存器。指令的長度我是隨便說的,其實很多指令集的指令都是變長指令,每種指令的長度不盡相同,但長度大多都是8的整數倍。