1. 程式人生 > >組合語言之暫存器(詳細介紹)

組合語言之暫存器(詳細介紹)




1、暫存器

32位暫存器有16個,分別是:

4個數據暫存器(EAX、EBX、ECX、EDX)。

2個變址和指標暫存器(ESI和EDI);2個指標暫存器(ESP和EBP)。

6個段暫存器(ES、CS、SS、DS、FS、GS)。

1個指令指標暫存器(EIP);1個標誌暫存器(EFlags)。


2、資料暫存器

資料暫存器主要用來儲存運算元和運算結果等資訊,從而節省讀取運算元所需佔用匯流排和訪問儲存器的時間。

32位CPU有4個32位通用暫存器:EAX、EBX、ECX和EDX。對低16位資料的取存,不會影響高16

位的資料,這些低16位暫存器分別命名為AX、BX、CX和DX,它和先前的CPU中的暫存器相一致。

4個16位暫存器又可分割成8個獨立的8位暫存器(AX:ah~al、BX:bh~bl、CX:ch~cl:DX:dh~dl)。

每個暫存器都有自己的名稱,可獨立存取。程式設計師可利用資料暫存器的這種“可合可分”的特性,靈活地處理字/

位元組的資訊。

AX和al通常稱為累加器,用累加器進行的操作可能需要更少時間,累加器可用於乘、除、輸入/輸出等操作,

它們的使用頻率很高。

BX稱為基地址暫存器,它可作為儲存器指標來使用。

CX稱為計數暫存器,在迴圈和字串操作時,要用它來控制迴圈次數;在位操作中,當移多位時,要用cl來

指明位移的位數。

DX稱為資料暫存器,在進行乘、除運算時,它可以為預設的運算元參與運算,也可用於存放I/O的埠地址。

在16位CPU中,AX、BX、CX和DX不能作為基址和變址暫存器來存放儲存單元的地址,但在32位CPU

中,其32位暫存器EAX、EBX、ECX和EDX不僅可傳送資料、暫存資料、儲存算術邏輯運算結果,而且也可

作為指標暫存器,所以,這些32位暫存器更具有通用性。


3、變址暫存器

32位CPU有2個32位通用暫存器ESI和EDI,其低16位對應先前CPU中的SI和DI,對低16位資料的

存取,不影響高16位的資料。

ESI、EDI、SI和DI稱為變址暫存器,它們主要用於存放儲存單元在段內的偏移量,用它們可實現多種儲存器

運算元的定址方式,為以不同的地址形式訪問儲存單元提供方便。

變址暫存器不可分割成8位暫存器,作為通用暫存器,也可儲存算術邏輯運算的運算元和運算結果。

它們可作一般的儲存器指標使用,在字串操作指令的執行過程中,對它們有特定的要求,而且還具有特殊的

功能。


4、指標暫存器

32位CPU有2個32位通用暫存器EBP和ESP,其低16位對應先前CPU中的BP和SP,對低16位數

據的存取,不影響高16位的資料。

EBP、ESP、BP和SP稱為指標暫存器,主要用於存放堆疊記憶體儲單元的偏移量,用它們可實現多種儲存器

運算元的定址方式,為以不同的地址形式訪問儲存單元提供方便。

指標暫存器不可分割成8位暫存器,作為通用暫存器,也可儲存算術邏輯運算的運算元和運算結果。

它們主要用於訪問堆疊內的儲存單元,並且規定:

BP為基指標暫存器,用它可直接存取堆疊中的資料。

SP為堆疊指標暫存器,用它只可訪問棧頂。


5、段暫存器

段暫存器是根據記憶體分段的管理模式而設定的。記憶體單元的實體地址由段暫存器的值和一個偏移量組合而成

的,這樣可用兩個較少位數的值組合成一個可訪問較大物理空間的記憶體地址。

32位CPU有6個段暫存器,分別如下:

CS:程式碼段暫存器    ES:附加段暫存器

DS:資料段暫存器    FS:附加段暫存器

SS:堆疊段暫存器    GS:附件段暫存器

在16位CPU系統中,只有4個段暫存器,所以,程式在任何時刻至多有4個正在使用的段可直接訪問,在

