鍍金池/ 教程/ Java/ Assembly 寄存器
Assembly 變量聲明
Assembly匯編 STOS指令
Assembly 條件
Assembly 尋址模式和MOV指令
Assembly匯編教程
Assembly - 什么是匯編語(yǔ)言
Assembly 循環(huán)
Assembly 內(nèi)存段
Assembly匯編 宏
Assembly 寄存器
Assembly匯編 遞歸
Assembly匯編 CMPS指令
Assembly匯編 內(nèi)存管理
Assembly匯編 LODS指令
Assembly 基本語(yǔ)法
Assembly匯編 過(guò)程
Assembly匯編 文件管理
Assembly匯編 數(shù)組
Assembly匯編 SCAS指令
Assembly 算術(shù)指令
Assembly 環(huán)境設(shè)置
Assembly匯編 字符串處理
Assembly 數(shù)字
Assembly 常量
Assembly匯編 MOVS指令
Assembly 邏輯指令
Assembly 系統(tǒng)調(diào)用

Assembly 寄存器

處理器操作主要涉及數(shù)據(jù)處理。這些數(shù)據(jù)可以被存儲(chǔ)在存儲(chǔ)器中,并從在其上進(jìn)行訪問(wèn)。然而,讀取數(shù)據(jù)和將數(shù)據(jù)存儲(chǔ)到存儲(chǔ)器的速度變慢的處理器,因?yàn)樗婕皬?fù)雜的過(guò)程,整個(gè)控制總線發(fā)送的數(shù)據(jù)請(qǐng)求,到存儲(chǔ)器的存儲(chǔ)單元,并通過(guò)同一個(gè)通道獲取數(shù)據(jù)。

為了加快該處理器,該處理器包括一些內(nèi)部存儲(chǔ)器中的存儲(chǔ)位置,稱為寄存器。

寄存器存儲(chǔ)數(shù)據(jù)元素進(jìn)行處理,而無(wú)需直接訪問(wèn)存儲(chǔ)器。處理器芯片內(nèi)置到數(shù)量有限的寄存器。

處理器寄存器

IA-32架構(gòu)中有10個(gè)32位和6個(gè)16位處理器寄存器。該寄存器被分成三大類:

  • 通用寄存器

  • 控制寄存器

  • 段寄存器

通用寄存器進(jìn)一步分為以下幾類:

  • 數(shù)據(jù)寄存器

  • 指針寄存器

  • 索引寄存器

數(shù)據(jù)寄存器

4個(gè)32位數(shù)據(jù)寄存器用于算術(shù),邏輯和其他操作。這些32位的寄存器可以用來(lái)在三個(gè)方面:

  1. 32位數(shù)據(jù)寄存器: EAX, EBX, ECX, EDX.

  2. 下半部分32位寄存器,可以作為4個(gè)16位數(shù)據(jù)寄存器: AX, BX, CX and DX.

  3. 8個(gè)8位數(shù)據(jù)寄存器可以用作上面提到的4個(gè)16位寄存器的較低和較高的半部 AH, AL, BH, BL, CH, CL, DH, and DL.

Data Registers

這些數(shù)據(jù)寄存器中的某些具有特定的算術(shù)運(yùn)算中使用。

AX是主要累加器; 它被用在輸入/輸出和多數(shù)算術(shù)運(yùn)算指令。例如,在乘法運(yùn)算中,一個(gè)操作數(shù)存儲(chǔ)在EAX或AX或AL寄存器操作數(shù)的大小。

BX是已知的作為基址寄存器,因?yàn)樗梢杂迷谒饕龑ぶ贰?/p>

CX稱為計(jì)數(shù)寄存器ECX,CX寄存器存儲(chǔ)中的循環(huán)計(jì)數(shù)迭代操作。

DX被稱為數(shù)據(jù)寄存器。它也可以用來(lái)在輸入/輸出操作。它也可用于與AX寄存器連同DX涉及大的值的乘法和除法運(yùn)算。

指針寄存器

指針寄存器是32位的EIP,ESP和EBP寄存器和相應(yīng)的16位右部IP,SP和BP。指針寄存器有三類:

  • Instruction Yiibaier (IP) - 16位的IP寄存器存儲(chǔ)的下一個(gè)要執(zhí)行的指令的偏移地址。 IP與CS寄存器(CS:IP)給出了完整的代碼段中的當(dāng)前指令地址。

  • Stack Yiibaier (SP) - SP寄存器的16位提供程序堆棧內(nèi)的偏移值。 SP與SS寄存器(SS:SP)是指在程序堆棧的當(dāng)前位置的數(shù)據(jù)或地址。

  • Base Yiibaier (BP) - 在16-bit的BP寄存器主要是幫助在引用的參數(shù)變量傳遞到一個(gè)子程序。 SS寄存器中的地址相結(jié)合,在BP的偏移得到的參數(shù)的位置。 BP也可作為基址寄存器DI和SI結(jié)合特殊的尋址。

Yiibaier Registers

索引寄存器

32位變址寄存器ESI和EDI和16位的最右邊的部分SI和DI用于索引尋址,有時(shí)用在加法和減法。有兩組的索引指針:

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

  • Destination Index (DI) -它被用來(lái)作為目標(biāo)指數(shù)為字符串操作。

