這是 Intel X86 架構下的 CPU 的所有暫存器 ( Register )
首先,所有暫存器(Register)都只是一個長度為 16bit = 2byte = 1word 長度的一個空間
裡面存放 二進位 (Binary) 數字 , 負責記錄一筆數字資料 (最大值為65535)
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
當然,也可以自己就是一個暫存器使用
一般來說這四個暫存器可以隨時使用
但是這四個暫存器各自有特殊的功用
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 (灰色代表保留未使用的)
以下一一介紹
CF = Carry Flag = 進位
如果指令的運作中,使得資料產生了Carry,那麼CF就會變成 1 (set),反之就是 0 (reset)
例如 1000000000000000 + 1000000000000000 = 1 0000000000000000
(注意,結果超出 1 位,紅色的1 已經跑到那筆資料的外面了,而那個 1 就是 carry)
如果還是不太清楚的話
你只要把Carry當作是 16th bit 就可以了 (就是最左邊的那格,再往左延伸出去一格,變成從左往右數來第17格)
把整個記憶體位址當作有17個bit 去運算,如果 16th bit 是 1 ,那carry就是1,反之就是 0
(這也是為什麼發生進位和借位時,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 )
像這張圖的情況,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
留言列表