匯編語言(5)--寄存器

處理器操作主要涉及處理數(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。

不好理解佛致?上圖

image

其中一些數(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了躺孝!

image

索引寄存器

32位索引寄存器ESI和EDI及其最右邊的16位部分享扔。 SI和DI用于索引尋址,有時用于加法和減法植袍。 有兩組索引指針

  • 源索引(SI)-用作字符串操作的源索引惧眠。
  • 目標索引(DI)-用作字符串操作的目標索引。
image

上面就是我們可能會常用的一些寄存器奋单,除此之外锉试,還有兩個特別重要的也介紹一下。

控制寄存器

將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位標志寄存器中標志位的位置

image

也就是說泊藕,所有的標志位都在一個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)注公眾號(知青語),資料和軟件都在里面顷霹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咪惠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子淋淀,更是在濱河造成了極大的恐慌遥昧,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炭臭,居然都是意外死亡叫乌,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門徽缚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來憨奸,“玉大人,你說我怎么就攤上這事凿试∨旁祝” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵那婉,是天一觀的道長板甘。 經(jīng)常有香客問我,道長详炬,這世上最難降的妖魔是什么盐类? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮呛谜,結(jié)果婚禮上在跳,老公的妹妹穿的比我還像新娘。我一直安慰自己隐岛,他們只是感情好猫妙,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著聚凹,像睡著了一般割坠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上妒牙,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天彼哼,我揣著相機與錄音,去河邊找鬼湘今。 笑死雕沿,一個胖子當著我的面吹牛督禽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼日杈,長吁一口氣:“原來是場噩夢啊……” “哼点待!你這毒婦竟也來了搔耕?” 一聲冷哼從身側(cè)響起矮嫉,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚪拦,沒想到半個月后杖剪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冻押,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年盛嘿,在試婚紗的時候發(fā)現(xiàn)自己被綠了洛巢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡次兆,死狀恐怖稿茉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芥炭,我是刑警寧澤漓库,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站园蝠,受9級特大地震影響渺蒿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜彪薛,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一茂装、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧善延,春花似錦少态、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至训挡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歧强,已是汗流浹背澜薄。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摊册,地道東北人肤京。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像茅特,于是被迫代替她去往敵國和親忘分。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 計算機通過執(zhí)行指令序列來使機器得以工作白修,所以對于每一系列的計算機都有指定的一組指令集供計算機使用妒峦,這組指令...
    未來科技工作室閱讀 7,994評論 1 10
  • 1.地址總線,數(shù)據(jù)總線兵睛,控制總線在哪里肯骇,它們有什么作用?答:它們都是cpu連接外部組件的線路窥浪。地址總線:地址總線A...
    MagicalGuy閱讀 1,456評論 0 1
  • 80X86微處理器 一、80x86系列微處理器概況: 8086笛丙、8088漾脂、80286、80386胚鸯、80486之后型...
    Zhou_qn閱讀 4,563評論 0 4
  • 匯編指令速查 匯編中各寄存器的作用4個數(shù)據(jù)寄存器(EAX骨稿、EBX、ECX和EDX)2個變址和指針寄存器(ESI和E...
    星星之火666閱讀 170評論 0 0
  • 一切竟然就這樣開始了姜钳。時間才不管那些有的沒的啊终,只顧裹挾著一切情愿的不情愿的、完成的未完成的向前走傲须。 我...
    Asa二十代不在家閱讀 366評論 0 2