Index Registers

控制寄存器

32位指令指針寄存器和32位標(biāo)志寄存器組合被視為控制寄存器。

許多指令涉及比較和數(shù)學(xué)計(jì)算和改變的狀態(tài)標(biāo)志,和其他一些有條件指令測(cè)試這些狀態(tài)標(biāo)志值到其他位置的控制流。

常見(jiàn)的標(biāo)志位:

  • Overflow Flag (OF): 指示符號(hào)的算術(shù)運(yùn)算操作后的數(shù)據(jù)的高階位(最左邊的位)的溢出。

  • Direction Flag (DF): 決定向左或向右移動(dòng)或比較字符串?dāng)?shù)據(jù)的方向。當(dāng)DF值是0,字符串的操作需要左到右的方向和當(dāng)該值被設(shè)置為1時(shí),該字符串的操作需要從右到左的方向。

  • Interrupt Flag (IF): 決定是否外部中斷。如,鍵盤輸入等是被忽略或處理。它會(huì)禁用外部中斷,當(dāng)值為0時(shí),設(shè)置為1時(shí),允許中斷。

  • Trap Flag (TF): 可設(shè)置單步模式中的處理器的操作。我們使用調(diào)試程序設(shè)置陷阱標(biāo)志,所以我們可以通過(guò)執(zhí)行一個(gè)指令在一個(gè)時(shí)間步。

  • Sign Flag (SF): 顯示的符號(hào)的算術(shù)運(yùn)算的結(jié)果。根據(jù)一個(gè)數(shù)據(jù)項(xiàng)的符號(hào)的算術(shù)運(yùn)算后,這個(gè)標(biāo)志被設(shè)置。最左邊的位高階符號(hào)表示。一個(gè)積極的結(jié)果清除SF值0和負(fù)結(jié)果,將其設(shè)置為1。

  • Zero Flag (ZF): 指出算術(shù)運(yùn)算或比較操作的結(jié)果。一個(gè)非零的結(jié)果清除零標(biāo)志為0,結(jié)果為零,將其設(shè)置為1。

  • Auxiliary Carry Flag (AF): 包含進(jìn)從第3位到第4位算術(shù)運(yùn)算,用于專門算術(shù)。 AF被設(shè)為1字節(jié)的算術(shù)操作導(dǎo)致進(jìn)位從第3位到第4位。

  • Parity Flag (PF): 在從一個(gè)算術(shù)運(yùn)算的結(jié)果為1的位數(shù)表示的總數(shù)。為1的位數(shù)為偶數(shù)奇偶標(biāo)志清零0,為1的位數(shù)為奇數(shù)個(gè)的奇偶校驗(yàn)設(shè)置標(biāo)志位為1。

  • Carry Flag (CF)包含從高階位(最左邊的)算術(shù)運(yùn)算后的進(jìn)位為0或1。它還存儲(chǔ)的內(nèi)容的最后一個(gè)比特的移位或旋轉(zhuǎn)操作。

下表顯示在16位的標(biāo)志寄存器的標(biāo)志位的位置:

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

段寄存器

段含有數(shù)據(jù),代碼和堆棧在程序中定義的特定區(qū)域。有三個(gè)主要部分:

  • 代碼段:它包含了所有要執(zhí)行的指令。一個(gè)16 - 位代碼段寄存器CS寄存器存儲(chǔ)的代碼段的起始地址。

  • 數(shù)據(jù)段: 它包含數(shù)據(jù),常量和工作區(qū)。一個(gè)16 - 位數(shù)據(jù)段寄存器DS寄存器存儲(chǔ)數(shù)據(jù)段的起始地址。

  • 堆棧段: 它包含數(shù)據(jù),程序或子程序的返回地址。它被實(shí)現(xiàn)為一個(gè)“堆棧”的數(shù)據(jù)結(jié)構(gòu)。堆棧段寄存器或SS寄存器存儲(chǔ)堆棧的起始地址。

除了在DS,CS和SS寄存器,還有其他的額外的段寄存器 - ES(附加段),F(xiàn)S和GS,它提供了用于存儲(chǔ)數(shù)據(jù)的附加段。

在匯編語(yǔ)言編程,程序需要訪問(wèn)的內(nèi)存位置。段內(nèi)的所有的內(nèi)存位置相對(duì)于該段的起始地址。在地址均勻分部開始禁用由16或10進(jìn)制。因此,所有的在所有這樣的存儲(chǔ)器地址的最右邊的十六進(jìn)制數(shù)字是0,這是不一般存放在段寄存器。

段寄存器存儲(chǔ)一個(gè)段的起始地址。為了得到確切的位置數(shù)據(jù)或指令段內(nèi)的偏移值(或位移)是必需的。引用任何在一個(gè)段中的內(nèi)存位置,所述處理器相結(jié)合的段寄存器中的段地址的偏移值的位置。

例子:

看看下面這個(gè)簡(jiǎn)單的程序,了解使用匯編編程寄存器。此程序顯示在屏幕上的9顆星連同一個(gè)簡(jiǎn)單的信息:

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

上面的代碼編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生以下結(jié)果:

Displaying 9 stars
*********