第二章 認(rèn)識(shí)處理器
中央處理器(CPU)在微機(jī)系統(tǒng)處于“領(lǐng)導(dǎo)核心”的地位。匯編語(yǔ)言被編譯成機(jī)器語(yǔ)言之后,將由處理器來(lái)執(zhí)行,。那么,,首先讓我們來(lái)了解一下處理器的主要作用,這將幫助你更好地駕馭它。
典型的處理器的主要任務(wù)包括從內(nèi)存中獲取機(jī)器語(yǔ)言指令,譯碼,執(zhí)行 根據(jù)指令代碼管理它自己的寄存器 根據(jù)指令或自己的的需要修改內(nèi)存的內(nèi)容響應(yīng)其他硬件的中斷請(qǐng)求.
一般說(shuō)來(lái),,處理器擁有對(duì)整個(gè)系統(tǒng)的所有總線(xiàn)的控制權(quán)。對(duì)于Intel平臺(tái)而言,,處理器擁有對(duì)數(shù)據(jù),、內(nèi)存和控制總線(xiàn)的控制權(quán),根據(jù)指令控制整個(gè)計(jì)算機(jī)的運(yùn)行,。在以后的章節(jié)中,,我們還將討論系統(tǒng)中同時(shí)存在多個(gè)處理器的情況。
處理器中有一些寄存器,,這些寄存器可以保存特定長(zhǎng)度的數(shù)據(jù),。某些寄存器中保存的數(shù)據(jù)對(duì)于系統(tǒng)的運(yùn)行有特殊的意義。
新的處理器往往擁有更多,、具有更大字長(zhǎng)的寄存器,,提供更靈活的取指、尋址方式,。
寄存器
如前所述,,處理器中有一些可以保存數(shù)據(jù)的地方被稱(chēng)作寄存器。
寄存器可以被裝入數(shù)據(jù),,你也可以在不同的寄存器之間移動(dòng)這些數(shù)據(jù),,或者做類(lèi)似的事情?;旧?,像四則運(yùn)算、位運(yùn)算等這些計(jì)算操作,都主要是針對(duì)寄存器進(jìn)行的,。
首先讓我來(lái)介紹一下80386上最常用的4個(gè)通用寄存器。先瞧瞧下面的圖形,,試著理解一下:
上圖中,,數(shù)字表示的是位。我們可以看出,,EAX是一個(gè)32-bit寄存器,。同時(shí),它的低16-bit又可以通過(guò)AX這個(gè)名字來(lái)訪(fǎng)問(wèn),;AX又被分為高,、低8bit兩部分,分別由AH和AL來(lái)表示,。
對(duì)于EAX,、AX、AH,、AL的改變同時(shí)也會(huì)影響與被修改的那些寄存器的值,。從而事實(shí)上只存在一個(gè)32-bit的寄存器EAX,而它可以通過(guò)4種不同的途徑訪(fǎng)問(wèn),。
也許通過(guò)名字能夠更容易地理解這些寄存器之間的關(guān)系,。EAX中的E的意思是“擴(kuò)展的”,整個(gè)EAX的意思是擴(kuò)展的AX,。X的意思Intel沒(méi)有明示,,我個(gè)人認(rèn)為表示它是一個(gè)可變的量 。而AH,、AL中的H和L分別代表高和低 ,。
為什么要這么做呢?主要由于歷史原因,。早期的計(jì)算機(jī)是8位的,,8086是第一個(gè)16位處理器,其通用寄存器的名字是AX,,BX等等,;80386是Intel推出的第一款I(lǐng)A-32系列處理器,所有的寄存器都被擴(kuò)充為32位,。為了能夠兼容以前的16位應(yīng)用程序,,80386不能將這些寄存器依舊命名為AX、BX,,并且簡(jiǎn)單地將他們擴(kuò)充為32位——這將增加處理器在處理指令方面的成本,。
Intel微處理器的寄存器列表(在本章先只介紹80386的寄存器,MMX寄存器以及其他新一代處理器的新寄存器將在以后的章節(jié)介紹)
通用寄存器
下面介紹通用寄存器及其習(xí)慣用法。顧名思義,,通用寄存器是那些你可以根據(jù)自己的意愿使用的寄存器,,修改他們的值通常不會(huì)對(duì)計(jì)算機(jī)的運(yùn)行造成很大的影響。通用寄存器最多的用途是計(jì)算,。
EAX
32-bit寬
通用寄存器,。相對(duì)其他寄存器,在進(jìn)行運(yùn)算方面比較常用,。在保護(hù)模式中,,也可以作為內(nèi)存偏移指針(此時(shí),DS作為段 寄存器或選擇器)
EBX
32-bit寬
通用寄存器,。通常作為內(nèi)存偏移指針使用(相對(duì)于EAX,、ECX、EDX),,DS是默認(rèn)的段寄存器或選擇器,。在保護(hù)模式中,同樣可以起這個(gè)作用,。
ECX
32-bit寬
通用寄存器,。通常用于特定指令的計(jì)數(shù)。在保護(hù)模式中,,也可以作為內(nèi)存偏移指針(此時(shí),,DS作為 寄存器或段選擇器)。
EDX
32-bit寬
通用寄存器,。在某些運(yùn)算中作為EAX的溢出寄存器(例如乘,、除)。在保護(hù)模式中,,也可以作為內(nèi)存偏移指針(此時(shí),,DS作為段 寄存器或選擇器)。
上述寄存器同EAX一樣包括對(duì)應(yīng)的16-bit和8-bit分組,。
用作內(nèi)存指針的特殊寄存器
ESI
32-bit寬
通常在內(nèi)存操作指令中作為“源地址指針”使用,。當(dāng)然,ESI可以被裝入任意的數(shù)值,,但通常沒(méi)有人把它當(dāng)作通用寄存器來(lái)用,。DS是默認(rèn)段寄存器或選擇器。
EDI
32-bit寬
通常在內(nèi)存操作指令中作為“目的地址指針”使用,。當(dāng)然,,EDI也可以被裝入任意的數(shù)值,但通常沒(méi)有人把它當(dāng)作通用寄存器來(lái)用,。DS是默認(rèn)段寄存器或選擇器,。
EBP
32-bit寬
這也是一個(gè)作為指針的寄存器,。通常,它被高級(jí)語(yǔ)言編譯器用以建造‘堆棧幀’來(lái)保存函數(shù)或過(guò)程的局部變量,,不過(guò),,還是那句話(huà),你可以在其中保存你希望的任何數(shù)據(jù),。SS是它的默認(rèn)段寄存器或選擇器,。
注意,這三個(gè)寄存器沒(méi)有對(duì)應(yīng)的8-bit分組,。換言之,你可以通過(guò)SI,、DI,、BP作為別名訪(fǎng)問(wèn)他們的低16位,卻沒(méi)有辦法直接訪(fǎng)問(wèn)他們的低8位,。
段寄存器和選擇器
實(shí)模式下的段寄存器到保護(hù)模式下?lián)u身一變就成了選擇器,。不同的是,實(shí)模式下的“段寄存器”是16-bit的,,而保護(hù)模式下的選擇器是32-bit的,。
CS 代碼段,或代碼選擇器,。同IP寄存器(稍后介紹)一同指向當(dāng)前正在執(zhí)行的那個(gè)地址,。處理器執(zhí)行時(shí)從這個(gè)寄存器指向的段(實(shí)模式)或內(nèi)存(保護(hù)模式)中獲取指令。除了跳轉(zhuǎn)或其他分支指令之外,,你無(wú)法修改這個(gè)寄存器的內(nèi)容,。
DS 數(shù)據(jù)段,或數(shù)據(jù)選擇器,。這個(gè)寄存器的低16 bit連同ESI一同指向的指令將要處理的內(nèi)存,。同時(shí),所有的內(nèi)存操作指令 默認(rèn)情況下都用它指定操作段(實(shí)模式)或內(nèi)存(作為選擇器,,在保護(hù)模式,。這個(gè)寄存器可以被裝入任意數(shù)值,然而在這么做的時(shí)候需要小心一些,。方法是,,首先把數(shù)據(jù)送給AX,然后再把它從AX傳送給DS(當(dāng)然,,也可以通過(guò)堆棧來(lái)做).
ES 附加段,,或附加選擇器。這個(gè)寄存器的低16 bit連同EDI一同指向的指令將要處理的內(nèi)存,。同樣的,,這個(gè)寄存器可以被裝入任意數(shù)值,方法和DS類(lèi)似。
FS F段或F選擇器(推測(cè)F可能是Free?),??梢杂眠@個(gè)寄存器作為默認(rèn)段寄存器或選擇器的一個(gè)替代品。它可以被裝入任何數(shù)值,,方法和DS類(lèi)似,。
GS G段或G選擇器(G的意義和F一樣,沒(méi)有在Intel的文檔中解釋),。它和FS幾乎完全一樣,。
SS 堆棧段或堆棧選擇器。這個(gè)寄存器的低16 bit連同ESP一同指向下一次堆棧操作(push和pop)所要使用的堆棧地址,。這個(gè)寄存器也可以被裝入任意數(shù)值,,你可以通過(guò)入棧和出棧操作來(lái)給他賦值,不過(guò)由于堆棧對(duì)于很多操作有很重要的意義,,因此,,不正確的修改有可能造成對(duì)堆棧的破壞。
* 注意 一定不要在初學(xué)匯編的階段把這些寄存器弄混,。他們非常重要,,而一旦你掌握了他們,你就可以對(duì)他們做任意的操作了,。段寄存器,,或選擇器,在沒(méi)有指定的情況下都是使用默認(rèn)的那個(gè),。這句話(huà)在現(xiàn)在看來(lái)可能有點(diǎn)稀里糊涂,,不過(guò)你很快就會(huì)在后面知道如何去做。
特殊寄存器(指向到特定段或內(nèi)存的偏移量):
EIP 這個(gè)寄存器非常的重要,。這是一個(gè)32位寬的寄存器 ,,同CS一同指向即將執(zhí)行的那條指令的地址。不能夠直接修改這個(gè)寄存器的值,,修改它的唯一方法是跳轉(zhuǎn)或分支指令,。(CS是默認(rèn)的段或選擇器)
ESP 這個(gè)32位寄存器指向堆棧中即將被操作的那個(gè)地址。盡管可以修改它的值,,然而并不提倡這樣做,,因?yàn)槿绻悴皇欠浅C靼鬃约涸谧鍪裁矗敲茨憧赡茉斐啥褩5钠茐?。?duì)于絕大多數(shù)情況而言,,這對(duì)程序是致命的。(SS是默認(rèn)的段或選擇器)
IP: Instruction Pointer, 指令指針
SP: Stack Pointer, 堆棧指針
好了,,上面是最基本的寄存器,。下面是一些其他的寄存器,,你甚至可能沒(méi)有聽(tīng)說(shuō)過(guò)它們。(都是32位寬):
CR0, CR2, CR3(控制寄存器),。舉一個(gè)例子,,CR0的作用是切換實(shí)模式和保護(hù)模式。
還有其他一些寄存器,,D0, D1, D2, D3, D6和D7(調(diào)試寄存器),。他們可以作為調(diào)試器的硬件支持來(lái)設(shè)置條件斷點(diǎn)。
TR3, TR4, TR5, TR6 和 TR? 寄存器(測(cè)試寄存器)用于某些條件測(cè)試,。
最后我們要說(shuō)的是一個(gè)在程序設(shè)計(jì)中起著非常關(guān)鍵的作用的寄存器:標(biāo)志寄存器,。
本節(jié)中部份表格來(lái)自David Jurgens的HelpPC 2.10快速參考手冊(cè)。在此謹(jǐn)表謝意,。