Assembly 寄存器
處理器操作主要涉及數據處理。這些數據可以被存儲在存儲器中,並從在其上進行訪問。然而,讀取數據和將數據存儲到存儲器的速度變慢的處理器,因為它涉及複雜的過程,整個控製總線發送的數據請求,到存儲器的存儲單元,並通過同一個通道獲取數據。
為了加快該處理器,該處理器包括一些內部存儲器中的存儲位置,稱為寄存器。
寄存器存儲數據元素進行處理,而無需直接訪問存儲器。處理器芯片內置到數量有限的寄存器。
處理器寄存器
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 *********