通用寄存器:
AX,BX,CX,DX 稱作為數(shù)據(jù)寄存器:
AX (Accumulator):累加寄存器,也稱之為累加器;
BX (Base):基地址寄存器;
CX (Count):計(jì)數(shù)器寄存器;
DX (Data):數(shù)據(jù)寄存器;
SP 和 BP 又稱作為指針寄存器:
SP (Stack Pointer):堆棧指針寄存器;
BP (Base Pointer):基指針寄存器;
SI 和 DI 又稱作為變址寄存器:
SI (Source Index):源變址寄存器;
DI (Destination Index):目的變址寄存器;
控制寄存器:
IP (Instruction Pointer):指令指針寄存器;
FLAG:標(biāo)志寄存器;
段寄存器:
CS (Code Segment):代碼段寄存器;
DS (Data Segment):數(shù)據(jù)段寄存器;
SS (Stack Segment):堆棧段寄存器;
ES (Extra Segment):附加段寄存器;
數(shù)據(jù)寄存器(AX,BX,CX,DX)
除了上面 4 個(gè)數(shù)據(jù)寄存器以外,其他寄存器均不可以分為兩個(gè)獨(dú)立的 8 位寄存器 ;
BX 主要還是用于其專屬功能 – 尋址(尋址物理內(nèi)存地址),
BX 一般是用來作為偏移地址使用的。8086 CPU 中,CPU 是根據(jù) <段地址:偏移地址> 來進(jìn)行尋址操作的。<段地址:[BX]>
指針寄存器(BP,SP):?SP 寄存器實(shí)質(zhì)上必須和 SS 段寄存器一起使用
BP (Base Pointer)也就是基指針寄存器,它和其他的幾個(gè)用來進(jìn)行尋址操作所使用的寄存器(還有 BX,SI,DI)沒有太大的區(qū)別,
在 8086 CPU 中,只有 4 個(gè)寄存器可以以? […]? 的方式使用,這四個(gè)寄存器分別是 BX,SI,DI,BP。
變址寄存器(SI,DI):
首先,變址寄存器和上面介紹的指針寄存器(也就是 BP 和 SP),它們的功能其實(shí)都是用于存放某個(gè)存儲(chǔ)單元地址的偏移,
或者是用于某組存儲(chǔ)單元開始地址的偏移,即作為存儲(chǔ)器指針使用,當(dāng)然,由于變址寄存器和指針寄存器都是屬于通用寄存器,
所以它們也可以保存算術(shù)結(jié)果或者說是具有暫存數(shù)據(jù)的功能,但是因?yàn)樗鼈儾皇菙?shù)據(jù)寄存器,所以無法分割成 2 個(gè)獨(dú)立的 8 位寄存器使用,
段:
至于段的話,其實(shí)在物理內(nèi)存中是沒有段這一概念的,事實(shí)上,段的概念來自于? CPU ,因?yàn)?CPU 擁有段寄存器,既然在 CPU 中擁有了段寄存器,自然,在 CPU 中就肯定有段的概念了,其實(shí)段也就是在編程時(shí),我們將若干個(gè)地址連續(xù)的內(nèi)存單元看做是一個(gè)段,然后通過將一個(gè)段地址左移 4 位形成基地址,再通過這個(gè)基地址來定位這個(gè)段的起始地址,
然后,再通過偏移地址便可以精確定位到段中的內(nèi)存單元了,由于段的起始地址是一個(gè)段地址左移 4 位,
所以很明顯,段的起始地址肯定是 16 的倍數(shù),而且由于一個(gè)段內(nèi)部,只能通過偏移地址來定位,
而偏移地址為 16 位,所以一個(gè)段的長度也就是 216?也就是 64KB 的大小。
何為數(shù)據(jù)段呢?其實(shí)就是我們自個(gè)兒定義一段內(nèi)存(當(dāng)然段起始地址肯定是 16 的倍數(shù),并且段長度 <= 64KB),
然后我們在這個(gè)段里頭存放我們所需要使用的數(shù)據(jù),這就是數(shù)據(jù)段;
何為代碼段呢?其實(shí)也很簡單,也是我們自己在編程的時(shí)候定義一段內(nèi)存,然后這段內(nèi)存用來存放我們的代碼(也就是指令),
既然是存放的代碼,自然就稱之為代碼段;
何為棧段呢?至于棧段的話,有接觸過數(shù)據(jù)結(jié)構(gòu)的朋友應(yīng)該是很清楚棧的,而這里我們也就是在內(nèi)存中分配出一個(gè)段,
什么是棧?
通過上面在段中的介紹,棧其實(shí)就是一個(gè)段,再說白一點(diǎn),也就是一塊內(nèi)存,當(dāng)然,這塊內(nèi)存是一塊連續(xù)的內(nèi)存 。
既然棧是一個(gè)段的話,那么當(dāng)然就可以以使用段的方式來使用棧,當(dāng)然,除了像段一樣的使用棧以外,
棧還提供了其特殊的訪問方式(如果和段一模一樣的話,那還需要棧干嗎呢?),
眾所周知,棧是先進(jìn)后出類型的數(shù)據(jù)結(jié)構(gòu),在 8086? CPU 中也是如此,
可以通過?”PUSH“指令將數(shù)據(jù)壓入棧中,然后再通過?”POP“指令將棧頂?shù)脑厝〕鰜?。
CS 寄存器 和 IP 寄存器:
CS:IP 兩個(gè)寄存器指示了 CPU 當(dāng)前將要讀取的指令的地址,其中? CS? 為代碼段寄存器,而?? IP? 為指令指針寄存器 。
SS 寄存器和 SP 寄存器:
對于一個(gè)棧來說,我們只需要有棧頂?shù)亩蔚刂泛推频刂芳纯?,而對于棧頂?shù)亩蔚刂罚涫谴娣旁诙渭拇嫫? SS? 中的,而對于棧頂?shù)钠频刂?,其則是存放在? SP? 寄存器中的 。
記住,在任何時(shí)刻,SS:SP? 都是指向棧頂元素 。
標(biāo)志寄存器(FLAG):
FLAG? 中的每一個(gè)位就是用來描述狀態(tài)的,而且? FLAG? 寄存器中存儲(chǔ)的信息通常又被稱作程序狀態(tài)字(PSW) 。
CF(Carry? FLag) - 進(jìn)位標(biāo)志(第 0 位):?進(jìn)位標(biāo)志是用來反映計(jì)算時(shí)是否產(chǎn)生了由低位向高位的進(jìn)位,或者產(chǎn)生了從高位到低位的借位 。
PF(Parity? FLag) - 奇偶標(biāo)志(第 2 位):奇偶標(biāo)志是用來記錄相關(guān)指令執(zhí)行后,其結(jié)果的所有的? Bit? 位中? 1? 的個(gè)數(shù)是否為偶數(shù) 。
AF(Auxiliary? Carry? FLag) - 輔助進(jìn)位標(biāo)志(第 4 位):用來輔助進(jìn)位標(biāo)志 。
ZF(Zero? FLag) – 零標(biāo)志(第 6 位):記錄的是相關(guān)的指令執(zhí)行完畢后,其執(zhí)行的結(jié)果是否為? 0 。
SF(Sign? FLag) - 符號(hào)標(biāo)志(第 7 位):符號(hào)標(biāo)志,其記錄相關(guān)指令執(zhí)行完以后,其結(jié)果是否為負(fù)數(shù) 。
TF(Trap? FLag) - 追蹤標(biāo)志(第 8 位):追蹤標(biāo)志,主要是用于調(diào)試時(shí)使用 。
IF(Interrupt-Enable? FLag) - 中斷允許標(biāo)志(第 9 位):中斷允許標(biāo)志,其決定? CPU? 是否能夠響應(yīng)外部可屏蔽中斷請求(以后會(huì)做詳細(xì)介紹) 。
DF(Direction? FLag) - 方向標(biāo)志(第 10 位):?方向標(biāo)志,其用于在串處理指令中,用來控制每次操作后? SI? 和? DI? 是自增還是自減 。
OF(OverFlow? FLag) - 溢出標(biāo)志(第 11 位):溢出標(biāo)志,其通常記錄了有符號(hào)數(shù)運(yùn)算的結(jié)果是否發(fā)生了溢出 。
div指令為什么被除數(shù)位數(shù)要是除數(shù)的兩倍。為什么被除數(shù)位數(shù)是除數(shù)位數(shù)的2倍
因?yàn)镃PU只會(huì)做加法運(yùn)算,把其它一切的算法都轉(zhuǎn)換成加法,比如說,除數(shù) 就先轉(zhuǎn)換加法,例如36/6? 當(dāng)CPU看到這個(gè)運(yùn)算時(shí),就會(huì)這樣想,需要多少個(gè)6 相加才能得到36呢,然后CPU就從1個(gè)6 ,2個(gè)6...........這樣一種算下去,終于最后發(fā)現(xiàn)原來是6個(gè)6啊,從這我們可以看出,CPU是不斷的用除數(shù)相加,知道找到結(jié)果為止,這就出現(xiàn)問題了,如果被除數(shù)不是除數(shù)位數(shù)的2倍,再相加的過程中,就可能超出除數(shù)的位數(shù)所能表達(dá)的最大數(shù)值,從而越界,如果能保證 被除數(shù)是除數(shù)的2倍 ,這問題就能解決了。