8086数据寄存器介绍
通用寄存器
在 8086 CPU 中,通用寄存器有 8 個,分別是 AX,BX,CX,DX,SP,BP,SI,DI?
下面介紹這幾個通用寄存器:
數據寄存器(AX,BX,CX,DX):
數據寄存器有 AX,BX,CX,DX 四個組成,
由于在 8086 之前的 CPU 為 8 位 CPU,所以為了兼容以前的 8 位程序,在 8086 CPU 中,每一個數據寄存器都可以當做兩個單獨的寄存器來使用,由此,每一個 16 位寄存器就可以當做 2 個獨立的 8 位寄存器來使用了 。
AX 寄存器可以分為兩個獨立的 8 位的 AH 和 AL 寄存器;
BX 寄存器可以分為兩個獨立的 8 位的 BH 和 BL 寄存器;
CX 寄存器可以分為兩個獨立的 8 位的 CH 和 CL 寄存器;
DX 寄存器可以分為兩個獨立的 8 位的 DH 和 DL 寄存器;
除了上面 4 個數據寄存器以外,其他寄存器均不可以分為兩個獨立的 8 位寄存器 ;
注意在上面標志中的“獨立”二字,這兩個字表明 AH 和 AL 作為 8 位寄存器使用時,可以看做它們是互不相關的,也就是看做兩個完全沒有聯系的寄存器 X 和 Y 即可,比如指令?? MOV?? AH , 12H ,CPU 在執行時根本就不會知道 AL 中是什么鬼東西,因為它只認識? AH 。
下面給出一幅 16 位數據寄存器的結構圖:
表示 16 位 寄存器 AX 可以表示成兩個 8 位寄存器,
其中 AH 表示高位的 8 位寄存器,AL 表示低位的 8 位寄存器 。
AX 寄存器:
如上所說,AX 的另外一個名字叫做累加寄存器或者簡稱為累加器,其可以分為 2 個獨立的 8 位寄存器 AH 和 AL;
在寫匯編程序時,AX 寄存器可以說是使用率最高的寄存器(不過,總共才那么 14 個寄存器,哪一個不經常使用咯?),既然 AX 是數據寄存器的話,那么理所當然,其可以用來存放普通的數據,由于其是 16 位寄存器,自然也就可以存放 16 位數據,但是因為其又可以分為 2 個獨立的 8 位寄存器 AH 和 AL ,所以,在 AH 和 AL 中又可以獨立的存放 2 個 8 位的數據,可以有以下代碼(即將 AX 當做普通的寄存器使用,即可以用來暫存數據):
MOV AX,1234H ;向寄存器 AX 傳入數據 1234H MOV AH,56H ;向寄存器 AX 的高 8 位寄存器 AH 中傳入數據 56H MOV AL,78H ;向寄存器 AX 的低 8 位寄存器 AL 中傳入數據 78H 3 條語句的執行過程如下:而既然 AX 又被稱作為累加器,自然其還有一點點特殊的地方的:
AX 寄存器還具有的特殊用途是在使用 DIV 和 MUL 指令時使用,DIV 在 8086 CPU 中是除法指令,而在使用除法的時候有兩種情況,即除數可以是 8 位或者是 16 位的,而且除數可以存放在寄存器中或者是內存單元中,而至于被除數的話,自然,應該由 AX 來代替了,當除數是 8 位時,被除數一定會是 16 位的,并且默認是放在 AX 寄存器中,而當除數是 16 位時,被除數一定是 32 位的,因為 AX 是 16 位寄存器,自然,放不下 32 位的被除數,所以,在這里還需要使用另一個 16 位寄存器 DX ,其中 DX 存放 32 位的被除數的高 16 位,而 AX 則存放 32 位的被除數的低 16 位,同時,AX 的作用還不僅僅是用來保存被除數的,當除法指令執行完成以后,如果除數是 8 位的,則在 AL 中會保存此次除法操作的商,而在 AH 中則會保存此次除法操作的余數,當然,如果除數是 16 位的話,則 AX 中會保存本次除法操作的商,而 DX 則保存本次除法操作的余數。
上面介紹的是 AX 寄存器在除法操作中的應用,下面還需要介紹一下 AX 在乘法操作中的應用,
當使用 MUL 做乘法運算時,兩個相乘的數要么都是 8 位,要么都是 16 位,如果兩個相乘的數都是 8 位的話,則一個默認是放在 AL 中,而另一個 8 位的乘數則位于其他的寄存器或者說是內存字節單元中,而如果兩個相乘的數都是 16 位的話,則一個默認存放在 AX 中,另一個 16 位的則是位于 16 的寄存器中或者是某個內存字單元中。
同時,當 MUL 指令執行完畢后,如果是 8 位的乘法運算,則默認乘法運算的結果是保存在 AX 中,而如果是 16 位的乘法運算的話,則默認乘法運算的結果有 32 位,其中,高位默認保存在 DX 中,而低位則默認保存在 AX 中。
AX 寄存器在 DIV? 指令中的使用:
MOV DX,0H ;設置 32 位被除數的高 16 位為 0H MOV AX,8H ;設置 32 位被除數的低 16 位為 8H MOV BX,2H ;設置 16 位除數為 2H DIV BX ;執行計算 4 條語句的執行過程如下:
AX 寄存器在 MUL? 指令中的使用:
MOV AX,800H ;設置 16 位乘數為 800H MOV BX,100H ;設置 16 位乘數為 100H MOV DX,0H ;清空用來保存乘法結果的高 16 位 MUL BX ;執行計算 4 條語句的執行過程如下:
???????
BX 寄存器:
首先可以明確的是,BX 作為數據寄存器,表明其是可以暫存一般的數據的,即在某種程度上,它和 AX 可以暫存一般性數據的功能是一樣的,其同樣為了適應以前的 8 位 CPU ,而可以將 BX 當做兩個獨立的 8 位寄存器使用,即有 BH 和 BL,除了暫存一般性數據的功能外,BX 作為通用寄存器的一種,BX 主要還是用于其專屬功能 – 尋址(尋址物理內存地址)上,BX 寄存器中存放的數據一般是用來作為偏移地址使用的。
在 8086 CPU 中,CPU 是根據 <段地址:偏移地址> 來進行尋址操作的,而 BX 中存放的數據表示的是偏移地址的話,自然,便可以通過 <段地址:[BX]> 的方式來完成尋址操作了。
為了介紹 BX 在尋址當中的作用,下面我給出一副示意圖:
上面的示意圖表示:可以令 BX = 2,然后通過 DS : [BX] 來訪問到內存中段地址為 DS,且偏移量為 2 的內存單元了。
上面介紹的這種尋址方式是 BX 在尋址中最最簡單的應用了,而對于稍微復雜的尋址方式,
還可以依賴于 SI,DI,BP 等寄存器來一起完成。
BX?寄存器在尋址中的使用:
MOV BX,5H MOV AH,11H MOV AH,[BX] ;設置 AX 的值為偏移地址為 BX 中的值時所代表的內存單元 3 條語句的執行過程如下:
從上圖可以看出,在偏移地址為 5 時的內存單元中的數據位 BBH,
而從這幅圖上面就可以看出,確實通過 [BX] 找到了偏移地址為 5 處的內存單元,并且將內存單元移入了 AH 中。
??????????????
CX 寄存器:
CX 寄存器作為數據寄存器的一種呢,其同樣具有和 AX,BX 一樣的特點,即可以暫存一般性的數據,同時還可以將其當做兩個獨立的 8 位寄存器使用,即有 CH 和 CL 兩個 8 位寄存器,當然,CX 也是有其專門的用途的,CX 中的 C 被翻譯為 Counting 也就是計數器的功能,當在匯編指令中使用循環 LOOP 指令時,可以通過 CX 來指定需要循環的次數,而 CPU 在每一次執行 LOOP 指令的時候,都會做兩件事:
一件就是令 CX = CX – 1,即令 CX 計數器自動減去 1;
還有一件就是判斷 CX 中的值,如果 CX 中的值為 0 則會跳出循環,而繼續執行循環下面的指令,當然如果 CX 中的值不為 0 ,則會繼續執行循環中所指定的指令 。
CX?寄存器在循環中的使用(輸出 5 個白底藍字的 A):
MOV AX,0B800H MOV DS,AX ;使用 80x25 彩色字符模式,內存地址 0xB8000 - 0xBFFFFF MOV BX,0 ;從 0xB8000 開始 MOV CX,5H ;循環 5 次 MOV DX,41H ;A 的16 進制為 41H MOV AX,01110001B ;顯示白底藍字 s: MOV [BX],DX ;顯示 ASCII 字符ADD BX,1MOV [BX],AX ;設置字符顯示屬性ADD BX,1 LOOP s 語句的執行過程如下:
??????????????
DX 寄存器:
DX 寄存器作為數據寄存器的一種,同樣具有和 AX,BX,CX 一樣的特點,即可以暫存一般性的數據,同時還可以將其當做兩個獨立的 8 位寄存器使用,極有 DH 和 DL,同時,DX 作為一個通用寄存器的話,關于 DX 在其他方面的用途,當在使用 DIV 指令進行除法運算時,如果除數為 16 位時,被除數將會是 32 位,而被除數的高 16 位就是存放在 DX 中,而且執行完 DIV 指令后,本次除法運算所產生的余數將會保存在 DX 中,同時,在執行 MUL 指令時,如果兩個相乘的數都是 16 位的話,那么相乘后產生的結果顯然需要 32 位來保存,而這 32 位的結果的高 16 位就是存放在 DX 寄存器中 。
DX 寄存器在 DIV? 指令中的使用(即 2293812 / 256 = 8960? 余數為 52):
MOV DX,0023H ;32 位被除數的高 16 位 MOV AX,0034H ;32 位被除數的低 16 位 MOV BX,100H ;16 的除數 DIV BX 語句的執行過程如下:
可以看到在語句結束以后,AX = 2300H? 即十進制的 8960,而 DX = 34H即十進制的 52 和我們的結果是一致的。
總結
以上是生活随笔為你收集整理的8086数据寄存器介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是GDT,LDT,GDTR及LDTR
- 下一篇: 8086指针寄存器