處理器操作主要涉及數(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ù)寄存器
指針寄存器
索引寄存器
4個(gè)32位數(shù)據(jù)寄存器用于算術(shù),邏輯和其他操作。這些32位的寄存器可以用來(lái)在三個(gè)方面:
32位數(shù)據(jù)寄存器: EAX, EBX, ECX, EDX.
下半部分32位寄存器,可以作為4個(gè)16位數(shù)據(jù)寄存器: AX, BX, CX and DX.
8個(gè)8位數(shù)據(jù)寄存器可以用作上面提到的4個(gè)16位寄存器的較低和較高的半部 AH, AL, BH, BL, CH, CL, DH, and DL.
這些數(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é)合特殊的尋址。
32位變址寄存器ESI和EDI和16位的最右邊的部分SI和DI用于索引尋址,有時(shí)用在加法和減法。有兩組的索引指針:
Source Index (SI) - 它被用作來(lái)源分類索引為字符串操作
Destination Index (DI) -它被用來(lái)作為目標(biāo)指數(shù)為字符串操作。
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 *********