32位微機系統中,它有6個段暫存器,所以在此環境下開發的程式最多可同時訪問6個段。

32位CPU有兩個不同的工作方式:實方式和保護方式。在每種方式下,段暫存器的作用是不同的,有關規定

簡單描述如下:

實方式:段暫存器CS、DS、ES和SS與先前CPU中的所對應的段暫存器的含義完全一致,記憶體單元的邏輯

地址仍為“段地址:偏移地址”的形式,為訪問某記憶體段內的資料,必須使用該段暫存器和儲存單元的偏移地址。

    保護方式:在此方式下,情況要複雜得多,裝入段暫存器的不再是段值,而是稱為“選擇子”的某個值。


6、指令指標暫存器


32位CPU把指令指標擴充套件到32位,並記作EIP,EIP的低16位與先前CPU中的IP作用相同。

指令指標EIP、IP是存放下次將要執行的指令在程式碼段的偏移地址,在具有預取指令功能的系統中,下次要執

行的指令通常已被預取到指令佇列中,除非發生轉移情況,所以,在理解它們的功能時不考慮存在指令佇列的情

況。

在實方式下,由於每個段的最大範圍為64KB,所以,EIP的高16位肯定都為0,此時,相當於只用其低16

位的IP來反映程式中的指令的執行次序。


7、標誌暫存器

1.運算結果標誌位。一共6個,包括:CF進位標誌位、PF奇偶標誌位、AF輔助進位標誌位、ZF零標誌位、

SF符號標誌位、OF溢位標誌位。

2.狀態控制標誌位。一共3個,包括:TF追蹤標誌位、IF中斷允許標誌位、DF方向標誌位。

以上標誌位在第7章裡都講過了,在這裡就不再解釋了,現在講講32位標誌暫存器增加的4個標誌位。

1. I/O特權標誌IOPL。

IOPL用兩位二進位制位來表示,也稱為I/O特權級欄位,該欄位指定了要求執行I/O指令的特權級,如果當前

的特權級別在數值上小於等於IOPL的值,那麼,該I/O指令可執行,否則將發生一個保護異常。

2. 巢狀任務標誌NT。

NT用來控制中斷返回指令IRET的執行。具體規定如下:

(1)     當NT=0,用堆疊中儲存的值恢復EFlags、CS和EIP,執行常規的中斷返回操作。

(2)     當NT=1,通過任務轉換實現中斷返回。

3. 重啟動標誌RF。

RF用來控制是否接受除錯故障。規定:RF=0時,表示接受,否則拒絕。

4. 虛擬8086方式標誌VM。

如果VM=1,表示處理機處於虛擬的8086方式下的工作狀態,否則,處理機處於一般保護方式下的工作狀態。


8、32位地址的定址方式

最後說一下32位地址的定址方式。在前面我們學習了16位地址的定址方式,一共有5種,在32位微機系統

中,又提供了一種更靈活、方便但也更復雜的記憶體定址方式,從而使記憶體地址的定址範圍得到了進一步擴大。

在用16位暫存器來訪問儲存單元時,只能使用基地址暫存器(BX和BP)和變址暫存器(SI和DI)來作為

偏移地址的一部分,但在用32位暫存器定址時,不存在上述限制,所有32位暫存器(EAX、EBX、ECX、

EDX、ESI、EDI、EBP、和ESP)都可以是偏移地址的一個組成部分。

當用32位地址偏移量進行定址時,偏移地址可分為3部分:

1. 一個32位基址暫存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP)。

2. 一個可乘以1、2、4、8的32位變址暫存器(EAX、EBX、ECX、EDX、ESI、EDI和EBP)。

3. 一個8位~32位的偏移常量。

比如,指令:mov ebx, [eax+edx*2+300]

Eax就是基址暫存器,edx就是變址暫存器,300H就是偏移常量。

上面那3部分可進行任意組合,省去其中之一或之二。

下面列舉幾個32位地址定址指令:

Mov ax, [123456]

Mov eax, [ebx]

Mov ebx, [ecx*2]

Mov ebx, [eax+100]

Mov ebx, [eax*4+200]

Mov ebx, [eax+edx*2]

Mov ebx, [eax+edx*4+300]

