- 程序是怎樣跑起來(lái)的
- (日)矢澤久雄
- 1268字
- 2019-01-05 02:25:49
1.2 CPU是寄存器的集合體
CPU的四個(gè)構(gòu)成部分中,程序員只需要了解寄存器即可,其余三個(gè)都不用太過(guò)關(guān)注。那么,為什么必須要了解寄存器呢?這是因?yàn)?span id="niz4hml" class="bold">程序是把寄存器作為對(duì)象來(lái)描述的。
首先我們來(lái)看一下代碼清單1-1。這是用匯編語(yǔ)言(assembly)編寫(xiě)的程序的一部分。匯編語(yǔ)言采用助記符(memonic)來(lái)編寫(xiě)程序,每一個(gè)原本是電氣信號(hào)的機(jī)器語(yǔ)言
指令都會(huì)有一個(gè)與其相應(yīng)的助記符,助記符通常為指令功能的英語(yǔ)單詞的簡(jiǎn)寫(xiě)。例如,mov和add分別是數(shù)據(jù)的存儲(chǔ)(move)和相加(addition)的簡(jiǎn)寫(xiě)。匯編語(yǔ)言和機(jī)器語(yǔ)言基本上是一一對(duì)應(yīng)的。這一點(diǎn)和C語(yǔ)言、Java語(yǔ)言等高級(jí)編程語(yǔ)言
有很大不同,這也是我們使用匯編語(yǔ)言來(lái)說(shuō)明CPU運(yùn)行的原因。通常我們將匯編語(yǔ)言編寫(xiě)的程序轉(zhuǎn)化成機(jī)器語(yǔ)言的過(guò)程稱為匯編;反之,機(jī)器語(yǔ)言程序轉(zhuǎn)化成匯編語(yǔ)言程序的過(guò)程則稱為反匯編。
代碼清單1-1 匯編語(yǔ)言編寫(xiě)的程序示例
mov eax, dword ptr [ebp-8] …把數(shù)值從內(nèi)存復(fù)制到eax add eax, dword ptr [ebp-0Ch] …eax的數(shù)值和內(nèi)存的數(shù)值相加 mov dword ptr [ebp-4], eax …把eax的數(shù)值(上一步的相加結(jié)果)存儲(chǔ)在內(nèi)存中
通過(guò)閱讀匯編語(yǔ)言編寫(xiě)的代碼,能夠了解轉(zhuǎn)化成機(jī)器語(yǔ)言的程序的運(yùn)行情況。從代碼清單1-1的匯編語(yǔ)言程序示例中也可以看出,機(jī)器語(yǔ)言級(jí)別的程序是通過(guò)寄存器來(lái)處理的。也就是說(shuō),在程序員看來(lái)“CPU是寄存器的集合體”。至于控制器、運(yùn)算器和時(shí)鐘,程序員只需要知道CPU中還有這幾部分就足夠了。
代碼清單1-1中,eax和ebp表示的都是寄存器。通過(guò)閱讀剛才的示例代碼,想必大家對(duì)程序使用寄存器來(lái)實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ)和加法運(yùn)算這一情況應(yīng)該有所了解了。匯編語(yǔ)言是80386以上的CPU所使用的語(yǔ)言。eax和ebp是CPU內(nèi)部的寄存器的名稱。內(nèi)存的存儲(chǔ)場(chǎng)所通過(guò)地址編號(hào)來(lái)區(qū)分,而寄存器的種類則通過(guò)名字來(lái)區(qū)分。
上文可能有些難以理解,不過(guò)不用擔(dān)心,因?yàn)槲覀儾⒉灰蟠蠹冶仨氄莆誄PU的所有寄存器種類和匯編語(yǔ)言,大家只需對(duì)CPU是怎么處理程序的有一個(gè)大致印象即可。也就是說(shuō),使用高級(jí)語(yǔ)言編寫(xiě)的程序會(huì)在編譯后轉(zhuǎn)化成機(jī)器語(yǔ)言,然后再通過(guò)CPU內(nèi)部的寄存器來(lái)處理。例如,a=1+2這樣的高級(jí)語(yǔ)言的代碼程序在轉(zhuǎn)化成機(jī)器語(yǔ)言后,就是利用寄存器來(lái)進(jìn)行相加運(yùn)算和存儲(chǔ)處理的。
不同類型的CPU,其內(nèi)部寄存器的數(shù)量、種類以及寄存器存儲(chǔ)的數(shù)值范圍都是不同的。不過(guò),根據(jù)功能的不同,我們可以將寄存器大致劃分為八類,如表1-1所示。可以看出,寄存器中存儲(chǔ)的內(nèi)容既可以是指令也可以是數(shù)據(jù)。其中,數(shù)據(jù)分為“用于運(yùn)算的數(shù)值”和“表示內(nèi)存地址的數(shù)值”兩種。數(shù)據(jù)種類不同,存儲(chǔ)該數(shù)值的寄存器也不同。CPU中每個(gè)寄存器的功能都是不同的。用于運(yùn)算的數(shù)值放在累加寄存器中存儲(chǔ),表示內(nèi)存地址的數(shù)值則放在基址寄存器和變址寄存器中存儲(chǔ)。代碼清單1-1的程序中用到的eax和ebp分別是累加寄存器和基址寄存器。
表1-1 寄存器的主要種類和功能

對(duì)程序員來(lái)說(shuō),CPU是什么呢?如圖1-3所示,CPU是具有各種功能的寄存器的集合體。其中,程序計(jì)數(shù)器、累加寄存器、標(biāo)志寄存器、指令寄存器和棧寄存器都只有一個(gè),其他的寄存器一般有多個(gè)。程序計(jì)數(shù)器和標(biāo)志寄存器比較特殊,這一點(diǎn)在后面的章節(jié)中會(huì)詳細(xì)說(shuō)明。另外,存儲(chǔ)指令的指令寄存器等寄存器,由于不需要程序員做多關(guān)注,因此圖1-3中沒(méi)有提到。

圖1-3 程序員眼中的CPU(CPU是寄存器的集合體)
- Mastering Adobe Captivate 2017(Fourth Edition)
- MySQL數(shù)據(jù)庫(kù)應(yīng)用與管理 第2版
- Instant Typeahead.js
- MATLAB定量決策五大類問(wèn)題
- HTML5 and CSS3 Transition,Transformation,and Animation
- Spring Boot Cookbook
- Android開(kāi)發(fā):從0到1 (清華開(kāi)發(fā)者書(shū)庫(kù))
- Unity 2017 Mobile Game Development
- 用戶體驗(yàn)可視化指南
- Python開(kāi)發(fā)基礎(chǔ)
- Node.js區(qū)塊鏈開(kāi)發(fā)
- Akka入門(mén)與實(shí)踐
- 基于GPU加速的計(jì)算機(jī)視覺(jué)編程:使用OpenCV和CUDA實(shí)時(shí)處理復(fù)雜圖像數(shù)據(jù)
- 高性能PHP 7
- Python數(shù)據(jù)預(yù)處理技術(shù)與實(shí)踐