iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
1
Security

逆向工程 – 從入門到放棄系列 第 6

Day6 - 為什麼要使用暫存器?

我在 Day2 的文章裡有講到暫存器(e.g. eax, ebx),可能對初學者而言相對陌生。這篇主要來介紹這些暫存器代表的意義與使用時機。

為什麼要使用暫存器?

透過下圖可以清楚原因。不難發現,暫存器位在金字塔的最頂端,雖然價格較高昂,但存取的速度可到達1~2ns 。對比我們買電腦的時候最在意的記憶體(Main memory),速度更是快上30~90倍。

Reference

暫存器的出現,目的是為了加速運算。原因是,暫存器可以直接儲存資料元素,如此一來,就不用從記憶體存取資料。因此,透過暫存器,可以讓電腦效能的提升。至於常聽到32位元跟64位元的電腦,差異就在一個使用32位元暫存器,另一個使用64位元暫存器。因此,簡單來說,使用64位元的暫存器效能應當比32位元的更好,因為它一次可以處理倍數的32位元資料量。

暫存器分類

主要分三大類:分別是 General registers, Control registers 與 Segment registers

General registers

以下介紹 General registers,我們先看圖:
下圖是 General registers 的種類

如何分辨64位元與32位元的暫存器?透過下圖可以發現,最長的區塊是64位元的暫存器,它是 R 開頭。如果遇到是 E 開頭的名稱,就是32位元的暫存器。

RAX 佔64位元,EAX 佔32位元, AX 佔16位元,AH 與 AL 分別佔8位元

General registers 可以再分三類

分別是 Data registers、Pointer registers、Index registers,今天先說明 Data registers。

Data registers

分別是 RAX, RBX, RCX, RDX。這4個 registers 主要用在算數、邏輯或其他運算。

總共有3種用法(可以搭配上面的圖):

  1. 全然使用 64-bit-> EAX, EBX, ECX, EDX
  2. 使用前1/2的 32-bit -> AX, BX, CX, DX
  3. 使用前1/2的 16-bit -> AH/L, BH/L, CH/L, DH/L

用途:

  1. AX -> 主要用以累加
  2. BX -> base registers:用以傳送索引 
  3. CX -> count registers:計算 loop 的個數
  4. DX -> data registers:用以累加,乘/除法時,若數字大與 AX 一同累加

結論

暫存器是提升電腦存取速度的主因,因此在組合語言有許多應用場景。明天,會接著說明,組合語言如何找到資料在記憶體中的位置!


上一篇
Day5 - 記憶體到底如何存放程式?
下一篇
Day7 - 組合語言- 不可不知之定址模式 - 上篇
系列文
逆向工程 – 從入門到放棄30

尚未有邦友留言

立即登入留言