一文看懂8086CPU寄存器的特點(diǎn)和作用
8086數(shù)據(jù)寄存器介紹
通用寄存器
在8086CPU中,通用寄存器有8個(gè),分別是AX,BX,CX,DX,SP,BP,SI,DI
下面介紹這幾個(gè)通用寄存器:
數(shù)據(jù)寄存器(AX,BX,CX,DX):
數(shù)據(jù)寄存器有AX,BX,CX,DX四個(gè)組成,
由于在8086之前的CPU為8位CPU,所以為了兼容以前的8位程序,在8086CPU中,每一個(gè)數(shù)據(jù)寄存器都可以當(dāng)做兩個(gè)單獨(dú)的寄存器來使用,由此,每一個(gè)16位寄存器就可以當(dāng)做2個(gè)獨(dú)立的8位寄存器來使用了。
AX寄存器可以分為兩個(gè)獨(dú)立的8位的AH和AL寄存器;
BX寄存器可以分為兩個(gè)獨(dú)立的8位的BH和BL寄存器;
CX寄存器可以分為兩個(gè)獨(dú)立的8位的CH和CL寄存器;
DX寄存器可以分為兩個(gè)獨(dú)立的8位的DH和DL寄存器;
除了上面4個(gè)數(shù)據(jù)寄存器以外,其他寄存器均不可以分為兩個(gè)獨(dú)立的8位寄存器;
注意在上面標(biāo)志中的“獨(dú)立”二字,這兩個(gè)字表明AH和AL作為8位寄存器使用時(shí),可以看做它們是互不相關(guān)的,也就是看做兩個(gè)完全沒有聯(lián)系的寄存器X和Y即可,比如指令MOVAH,12H,CPU在執(zhí)行時(shí)根本就不會(huì)知道AL中是什么鬼東西,因?yàn)樗徽J(rèn)識(shí)AH。
下面給出一幅16位數(shù)據(jù)寄存器的結(jié)構(gòu)圖:
表示16位寄存器AX可以表示成兩個(gè)8位寄存器,
其中AH表示高位的8位寄存器,AL表示低位的8位寄存器。
AX寄存器:
如上所說,AX的另外一個(gè)名字叫做累加寄存器或者簡稱為累加器,其可以分為2個(gè)獨(dú)立的8位寄存器AH和AL;
在寫匯編程序時(shí),AX寄存器可以說是使用率最高的寄存器(不過,總共才那么14個(gè)寄存器,哪一個(gè)不經(jīng)常使用咯?),既然AX是數(shù)據(jù)寄存器的話,那么理所當(dāng)然,其可以用來存放普通的數(shù)據(jù),由于其是16位寄存器,自然也就可以存放16位數(shù)據(jù),但是因?yàn)槠溆挚梢苑譃?個(gè)獨(dú)立的8位寄存器AH和AL,所以,在AH和AL中又可以獨(dú)立的存放2個(gè)8位的數(shù)據(jù),可以有以下代碼(即將AX當(dāng)做普通的寄存器使用,即可以用來暫存數(shù)據(jù)):
MOVAX,1234H;向寄存器AX傳入數(shù)據(jù)1234H
MOVAH,56H;向寄存器AX的高8位寄存器AH中傳入數(shù)據(jù)56H
MOVAL,78H;向寄存器AX的低8位寄存器AL中傳入數(shù)據(jù)78H
3條語句的執(zhí)行過程如下:
而既然AX又被稱作為累加器,自然其還有一點(diǎn)點(diǎn)特殊的地方的:
AX寄存器還具有的特殊用途是在使用DIV和MUL指令時(shí)使用,DIV在8086CPU中是除法指令,而在使用除法的時(shí)候有兩種情況,即除數(shù)可以是8位或者是16位的,而且除數(shù)可以存放在寄存器中或者是內(nèi)存單元中,而至于被除數(shù)的話,自然,應(yīng)該由AX來代替了,當(dāng)除數(shù)是8位時(shí),被除數(shù)一定會(huì)是16位的,并且默認(rèn)是放在AX寄存器中,而當(dāng)除數(shù)是16位時(shí),被除數(shù)一定是32位的,因?yàn)锳X是16位寄存器,自然,放不下32位的被除數(shù),所以,在這里還需要使用另一個(gè)16位寄存器DX,其中DX存放32位的被除數(shù)的高16位,而AX則存放32位的被除數(shù)的低16位,同時(shí),AX的作用還不僅僅是用來保存被除數(shù)的,當(dāng)除法指令執(zhí)行完成以后,如果除數(shù)是8位的,則在AL中會(huì)保存此次除法操作的商,而在AH中則會(huì)保存此次除法操作的余數(shù),當(dāng)然,如果除數(shù)是16位的話,則AX中會(huì)保存本次除法操作的商,而DX則保存本次除法操作的余數(shù)。
上面介紹的是AX寄存器在除法操作中的應(yīng)用,下面還需要介紹一下AX在乘法操作中的應(yīng)用,
當(dāng)使用MUL做乘法運(yùn)算時(shí),兩個(gè)相乘的數(shù)要么都是8位,要么都是16位,如果兩個(gè)相乘的數(shù)都是8位的話,則一個(gè)默認(rèn)是放在AL中,而另一個(gè)8位的乘數(shù)則位于其他的寄存器或者說是內(nèi)存字節(jié)單元中,而如果兩個(gè)相乘的數(shù)都是16位的話,則一個(gè)默認(rèn)存放在AX中,另一個(gè)16位的則是位于16的寄存器中或者是某個(gè)內(nèi)存字單元中。
同時(shí),當(dāng)MUL指令執(zhí)行完畢后,如果是8位的乘法運(yùn)算,則默認(rèn)乘法運(yùn)算的結(jié)果是保存在AX中,而如果是16位的乘法運(yùn)算的話,則默認(rèn)乘法運(yùn)算的結(jié)果有32位,其中,高位默認(rèn)保存在DX中,而低位則默認(rèn)保存在AX中。
AX寄存器在DIV指令中的使用:
MOVDX,0H;設(shè)置32位被除數(shù)的高16位為0H
MOVAX,8H;設(shè)置32位被除數(shù)的低16位為8H
MOVBX,2H;設(shè)置16位除數(shù)為2H
DIVBX;執(zhí)行計(jì)算
4條語句的執(zhí)行過程如下:
AX寄存器在MUL指令中的使用:
MOVAX,800H;設(shè)置16位乘數(shù)為800H
MOVBX,100H;設(shè)置16位乘數(shù)為100H
MOVDX,0H;清空用來保存乘法結(jié)果的高16位
MULBX;執(zhí)行計(jì)算
BX寄存器:
首先可以明確的是,BX作為數(shù)據(jù)寄存器,表明其是可以暫存一般的數(shù)據(jù)的,即在某種程度上,它和AX可以暫存一般性數(shù)據(jù)的功能是一樣的,其同樣為了適應(yīng)以前的8位CPU,而可以將BX當(dāng)做兩個(gè)獨(dú)立的8位寄存器使用,即有BH和BL,除了暫存一般性數(shù)據(jù)的功能外,BX作為通用寄存器的一種,BX主要還是用于其專屬功能–尋址(尋址物理內(nèi)存地址)上,BX寄存器中存放的數(shù)據(jù)一般是用來作為偏移地址使用的。
在8086CPU中,CPU是根據(jù)《段地址:偏移地址》來進(jìn)行尋址操作的,而BX中存放的數(shù)據(jù)表示的是偏移地址的話,自然,便可以通過《段地址:[BX]》的方式來完成尋址操作了。
為了介紹BX在尋址當(dāng)中的作用,下面我給出一副示意圖:
上面的示意圖表示:可以令BX=2,然后通過DS:[BX]來訪問到內(nèi)存中段地址為DS,且偏移量為2的內(nèi)存單元了。
上面介紹的這種尋址方式是BX在尋址中最最簡單的應(yīng)用了,而對(duì)于稍微復(fù)雜的尋址方式,
還可以依賴于SI,DI,BP等寄存器來一起完成。
BX寄存器在尋址中的使用:
MOVBX,5H
MOVAH,11H
MOVAH,[BX];設(shè)置AX的值為偏移地址為BX中的值時(shí)所代表的內(nèi)存單元
3條語句的執(zhí)行過程如下:
從上圖可以看出,在偏移地址為5時(shí)的內(nèi)存單元中的數(shù)據(jù)位BBH,
而從這幅圖上面就可以看出,確實(shí)通過[BX]找到了偏移地址為5處的內(nèi)存單元,并且將內(nèi)存單元移入了AH中。
CX寄存器:
CX寄存器作為數(shù)據(jù)寄存器的一種呢,其同樣具有和AX,BX一樣的特點(diǎn),即可以暫存一般性的數(shù)據(jù),同時(shí)還可以將其當(dāng)做兩個(gè)獨(dú)立的8位寄存器使用,即有CH和CL兩個(gè)8位寄存器,當(dāng)然,CX也是有其專門的用途的,CX中的C被翻譯為Counting也就是計(jì)數(shù)器的功能,當(dāng)在匯編指令中使用循環(huán)LOOP指令時(shí),可以通過CX來指定需要循環(huán)的次數(shù),而CPU在每一次執(zhí)行LOOP指令的時(shí)候,都會(huì)做兩件事:
一件就是令CX=CX–1,即令CX計(jì)數(shù)器自動(dòng)減去1;
還有一件就是判斷CX中的值,如果CX中的值為0則會(huì)跳出循環(huán),而繼續(xù)執(zhí)行循環(huán)下面的指令,當(dāng)然如果CX中的值不為0,則會(huì)繼續(xù)執(zhí)行循環(huán)中所指定的指令。
CX寄存器在循環(huán)中的使用(輸出5個(gè)白底藍(lán)字的A):
MOVAX,0B800H
MOVDS,AX;使用80x25彩色字符模式,內(nèi)存地址0xB8000-0xBFFFFF
MOVBX,0;從0xB8000開始
MOVCX,5H;循環(huán)5次
MOVDX,41H;A的16進(jìn)制為41H
MOVAX,01110001B;顯示白底藍(lán)字
s:MOV[BX],DX;顯示ASCII字符
ADDBX,1
MOV[BX],AX;設(shè)置字符顯示屬性
ADDBX,1
LOOPs
語句的執(zhí)行過程如下:
DX寄存器:
DX寄存器作為數(shù)據(jù)寄存器的一種,同樣具有和AX,BX,CX一樣的特點(diǎn),即可以暫存一般性的數(shù)據(jù),同時(shí)還可以將其當(dāng)做兩個(gè)獨(dú)立的8位寄存器使用,極有DH和DL,同時(shí),DX作為一個(gè)通用寄存器的話,關(guān)于DX在其他方面的用途,當(dāng)在使用DIV指令進(jìn)行除法運(yùn)算時(shí),如果除數(shù)為16位時(shí),被除數(shù)將會(huì)是32位,而被除數(shù)的高16位就是存放在DX中,而且執(zhí)行完DIV指令后,本次除法運(yùn)算所產(chǎn)生的余數(shù)將會(huì)保存在DX中,同時(shí),在執(zhí)行MUL指令時(shí),如果兩個(gè)相乘的數(shù)都是16位的話,那么相乘后產(chǎn)生的結(jié)果顯然需要32位來保存,而這32位的結(jié)果的高16位就是存放在DX寄存器中。
DX寄存器在DIV指令中的使用(即2293812/256=8960余數(shù)為52):
MOVDX,0023H;32位被除數(shù)的高16位
MOVAX,0034H;32位被除數(shù)的低16位
MOVBX,100H;16的除數(shù)
DIVBX
語句的執(zhí)行過程如下:
可以看到在語句結(jié)束以后,AX=2300H即十進(jìn)制的8960,而DX=34H即十進(jìn)制的52和我們的結(jié)果是一致的。
8086CPU各類寄存器特點(diǎn)及用途
8086有14個(gè)16位寄存器,這14個(gè)寄存器按其用途可分為通用寄存器、指令指針、標(biāo)志寄存器和段寄存器等4類。
1、通用寄存器
通用寄存器有8個(gè),又可以分成2組,一組是數(shù)據(jù)寄存器(4個(gè)),另一組是指針寄存器及變址寄存器(4個(gè))。
數(shù)據(jù)寄存器分為:
AH&AL=AX(accumulator):累加寄存器,常用于運(yùn)算;在乘除等指令中指定用來存放操作數(shù),另外,所有的I/O指令都使用這一寄存器與外界設(shè)備傳送數(shù)據(jù)。
BH&BL=BX(base):基址寄存器,常用于地址索引;
CH&CL=CX(count):計(jì)數(shù)寄存器,常用于計(jì)數(shù);常用于保存計(jì)算值,如在移位指令,循環(huán)(loop)和串處理指令中用作隱含的計(jì)數(shù)器。
DH&DL=DX(data):數(shù)據(jù)寄存器,常用于數(shù)據(jù)傳遞。他們的特點(diǎn)是,這4個(gè)16位的寄存器可以分為高8位:AH,BH,CH,DH.以及低八位:AL,BL,CL,DL。這2組8位寄存器可以分別尋址,并單獨(dú)使用。
另一組是指針寄存器和變址寄存器,包括:
SP(StackPointer):堆棧指針,與SS配合使用,可指向目前的堆棧位置;
BP(BasePointer):基址指針寄存器,可用作SS的一個(gè)相對(duì)基址位置;
SI(SourceIndex):源變址寄存器可用來存放相對(duì)于DS段之源變址指針;
DI(DestinationIndex):目的變址寄存器,可用來存放相對(duì)于ES段之目的變址指針。
這4個(gè)16位寄存器只能按16位進(jìn)行存取操作,主要用來形成操作數(shù)的地址,用于堆棧操作和變址運(yùn)算中計(jì)算操作數(shù)的有效地址。
2、指令指針I(yè)P(InstructionPointer)
指令指針I(yè)P是一個(gè)16位專用寄存器,它指向當(dāng)前需要取出的指令字節(jié),當(dāng)BIU從內(nèi)存中取出一個(gè)指令字節(jié)后,IP就自動(dòng)加1,指向下一個(gè)指令字節(jié)。注意,IP指向的是指令地址的段內(nèi)地址偏移量,又稱偏移地址(OffsetAddress)或有效地址(EA,EffectiveAddress)。
3、標(biāo)志寄存器FR(FlagRegister)
8086有一個(gè)18位的標(biāo)志寄存器FR,在FR中有意義的有9位,其中6位是狀態(tài)位,3位是控制位。
OF:溢出標(biāo)志位OF用于反映有符號(hào)數(shù)加減運(yùn)算所得結(jié)果是否溢出。如果運(yùn)算結(jié)果超過當(dāng)前運(yùn)算位數(shù)所能表示的范圍,則稱為溢出,OF的值被置為1,否則,OF的值被清為0。
DF:方向標(biāo)志DF位用來決定在串操作指令執(zhí)行時(shí)有關(guān)指針寄存器發(fā)生調(diào)整的方向。
IF:中斷允許標(biāo)志IF位用來決定CPU是否響應(yīng)CPU外部的可屏蔽中斷發(fā)出的中斷請(qǐng)求。但不管該標(biāo)志為何值,CPU都必須響應(yīng)CPU外部的不可屏蔽中斷所發(fā)出的中斷請(qǐng)求,以及CPU內(nèi)部產(chǎn)生的中斷請(qǐng)求。具體規(guī)定如下:
?。?)、當(dāng)IF=1時(shí),CPU可以響應(yīng)CPU外部的可屏蔽中斷發(fā)出的中斷請(qǐng)求;
?。?)、當(dāng)IF=0時(shí),CPU不響應(yīng)CPU外部的可屏蔽中斷發(fā)出的中斷請(qǐng)求。
TF:跟蹤標(biāo)志TF。該標(biāo)志可用于程序調(diào)試。TF標(biāo)志沒有專門的指令來設(shè)置或清楚。
?。?)如果TF=1,則CPU處于單步執(zhí)行指令的工作方式,此時(shí)每執(zhí)行完一條指令,就顯示CPU內(nèi)各個(gè)寄存器的當(dāng)前值及CPU將要執(zhí)行的下一條指令。
(2)如果TF=0,則處于連續(xù)工作模式。
SF:符號(hào)標(biāo)志SF用來反映運(yùn)算結(jié)果的符號(hào)位,它與運(yùn)算結(jié)果的最高位相同。在微機(jī)系統(tǒng)中,有符號(hào)數(shù)采用補(bǔ)碼表示法,所以,SF也就反映運(yùn)算結(jié)果的正負(fù)號(hào)。運(yùn)算結(jié)果為正數(shù)時(shí),SF的值為0,否則其值為1。
ZF:零標(biāo)志ZF用來反映運(yùn)算結(jié)果是否為0。如果運(yùn)算結(jié)果為0,則其值為1,否則其值為0。在判斷運(yùn)算結(jié)果是否為0時(shí),可使用此標(biāo)志位。
AF:下列情況下,輔助進(jìn)位標(biāo)志AF的值被置為1,否則其值為0:
?。?)、在字操作時(shí),發(fā)生低字節(jié)向高字節(jié)進(jìn)位或借位時(shí);
?。?)、在字節(jié)操作時(shí),發(fā)生低4位向高4位進(jìn)位或借位時(shí)。
PF:奇偶標(biāo)志PF用于反映運(yùn)算結(jié)果中“1”的個(gè)數(shù)的奇偶性。如果“1”的個(gè)數(shù)為偶數(shù),則PF的值為1,否則其值為0。
CF:進(jìn)位標(biāo)志CF主要用來反映運(yùn)算是否產(chǎn)生進(jìn)位或借位。如果運(yùn)算結(jié)果的最高位產(chǎn)生了一個(gè)進(jìn)位或借位,那么,其值為1,否則其值為0。)
4、段寄存器(SegmentRegister)
為了運(yùn)用所有的內(nèi)存空間,8086設(shè)定了四個(gè)段寄存器,專門用來保存段地址:
CS(CodeSegment):代碼段寄存器;
DS(DataSegment):數(shù)據(jù)段寄存器;
SS(StackSegment):堆棧段寄存器;
ES(ExtraSegment):附加段寄存器。
當(dāng)一個(gè)程序要執(zhí)行時(shí),就要決定程序代碼、數(shù)據(jù)和堆棧各要用到內(nèi)存的哪些位置,通過設(shè)定段寄存器CS,DS,SS來指向這些起始位置。通常是將DS固定,而根據(jù)需要修改CS。所以,程序可以在可尋址空間小于64K的情況下被寫成任意大小。所以,程序和其數(shù)據(jù)組合起來的大小,限制在DS所指的64K內(nèi),這就是COM文件不得大于64K的原因。8086以內(nèi)存做為戰(zhàn)場(chǎng),用寄存器做為軍事基地,以加速工作。
非常好我支持^.^
(750) 97.7%
不好我反對(duì)
(18) 2.3%
相關(guān)閱讀:
- [電子說] 學(xué)習(xí)STM32F103的ADC功能 2023-10-24
- [電子說] 學(xué)習(xí)STM32F103的DAC功能 2023-10-24
- [電子說] 學(xué)習(xí)STM32F103的定時(shí)器功能 2023-10-24
- [電子說] STM32基礎(chǔ)知識(shí):定時(shí)器的PWM輸出功能 2023-10-24
- [電子說] 既然ODR能控制管腳高低電平,為什么還需要BSRR寄存器呢? 2023-10-24
- [電子說] ARM系列-P Channel簡析 2023-10-24
- [控制/MCU] 基于STM32F429芯片的單片機(jī)芯片內(nèi)存映射圖 2023-10-23
- [電子說] 軟硬件交互的角度將中斷的知識(shí)梳理 2023-10-22
( 發(fā)表人:姚遠(yuǎn)香 )