處理器操作主要涉及處理數(shù)據(jù)孵睬。 該數(shù)據(jù)可以存儲在存儲器中并從其訪問播歼。 然而,從存儲器中讀取數(shù)據(jù)并將數(shù)據(jù)存儲到存儲器中會減慢處理器的速度掰读,因為它涉及到通過控制總線發(fā)送數(shù)據(jù)請求并進入存儲器存儲單元并通過同一通道獲取數(shù)據(jù)的復(fù)雜過程秘狞。
為了加快處理器的運行,處理器包括一些內(nèi)部存儲器的存儲位置磷支,稱為寄存器(Register)谒撼。
寄存器存儲要處理的數(shù)據(jù)元素,而不必訪問存儲器雾狈。 處理器芯片中內(nèi)置了數(shù)量有限的寄存器廓潜。
處理器寄存器
IA-32體系結(jié)構(gòu)中有10個32位和6個16位處理器寄存器。 寄存器分為三類
- 通用寄存器
- 控制寄存器
- 段寄存器
而通用寄存器進一步可以分為以下幾類
- 數(shù)據(jù)寄存器
- 指針寄存器
- 索引寄存器
數(shù)據(jù)寄存器
四個32位數(shù)據(jù)寄存器用于算術(shù)善榛,邏輯和其他運算辩蛋。 這些32位寄存器可以三種方式使用
- 作為完整的32位數(shù)據(jù)寄存器:EAX,EBX移盆,ECX悼院,EDX。
- 下半部分的32位寄存器可用作四個16位數(shù)據(jù)寄存器:AX咒循,BX据途,CX和DX。
- 上述四個16位寄存器的下半部分和上半部分可以用作八個8位數(shù)據(jù)寄存器:AH叙甸,AL颖医,BH,BL裆蒸,CH熔萧,CL,DH和DL。
不好理解佛致?上圖
其中一些數(shù)據(jù)寄存器在算術(shù)運算中有特定用途(注意贮缕,這個是重點)。
AX是主要累加器俺榆; 它用于輸入/輸出和大多數(shù)算術(shù)指令感昼。 例如,在乘法運算中肋演,根據(jù)操作數(shù)的大小抑诸,將一個操作數(shù)存儲在EAX或AX或AL寄存器中烂琴。
BX被稱為基址寄存器爹殊,因為它可以用于索引尋址。
CX被稱為計數(shù)寄存器奸绷,因為ECX梗夸,CX寄存器在迭代操作中存儲循環(huán)計數(shù)。
DX被稱為數(shù)據(jù)寄存器号醉。 它也用于輸入/輸出操作反症。 它還與AX寄存器以及DX一起使用,用于涉及大數(shù)值的乘法和除法運算
指針寄存器
指針寄存器是32位EIP畔派,ESP和EBP寄存器以及相應(yīng)的16位右部分IP铅碍,SP和BP。 指針寄存器分為三類
- 指令指針(IP)-16位IP寄存器存儲要執(zhí)行的下一條指令的偏移地址线椰。 與CS寄存器關(guān)聯(lián)的IP(作為CS:IP)給出了代碼段中當前指令的完整地址胞谈。
- 堆棧指針(SP)-16位SP寄存器提供程序堆棧內(nèi)的偏移值。 與SS寄存器(SS:SP)關(guān)聯(lián)的SP是指程序堆棧中數(shù)據(jù)或地址的當前位置憨愉。
- 基本指針(BP)-16位BP寄存器主要幫助參考傳遞給子例程的參數(shù)變量烦绳。 SS寄存器中的地址與BP中的偏移量相結(jié)合,以獲取參數(shù)的位置配紫。 BP也可以與DI和SI組合用作特殊尋址的基址寄存器径密。
大概就長這樣,SP和BP, 不要記成SB了躺孝!
索引寄存器
32位索引寄存器ESI和EDI及其最右邊的16位部分享扔。 SI和DI用于索引尋址,有時用于加法和減法植袍。 有兩組索引指針
- 源索引(SI)-用作字符串操作的源索引惧眠。
- 目標索引(DI)-用作字符串操作的目標索引。
上面就是我們可能會常用的一些寄存器奋单,除此之外锉试,還有兩個特別重要的也介紹一下。
控制寄存器
將32位指令指針寄存器和32位標志寄存器組合起來視為控制寄存器。
許多指令涉及比較和數(shù)學計算呆盖,并更改標志的狀態(tài)拖云,而其他一些條件指令則測試這些狀態(tài)標志的值,以將控制流帶到其他位置应又。
通用標志位是
- 溢出標志(OF)-指示有符號算術(shù)運算后數(shù)據(jù)的高階位(最左位)的溢出宙项。
- 方向標記(DF)-它確定向左或向右移動或比較字符串數(shù)據(jù)的方向。 DF值為0時株扛,字符串操作為從左至右的方向尤筐;當DF值為1時,字符串操作為從右至左的方向洞就。
- 中斷標志(IF)-確定是否忽略或處理外部中斷(例如鍵盤輸入等)盆繁。當值為0時,它禁用外部中斷旬蟋,而當值為1時油昂,它使能中斷。
- 陷阱標志(TF)-允許在單步模式下設(shè)置處理器的操作倾贰。我們使用的DEBUG程序設(shè)置了陷阱標志冕碟,因此我們可以一次逐步執(zhí)行一條指令。
- 符號標志(SF)-顯示算術(shù)運算結(jié)果的符號匆浙。根據(jù)算術(shù)運算后數(shù)據(jù)項的符號設(shè)置此標志安寺。該符號由最左位的高位指示。正結(jié)果將SF的值清除為0首尼,負結(jié)果將其設(shè)置為1挑庶。
- 零標志(ZF)-指示算術(shù)或比較運算的結(jié)果。非零結(jié)果會將零標志清零饰恕,零結(jié)果將其清零挠羔。
- 輔助進位標志(AF)-包含經(jīng)過算術(shù)運算后從位3到位4的進位;用于專業(yè)算術(shù)埋嵌。當1字節(jié)算術(shù)運算引起從第3位到第4位的進位時破加,將設(shè)置AF。
- 奇偶校驗標志(PF)-指示從算術(shù)運算獲得的結(jié)果中1位的總數(shù)雹嗦。偶數(shù)個1位清除奇偶校驗標志為0范舀,奇數(shù)個1位清除奇偶校驗標志為1。
- 進位標志(CF)-在算術(shù)運算后了罪,它包含一個高位(最左邊)的0或1進位锭环。它還存儲移位或旋轉(zhuǎn)操作的最后一位的內(nèi)容。
下表列出了16位標志寄存器中標志位的位置
也就是說泊藕,所有的標志位都在一個2個字節(jié)大小的寄存器(CF, 不是打游戲的那個)中辅辩。
段寄存器
段是程序中定義的用于包含數(shù)據(jù),代碼和堆棧的特定區(qū)域。 主要分為三個部分
- 代碼段-它包含所有要執(zhí)行的指令玫锋。 16位代碼段寄存器或CS寄存器存儲代碼段的起始地址蛾茉。
- 數(shù)據(jù)段-它包含數(shù)據(jù),常量和工作區(qū)撩鹿。 16位數(shù)據(jù)段寄存器或DS寄存器存儲數(shù)據(jù)段的起始地址谦炬。
- 堆棧段-包含數(shù)據(jù)或過程或子例程的返回地址。 它被實現(xiàn)為“堆椊诼伲”數(shù)據(jù)結(jié)構(gòu)键思。 堆棧段寄存器或SS寄存器存儲堆棧的起始地址。
除DS甫贯,CS和SS寄存器外吼鳞,還有其他段寄存器-ES(額外段),F(xiàn)S和GS获搏,它們提供了用于存儲數(shù)據(jù)的其他段赖条。
在匯編編程中失乾,程序需要訪問存儲器位置常熙。 段中的所有存儲位置都相對于段的起始地址。 段的起始地址可以是16或十六進制的整數(shù)碱茁,因此裸卫,所有此類存儲地址中最右邊的十六進制數(shù)字為0,通常不存儲在段寄存器中纽竣。
段寄存器存儲段的起始地址墓贿。 為了獲得數(shù)據(jù)或指令在段中的確切位置,需要一個偏移值(或位移)蜓氨。 為了引用段中的任何存儲位置聋袋,處理器將段寄存器中的段地址與該位置的偏移值進行組合。
示例
查看以下簡單程序穴吹,以了解匯編程序中寄存器的使用幽勒。 該程序在屏幕上顯示9個星星以及一條簡單消息
section .text
global _start ;must be declared for linker (gcc)
_start: ;tell linker entry point
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í)行,可以看到屏幕上打印出結(jié)果
Displaying 9 stars
*********
大家可以對照一下上一篇文章中的Hello world程序港令,加深一下這兩節(jié)內(nèi)容的理解啥容。
關(guān)注公眾號(知青語),資料和軟件都在里面顷霹。