官术网_书友最值得收藏!

2.4.1 x86中的寄存器

如前所述,寄存器是CPU中的一種特殊名稱和位置,允許進(jìn)行非常快速的操作。所有的寄存器可以被分為兩種不同的類別。

? 通用寄存器(General-Purpose Register,GPR):用于一般數(shù)據(jù)、地址等的存儲,并且可以直接操作。

? 特殊寄存器(Special-Purpose Register,SPR):用于存儲程序狀態(tài)。

x86架構(gòu)定義了許多寄存器,如圖2.5所示。然而,其中許多寄存器被CPU自身所保留,我們只需要了解其中一部分即可。

圖2.5 x86寄存器

來源:Liam McSherry/Wikimedia Commons/CC BY-SA 3.0.

1.通用寄存器

通用寄存器在應(yīng)用程序中承擔(dān)了大部分重要的工作,負(fù)責(zé)存儲從內(nèi)存中獲取的數(shù)據(jù),進(jìn)行數(shù)據(jù)處理,并存儲計(jì)算結(jié)果。下面給出了x86中最重要的通用寄存器,每個(gè)通用寄存器都可以存儲32位的數(shù)據(jù)。每個(gè)累加器都有一個(gè)傳統(tǒng)角色并且以角色命名。但是,通用寄存器可以被用于任何目的,你可以在任何寄存器中放置計(jì)數(shù)器,而不僅僅是在ecx寄存器中放置。

eax

eax被稱為“累加器”寄存器,常被用來保存算術(shù)運(yùn)算的結(jié)果。例如,程序可能會執(zhí)行計(jì)算eax+=ebx。

ebx

ebx是“基址”寄存器。它通常被用來存儲用于保存變量的內(nèi)存塊的基址。例如,表達(dá)式[ebx+5]可以被用來訪問數(shù)組的第五個(gè)元素。

ecx

ecx是“計(jì)數(shù)器”寄存器,傳統(tǒng)上用于計(jì)數(shù)。例如,ecx可能被用來跟蹤循環(huán)的當(dāng)前迭代。在命令for(i=0; i<10; i++)中,變量i可能會被存儲在ecx寄存器中。

edx

edx是“數(shù)據(jù)”寄存器,常被用來存儲數(shù)據(jù)。例如,應(yīng)用程序可能會包含指令sub edx, 7,這條指令的功能是把edx寄存器的值減7。

esi

esi是“源索引”寄存器(源變址寄存器)。傳統(tǒng)上,它用于存儲源數(shù)組中的索引。例如,在指令array[i]=array[k]中,k的值很可能被存儲在esi中。

edi

edi是“目標(biāo)索引”寄存器(變址寄存器)。它用于存儲目標(biāo)數(shù)組的索引。例如,在指令array[i]=array[k]中,i的值很可能被存儲在edi中。

ebp

ebp是“基址指針”寄存器。它的功能是存儲當(dāng)前棧幀的基址。程序棧和棧幀的概念將在后續(xù)章節(jié)進(jìn)行探討。

esp

esp是“棧指針”寄存器。它儲存了當(dāng)前棧幀頂部的地址。

2.特殊寄存器

特殊寄存器用于特定任務(wù),并且不允許直接修改。例如,指令mov eip, 1使用了一個(gè)特殊寄存器,不能進(jìn)行匯編,而使用通用寄存器的指令mov eax, 1卻可以進(jìn)行匯編。

eip

eip是“指令指針”寄存器,用于存儲下一條要執(zhí)行的指令的地址。

eflags

eflags是“標(biāo)志”寄存器。它存儲標(biāo)志,這些標(biāo)志的值為真或假,保存著系統(tǒng)狀態(tài)和先前執(zhí)行指令的結(jié)果的信息。

提示:通用寄存器可以讀取和寫入,但是特殊寄存器只能讀取,不能寫入。

主站蜘蛛池模板: 洞口县| 两当县| 湛江市| 遵义市| 乐陵市| 隆安县| 沧源| 齐河县| 泸水县| 禄劝| 霍州市| 红原县| 拉萨市| 绥德县| 肥乡县| 博野县| 临泉县| 万载县| 洮南市| 东丰县| 辽宁省| 梓潼县| 凌源市| 衡阳市| 临澧县| 隆尧县| 洮南市| 循化| 泸州市| 抚宁县| 扶余县| 涞水县| 务川| 芒康县| 柘城县| 周口市| 云霄县| 图们市| 江阴市| 沅江市| 岑巩县|