Mov ax, [esp]

由於32位定址方式能使用所有的通用暫存器,所以,和該有效地址相組合的段暫存器也就有新的規定,具體

規定如下:

1. 地址中暫存器的書寫順序決定該暫存器是基址暫存器還是變址暫存器。

如:[ebx+ebp]中的ebx是基址暫存器,ebp是變址暫存器,而[ebp+ebx]中的ebp是基址暫存器,ebx是變

址暫存器,可以看出,左邊那個是基址暫存器,另一個是變址暫存器。

2. 預設段暫存器的選用取決於基址暫存器。

3. 基址暫存器是ebp或esp時,預設的段暫存器是SS,否則,預設的段暫存器是DS。

4. 在指令中,如果顯式地給出段暫存器,那麼顯式段暫存器優先。

下面列舉幾個32位地址定址指令及其記憶體運算元的段暫存器。

指令列舉:          訪問記憶體單元所用的段暫存器

mov ax, [123456]    ;預設段暫存器為DS。

mov ax, [ebx+ebp]    ;預設段暫存器為DS。

mov ebx, [ebp+ebx]    ;預設段暫存器為SS。

mov ebx, [eax+100]    ;預設段暫存器為DS。

mov edx, ES:[eax*4+200]    ;顯式段暫存器為ES。

mov [esp+edx*2], ax    ;預設段暫存器為SS。

mov ebx, GS:[eax+edx*8+300]    ;顯式段暫存器為GS。

mov ax, [esp]    ;預設段暫存器為SS。

相關推薦

組合語言(詳細介紹)

 1、暫存器 32位暫存器有16個,分別是: 4個數據暫存器(EAX、EBX、ECX、EDX)。 2個變址和指標暫存器(ESI和EDI);2個指標暫存器(ESP和EBP)。 6個段暫存器(ES、CS、SS、DS、FS、GS)。 1個指令指標暫存器(EIP);1個標誌暫

組合語言(記憶體訪問)

其實那些資料段,程式碼段,都是人自己定義的,CPU可不會這麼想,它執行程式碼的時候,它只跟著CS:IP走,CS:IP指向哪裡,他就認為哪裡是程式碼,並執行它。所以如果想讓CPU執行我們放在記憶體中的程

組合語言 標誌

標誌暫存器 CPU內部的暫存器中,有一種特殊的暫存器(對於不同的處理機,個數和結構都可能不同)具有三種作用: 1) 用來儲存相關指令的某些執行結果; 2) 用來為CPU執行相關指令提供行為依據; 3) 用來控制CPU的相關工作方式。 這種特殊的暫存器在8086C

iOS安全攻防(十一)arm彙編簡介

2014-12-13 21:10 by 16位元組, ... 閱讀, ... 評論, 收藏, 編輯 iOS安全攻防必須掌握arm彙編,這裡先簡要介紹arm中暫存器。 這是第一篇帖子,簡要說下arm的各個暫存器的功能。 R0-R3:用於

組合語言基礎-(一)

      好久沒寫文章了,上次系統學習使用匯編語言的時間大概是在12年前,雖然工作也從事JAVA WEB應用系統方面的開發,但和彙編基本沒交集,上大學時自己就對組合語言和編譯原理非常感興趣,可惜當時限於自己的環境,沒辦法深入學習更進一步,現在雖然工作好多年了,但心中一直想

Exyons4412音訊驅動----初始化讀寫流程(一)

