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
*********