Assembly 暫存器


處理器操作主要涉及資料處理。這些資料可以被儲存在儲存器中,並從在其上進行存取。然而,讀取資料和將資料儲存到儲存器的速度變慢的處理器,因為它涉及複雜的過程,整個控制匯流排傳送的資料請求,到儲存器的儲存單元,並通過同一個通道獲取資料。

為了加快該處理器,該處理器包括一些內部儲存器中的儲存位置,稱為暫存器。

暫存器儲存資料元素進行處理,而無需直接存取儲存器。處理器晶片內建到數量有限的暫存器。

處理器暫存器

IA-32架構中有10個32位元和6個16位元處理器暫存器。該暫存器被分成三大類:

  • 通用暫存器

  • 控制暫存器

  • 段暫存器

通用暫存器進一步分為以下幾類:

  • 資料暫存器

  • 指標暫存器

  • 索引暫存器

資料暫存器

4個32位元資料暫存器用於算術,邏輯和其他操作。這些32位元的暫存器可以用來在三個方面:

  1. 32位元資料暫存器: EAX, EBX, ECX, EDX.

  2. 下半部分32位元暫存器,可以作為4個16位元資料暫存器: AX, BX, CX and DX.

  3. 8個8位元資料暫存器可以用作上面提到的4個16位元暫存器的較低和較高的半部 AH, AL, BH, BL, CH, CL, DH, and DL.

Data Registers

這些資料暫存器中的某些具有特定的算術運算中使用。

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結合特殊的定址。

Yiibaier Registers

索引暫存器

32位元變址暫存器ESI和EDI和16位元的最右邊的部分SI和DI用於索引定址,有時用在加法和減法。有兩組的索引指標:

  • Source Index (SI) - 它被用作來源分類索引為字串操作

  • Destination Index (DI) -它被用來作為目標指數為字串操作。

Index Registers

控制暫存器

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