核心載入驅動: module_init(snd_soc_init);  載入完成之後進入:snd_soc_init() 初始化函式 static int __init snd_soc_init(void) { #ifdef CONFIG_DEBUG_FS snd_soc

CUDA學習--記憶體處理(2)

1. 暫存器 GPU上一個SM可以看成一個多執行緒的CPU核。一般CPU擁有二、四、八個核。但一個GPU卻有N個SM核。但這裡需要注意的是,所有的工作都是有SM上的SP(流處理器)處理的。每個核上SP數目不同,因此每個核支援的執行緒數目也會有很大的不同。事實上

C語言的本質(29)——C語言與彙編和定址方式

x86的通用暫存器有eax、ebx、ecx、edx、edi、esi。這些暫存器在大多數指令中是可以任意選用的,比如movl指令可以把一個立即數傳送到eax中,也可傳送到ebx中。但也有一些指令規定只能用其中某些暫存器做某種用途,例如除法指令idivl要求被除數在eax暫存器中

組合語言第三章(記憶體訪問)

3.1  在CPU中,用一個16位暫存器來儲存一個字,一個字兩個位元組,高8位存放高位位元組,低8位存放低位位元組,低位元組所在的記憶體單元稱為起始地址。 3.2 3.3 8086CPU中,通常用DS暫存器來存放要訪問資料的段地址(字或者位元組) 舉個例子: mov bx,1000H mov

esp與ebp介紹

esp暫存器與ebp暫存器介紹 2013年09月21日 03:04:15 傷心小鴕鳥 閱讀數:974 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/westboy666/article/details/11858225

介紹

一個典型的CPU由運算器、控制器、暫存器等器件構成,分工如下: a) 運算器進行資訊處理; b) 暫存器進行資訊儲存; c) 控制器控制各種器件進行工作; d) 內部匯流排連線各種器件,在它們之間進行資料的傳送。 對於彙編程式設計師來說,CPU中的主要部件是暫存器,暫存器是CPU中程式設計師可以用指

STM32 系列 DAC 運用於理解

在這裡,我也不多BB,基本是看了原子的PDF之後,自己理解。所以可能比較簡略 單個DAC通道如下: VDDA 和VSSA為模擬電源端。   輸出電壓 = Vref+ * (DORx/2^n)          &

組合語言第3章 (記憶體訪問)

*****本章學習***** 3.1 字資料在記憶體中的儲存 (1)字單元,即存放一個字型資料(16位)的記憶體單元,由兩個地址連續的記憶體單元組成 (2)高地址記憶體單元中存放字型資料的高位位元組,低地址記憶體單元中存放字型資料的低位位元組 ps:這個知識點讓我想起了暫存器當中的高8位位元組和低8位

組合語言入門教程(2)----

目錄 文章目錄 目錄 摘要 1.通用暫存器 2.幾條彙編指令 3.實體地址的方法 4.CS和IP 摘要 本節主要記錄自己學習組合語言的過程。主要參考組合語言這本教材。

UVM三:模型的整合(上)

本文轉自:http://www.eetop.cn/blog/html/28/1561828-6266220.html 我們在上一節大致瞭解了與暫存器相關的流程,包括暫存器描述檔案和UVM暫存器模型生成。從上節給的暫存器模型流程圖中我們可以看到,接下來需要考慮選擇與DUT暫存器介面一致的匯流排UV

UVM二:模型概覽(下)

本文轉自:http://www.eetop.cn/blog/html/28/1561828-6266219.html 暫存器模型構建 在構建UVM暫存器模型的過程中,讀者需要了解下面這些與模型構建相關的類和它們的功能:     簡化後的MCDF暫存器模

UVM七:模型的常規方法(下)

本文轉自:http://www.eetop.cn/blog/html/28/1561828-6266224.html mem與reg的聯絡和差別 UVM暫存器模型也可以用來對儲存建模。uvm_mem類可以用來模擬RW(讀寫)、RO(只讀)和WO(只寫)型別的儲存,並且可以配置其模型的資料寬度

UVM六:模型的常規方法(上)

本文轉自:http://www.eetop.cn/blog/html/28/1561828-6266223.html mirrored、desired和actual value 在我們應用暫存器模型的時候,除了利用它的暫存器檔案資訊,也會利用它來跟蹤暫存器的值。跟蹤暫存器的值,一方面是建立m

UVM五:模型的整合(下)

本文轉自:http://www.eetop.cn/blog/html/28/1561828-6266222.html 前門訪問 利用暫存器模型,我們可以更方便地對暫存器做操作。接下來我們分別兩種訪問暫存器的方式,即前門訪問(front-door)和後門訪問(back-door)。前門訪問,顧

UVM四:模型的整合(中)

本文轉自:http://www.eetop.cn/blog/html/28/1561828-6266221.html MCDF暫存器模組程式碼 下面我們給出實現後的MCDF暫存器RTL設計程式碼:     上面的設計中採取了巨集的