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