位置:首頁 > 高級語言 > Assembly彙編 > Assembly 寄存器

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