這是 Intel X86 架構下的 CPU 的所有暫存器 ( Register )

8088.JPG

首先,所有暫存器(Register)都只是一個長度為 16bit = 2byte = 1word 長度的一個空間

memblock.GIF

裡面存放 二進位 (Binary) 數字 , 負責記錄一筆數字資料 (最大值為65535)

 


 

01.JPG

CS = Code Segment,是指一個程式是從哪個位址開始

例如從000A,CS裡面就會記載000A

CS 通常會搭配 IP 使用,程式目前跑到的位置,就由 (CS)0 + IP 決定

如果跑到程式第一行,IP就是0,如果跑到第三行,IP就是2

那麼在實體記憶體實際上的位址就分別是 000A0 和 000A2

 

DS = Data Segment ,是指資料從記憶體的哪個位址開始

DS 通常會搭配其他暫存器使用,例如 BX、CX 等等

假如你在組合語言中要求使用 [BX] 這個位址的資料 ,而 BX = 3

那麼你其實找到的是在記憶體位置 (DS)0 + BX 位址的資料 ,即是000A3這個位址的資料   (假如DS=000A)

還是看不懂的,請來看看這篇吧~


SS = Stack Segment 

這是表示你的堆疊( Stack )的底部位置

通常會搭配 SP 使用

SS + SP 就是目前 Stack 堆疊頂端的位址  (TOS,Top of Stack )

如果把一筆資料送入堆疊 ( PUSH ) ,那SP就會 -2

反之,若把一筆資料從堆疊中拿出 ( POP ) , 那SP就會 +2

(這裡的加減號並沒有打錯,如果有疑惑,請看這一篇)

 

ES = Extra Segment

這名符其實,是額外的Segment,大概可以靈活運用

不過若要賦值給它,則要注意

MOV ES,3H -> 這樣是錯的

MOV DX,3H
MOV ES,DX -> 這樣才可以

 


 

SI / DI 則分別代表

Source Index 和 Destination Index

(source=來源/Destination=目標)

舉個例子來講

組合語言指令中,MOV AX,BX

是將 BX 的資料複製到 AX

那麼,SI就要指向BX,DI就要指向AX

 


 

接下來的AX,BX,CX,DX

就是 General Purpose Registers (通用功能暫存器)

值得注意的是,這四個暫存器可以分成 High Bits 和 Low Bits 分別使用

例如 AX 可以拆成 AH 和 AL

memblock.GIF

 

當然,也可以自己就是一個暫存器使用

memblock.GIF

一般來說這四個暫存器可以隨時使用

但是這四個暫存器各自有特殊的功用

AX =Accumulator

例如在做乘法/除法的時候,AX暫存器就很特別

例如 MUL CX 這個指令

其實是把 CX 乘以 AX 的結果 放入 AX 之中

另外,發出I/O指令,也是由AX記載的內容決定要發出哪個指令

 

BX = Based

例如 XLAT指令,就是把  (DS)0 + AL + BX  的記憶體位址內容 丟到 AL 中

 

CX = Counter

Counter顧名思義是計數器,LOOP系列指令會對它產生影響

讓我們來看看以下這段程式碼

           MOV CX,5
AGAIN: NOP
           LOOPNZ AGAIN

( LOOPNZ = 若CX不為0就繼續 )

LOOPNZ這個指令是針對CX做變化,每跑到這個指令一次,就會把CX減去1
那麼,跑了5次之後,CX終於會扣到變成0,LOOP就結束

 

DX = Data

做一般資料傳輸用途。

 

 


 

 

Status Register (FLAGS)

這也是一個 16bit = 2byte = 1word 長度的 register

剛好每一個 bit 能放的就是 0 或 1

如果放 0 ,那個狀態,就是沒有 (reset)

放 1 就是有 (set)

以下是每一個 bit 分別代表的 flag (灰色代表保留未使用的)

flag.JPG

以下一一介紹

 

 CF = Carry Flag = 進位 

如果指令的運作中,使得資料產生了Carry,那麼CF就會變成 1 (set),反之就是 0 (reset)

例如 1000000000000000 + 1000000000000000 = 1 0000000000000000 

(注意,結果超出 1 位,紅色的1 已經跑到那筆資料的外面了,而那個 1 就是 carry)

carry.GIF

如果還是不太清楚的話

你只要把Carry當作是 16th bit 就可以了  (就是最左邊的那格,再往左延伸出去一格,變成從左往右數來第17格)

把整個記憶體位址當作有17個bit 去運算,如果 16th bit 是 1 ,那carry就是1,反之就是 0

ssss.GIF

(這也是為什麼發生進位和借位時,carry都是1)

 


PF = Parity Flag

看看計算的結果之中,存在幾個位數的「1」

如果是偶數個的話,PF=1,反之PF=0

舉例

00001010 => Parity Bit 為 1 (set)

00001000 => Parity Bit 為 0 (reset)

 


AF = Auxiliary Flag

 

 

相似CF,但這裡是以四個Bit為一組來做判斷的 ( 不過實際上只有偵測 4th bit 有沒有 進位carry 或 借位borrow )

auxx.GIF

像這張圖的情況,AF=1

這種四個bit一組的情況,就是在BCD的情況常用。

 


 

ZF = Zero Flag

如果計算出來的結果是 0 ,那麼 ZF=1 ,反之ZF=0

 

SF = Sign Flag

如果計算出來的結果有負號,那麼SF=1,反之SF=0

 

TF = Trap Flag

如果TF設定成1,那麼電腦的程式會逐行執行 (用於除錯等用途)

 

IF = Interrupt Flag

決定該CPU是否可以接受從外部發出的中斷請求

 

DF = Direction Flag

決定字串的讀取是由「高位讀到低位」(small endian)還是「低位讀到高位」(big endian)

X86的設計,預設是small endian

例如 在small endian

位址 00 資料為 34 ,位址 01 資料為 12

那麼這個字串讀起來就是 1234

(DF=0時,就是small endian)

 

OF = Overflow Flag

如果資料計算結果,產生溢位(overflow),OF=1,反之OF=0

OF = Overflow Flag


arrow
arrow
    全站熱搜

    finalfrank 發表在 痞客邦 留言(1) 人氣()