首頁>技術>

摘要暫存器真實模式下的CPU定址方式暫存器定址立即數定址記憶體定址棧

1. 暫存器

暫存器是一種物理儲存原件,速度可以跟上CPU的速度,所以CPU內部使用各種型別的暫存器供讀取資料來使用。這裡可以看出暫存器的主要用途:

為CPU儲存資料解決從其他硬體獲取資料與CPU執行速度不匹配的問題

CPU中的暫存器大致分為兩類:

內部使用,對程式設計師不可見(不可使用):GDTR(全域性描述符表暫存器)、IDTR(中斷描述符表暫存器)、LDTR(區域性描述符表暫存器)、TR(任務暫存器)、CR0~3(控制暫存器)、(IP)指令指標暫存器、flags(標誌暫存器)、DR0~7(除錯暫存器)程式設計師可見(可以直接操作)的暫存器:段暫存器、通用暫存器

真實模式下預設用到的暫存器都是16位。

1.1 內部暫存器

內部暫存器雖然不可以直接使用,但是部分暫存器必須要透過我們的程式碼進行初始化。

GDTR需要透過lgdt指令為其指定全域性描述符表的地址及偏移量IDTR需要透過lidt指令為其指定中斷描述符表的地址LDTR需要透過lgdt指令為其其指定區域性描述符表ldtTR需要透過ltr指令為其指定一個任務狀態段tss

1.2 可見暫存器

1.2.1 段暫存器

段暫存器是CPU用來定址使用,CPU預設的定址方式是**"段基址":"段內偏移地址"**,段基址就是用段暫存器來進行儲存。

在我們計算機載入我們的程式以後,會將我們的應用程式在記憶體大致分為三個部分:

程式碼段:該記憶體區域儲存了我們應用程式的指令資料段:該記憶體區域儲存的是我們需要使用到的資料棧段:CPU執行時的必須

段暫存器主要由以下分類:

CS(程式碼段暫存器):儲存程式碼段的起始地址DS(資料段暫存器):儲存資料段的起始地址SS(棧段及暫存器):儲存棧的起始地址ES、CS、GS(附加段暫存器)

可見暫存器CS:內部暫存器IP儲存了CPU下一條待執行指令的地址。

1.2.2 通用暫存器

通用暫存器主要由以下幾類組成:

AX(累加器):由低8位的AL暫存器和高8位的AH暫存器組成,常用於算數運算、邏輯運算、儲存外設輸入輸出的資料BX(基址暫存器):由低8位的BL暫存器和高8位的BH暫存器組成,常用於儲存記憶體地址,用此地址作為基址遍歷一片記憶體區域CX(計數器):由低8位的CL暫存器和8位的CH暫存器組成,常用於計數(迴圈指令中的迴圈次數)DX(資料暫存器):由低8位的DL暫存器和高8位的DH暫存器組成,常用於儲存外設控制器的埠號地址SI(源變址暫存器):常用於字串操作中的資料來源地址(被傳送的資料在哪裡)DI(目的地址暫存器):常用於字串操作中的資料目的地址(資料被傳送到哪裡)SP(棧指標暫存器):段基址暫存器是SS,用來指向棧頂。push和pop會修改SP的值BP(基址指標):SP永遠指向棧頂,我們無法訪問棧頂和棧底之間的資料,如果想要訪問這期間的資料就需要藉助SS:BP

2. 真實模式下的CPU定址

指令都是由操作碼和運算元組成,運算元可以是源運算元、目的運算元,定址就是尋找運算元的地址。

定址的方式主要分為以下三類:

暫存器定址立即數定址記憶體定址

2.1 暫存器定址

只要牽涉到暫存器的操作,無論是源運算元還是目的運算元,都是暫存器定址。

; 將0x10存入ax暫存器mov ax, 0x10;將0x9存入dx暫存器mov dx, 0x9;求ax和dx的乘積,高16位在dx暫存器,低16位在ax暫存器mul dx

這三條命令都屬於暫存器定址。

2.2 立即數定址

指令都是由操作碼和運算元組成,如果運算元可以直接存在指令中,拿過來即可使用,那麼該數成為立即數。

mov ax, 0x10mov dx, ax

第一條命令的源運算元是0x10,目的運算元是ax暫存器,所以第一條命令即是暫存器定址又是立即數定址。

第二條命令只涉及到暫存器,因此它只是暫存器定址。

2.3 記憶體定址

暫存器定址和立即數定址中,源運算元和目的運算元不在記憶體中。相反運算元在記憶體中的定址方式則稱為記憶體定址。

真實模式下CPU訪問記憶體採用的是段基址:段內偏移的形式,計算方式是 物理地址 = 段基址*16(相當於左移4位) + 段內偏移地址,預設情況下,資料段暫存器是DS。

記憶體定址的方式主要有:

直接定址基址定址變址定址基址變址定址

2.3.1 直接定址

直接定址就是將運算元的記憶體地址在指令中直接給出。

mov ax, [0x1234]mov ax, [fs:0x5678]

第一條指定是將記憶體地址為(DS*16 + 0x1234)的值寫入ax暫存器。

第二條指定是將記憶體地址為(FS*16 + 0x5678)的值寫入ax暫存器。

2.3.2 基址定址

基址定址是指運算元用BX暫存器或BP暫存器作為地址的開始,地址的變化都以其為基礎。真實模式下只能使用BX或BP暫存器作為基址,保護模式下則無這種限制。

BX暫存器的預設段暫存器為DS,BP暫存器的預設段暫存器為SS。

int a = 0;function(int b, int c) {    int d;}a++;

2.3.3 變址定址

變址暫存器類似於基址暫存器,暫存器由BX、BP換成了SI、DI。SI是指源索引暫存器、DI是指目的索引暫存器。預設的端暫存器都是DS。

mov [di], axmov [si+0x1234], ax

第一條指令是將暫存器AX中的值存入DS:DI指向的記憶體地址處。

第二條指令是將暫存器AX中的值存入DS:(DI+0x1234)指向的記憶體地址處。

2.3.4 基址變址定址

基址變址定址就是採用基址變址+變址定址的組合。如下:

mov [bx+di], ax

該條指令的含義就是將暫存器AX中的值存入DS:(BX+DI)指向的記憶體地址處。

3. 棧

棧是一種什麼資料結構這裡就不說了,我們這裡講的棧是一片記憶體區域,棧中的記憶體地址也是採用段暫存器SS中的值*16 + 棧指標暫存器SP來訪問。

硬體提供了相應的方法來存取棧,即PUSH和POP指令。

棧是從高地址往低地址發展,因此棧頂的指標指向的地址會越來越低。

我們在訪問棧的時候,訪問的記憶體依然是從低地址到高地址,假設當前棧頂是0x1233E,棧頂資料如果佔2位元組的話,則範圍是0x1233E~0x1233F。

PUSH指令壓入資料的過程:

將SP減去字長(CPU一次可處理的資料長度,真實模式下為16位)所得的差存入SP,棧頂更新完成將資料壓入SP所指向的記憶體地址處

POP指令彈出資料的過程:

彈出棧頂的資料(SP指向的記憶體地址)將SP加上字長所得的和存入SP,棧頂更新完成。

本期暫存器及真實模式下CPU的定址方式就介紹到這,“點贊”+“關注”,我們下期再見!

14
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • win10執行命令大全