處理器操作主要涉及資料處理。這些資料可以被儲存在儲存器中,並從在其上進行存取。然而,讀取資料和將資料儲存到儲存器的速度變慢的處理器,因為它涉及複雜的過程,整個控制匯流排傳送的資料請求,到儲存器的儲存單元,並通過同一個通道獲取資料。
為了加快該處理器,該處理器包括一些內部儲存器中的儲存位置,稱為暫存器。
暫存器儲存資料元素進行處理,而無需直接存取儲存器。處理器晶片內建到數量有限的暫存器。
IA-32架構中有10個32位元和6個16位元處理器暫存器。該暫存器被分成三大類:
通用暫存器
控制暫存器
段暫存器
通用暫存器進一步分為以下幾類:
資料暫存器
指標暫存器
索引暫存器
4個32位元資料暫存器用於算術,邏輯和其他操作。這些32位元的暫存器可以用來在三個方面:
32位元資料暫存器: EAX, EBX, ECX, EDX.
下半部分32位元暫存器,可以作為4個16位元資料暫存器: AX, BX, CX and DX.
8個8位元資料暫存器可以用作上面提到的4個16位元暫存器的較低和較高的半部 AH, AL, BH, BL, CH, CL, DH, and DL.
這些資料暫存器中的某些具有特定的算術運算中使用。
AX是主要累加器; 它被用在輸入/輸出和多數算術運算指令。例如,在乘法運算中,一個運算元儲存在EAX或AX或AL暫存器運算元的大小。
BX是已知的作為基址暫存器,因為它可以用在索引定址。
CX稱為計數暫存器ECX,CX暫存器儲存中的迴圈計數迭代操作。
DX被稱為資料暫存器。它也可以用來在輸入/輸出操作。它也可用於與AX暫存器連同DX涉及大的值的乘法和除法運算。
指標暫存器是32位元的EIP,ESP和EBP暫存器和相應的16位元右部IP,SP和BP。指標暫存器有三類:
Instruction Yiibaier (IP) - 16位元的IP暫存器儲存的下一個要執行的指令的偏移地址。 IP與CS暫存器(CS:IP)給出了完整的程式碼段中的當前指令地址。
Stack Yiibaier (SP) - SP暫存器的16位元提供程式堆疊內的偏移值。 SP與SS暫存器(SS:SP)是指在程式堆疊的當前位置的資料或地址。
Base Yiibaier (BP) - 在16-bit的BP暫存器主要是幫助在參照的引數變數傳遞到一個子程式。 SS暫存器中的地址相結合,在BP的偏移得到的引數的位置。 BP也可作為基址暫存器DI和SI結合特殊的定址。
32位元變址暫存器ESI和EDI和16位元的最右邊的部分SI和DI用於索引定址,有時用在加法和減法。有兩組的索引指標:
Source Index (SI) - 它被用作來源分類索引為字串操作
Destination Index (DI) -它被用來作為目標指數為字串操作。
32位元指令指標暫存器和32位元標誌暫存器組合被視為控制暫存器。
許多指令涉及比較和數學計算和改變的狀態標誌,和其他一些有條件指令測試這些狀態標誌值到其他位置的控制流。
常見的標誌位:
Overflow Flag (OF): 指示符號的算術運算操作後的資料的高階位(最左邊的位)的溢位。
Direction Flag (DF): 決定向左或向右移動或比較字串資料的方向。當DF值是0,字串的操作需要左到右的方向和當該值被設定為1時,該字串的操作需要從右到左的方向。
Interrupt Flag (IF): 決定是否外部中斷。如,鍵盤輸入等是被忽略或處理。它會禁用外部中斷,當值為0時,設定為1時,允許中斷。
Trap Flag (TF): 可設定單步模式中的處理器的操作。我們使用偵錯程式設定陷阱標誌,所以我們可以通過執行一個指令在一個時間步。
Sign Flag (SF): 顯示的符號的算術運算的結果。根據一個資料項的符號的算術運算後,這個標誌被設定。最左邊的位高階符號表示。一個積極的結果清除SF值0和負結果,將其設定為1。
Zero Flag (ZF): 指出算術運算或比較操作的結果。一個非零的結果清除零標誌為0,結果為零,將其設定為1。
Auxiliary Carry Flag (AF): 包含進從第3位到第4位元算術運算,用於專門算術。 AF被設為1位元組的算術操作導致進位從第3位到第4位元。
Parity Flag (PF): 在從一個算術運算的結果為1的位數表示的總數。為1的位數為偶數奇偶標誌清零0,為1的位數為奇數個的奇偶校驗設定標誌位為1。
Carry Flag (CF): 包含從高階位(最左邊的)算術運算後的進位為0或1。它還儲存的內容的最後一個位元的移位或旋轉操作。
下表顯示在16位元的標誌暫存器的標誌位的位置:
Flag: | O | D | I | T | S | Z | A | P | C | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Bit no: | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
段含有資料,程式碼和堆疊在程式中定義的特定區域。有三個主要部分:
程式碼段:它包含了所有要執行的指令。一個16 - 位程式碼段暫存器CS暫存器儲存的程式碼段的起始地址。
資料段: 它包含資料,常數和工作區。一個16 - 位資料段暫存器DS暫存器儲存資料段的起始地址。
堆疊段: 它包含資料,程式或子程式的返回地址。它被實現為一個“堆疊”的資料結構。堆疊段暫存器或SS暫存器儲存堆疊的起始地址。
除了在DS,CS和SS暫存器,還有其他的額外的段暫存器 - ES(附加段),FS和GS,它提供了用於儲存資料的附加段。
在組合語言程式設計,程式需要存取的記憶體位置。段內的所有的記憶體位置相對於該段的起始地址。在地址均勻分部開始禁用由16或10進位制。因此,所有的在所有這樣的儲存器地址的最右邊的十六進位制數位是0,這是不一般存放在段暫存器。
段暫存器儲存一個段的起始地址。為了得到確切的位置資料或指令段內的偏移值(或位移)是必需的。參照任何在一個段中的記憶體位置,所述處理器相結合的段暫存器中的段地址的偏移值的位置。
看看下面這個簡單的程式,了解使用組合程式設計暫存器。此程式顯示在螢幕上的9顆星連同一個簡單的資訊:
section .text global _start ;must be declared for linker (gcc) _start: ;tell linker entry yiibai mov edx,len ;message length mov ecx,msg ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov edx,9 ;message length mov ecx,s2 ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .data msg db 'Displaying 9 stars',0xa ;a message len equ $ - msg ;length of message s2 times 9 db '*'
上面的程式碼編譯和執行時,它會產生以下結果:
Displaying 9 stars *********