1. 程式人生 > >暫存器與七種定址方式

暫存器與七種定址方式

一、暫存器

總共有14個16位暫存器,8個8位暫存器。

通用暫存器:

  資料暫存器:

  AH(8位)  AL(8位)  AX(16位)   (AX和AL又稱累加器)

  BH(8位)  BL(8位)  BX(16位)   (BX又稱基址暫存器,唯一作為儲存器指標使用暫存器)  

  CH(8位)  CL(8位)  CX(16位)   (計數器,CX用於字串操作,控制迴圈的次數,CL用於移位)

  DH(8位)  DL(8位)  DX(16位)   (資料,DX一般用來做32位的乘除法時存放被除數或者保留餘數)

  指標暫存器:

  SP 堆疊指標 (存放棧頂地址)

  BP 基址指標 (存放堆疊基址偏移)

  變址暫存器:

  主要用於存放某個儲存單元地址的偏移,或某組儲存單元開始地址的偏移,

  即作為儲存器(短)指標使用。作為通用暫存器,它們可以儲存16位算術邏輯運算中的操

  作數和運算結果,有時運算結果就是需要的儲存單元地址的偏移.

  SI 源地址  (源變址暫存器)

  DI 目的地址 (目的變址暫存器)

控制暫存器:

  IP 指令指標

  FLAG 標誌暫存器

   ① 進位標誌 CF,記錄運算時最高有效位產生的進位值。

   ② 符號標誌 SF,記錄運算結果的符號。結果為負時置1,否則置0。

   ③ 零標誌  ZF,運算結果為0時ZF位置1,否則置0。

   ④ 溢位標誌 OF,在運算過程中,如運算元超出了機器可表示數的範圍稱為溢位。溢位時OF位置1,否則置0。

   ⑤ 輔助進位標誌 AF,記錄運算時第3位(半個位元組)產生的進位值。

   ⑥ 奇偶標誌 PF,用來為機器中傳送資訊時可能產生的程式碼出錯情況提供檢驗條件。當結果運算元中1的個數為偶數時置1,否則置0。

段暫存器

  CS 程式碼段  IP

  DS 資料段  

  SS 堆疊段  SP BP

  ES 附加段

二、七種定址方式:

運算元是指令或程式的主要處理物件。如果某條指令或某個程式不處理任何運算元,那麼,該指令或程式不可能有資料處理功能。在CPU的指令系統中,除NOP(空操作指令)、HLT(停機指令)等少數指令之外,大量的指令在執行過程中都會涉及到運算元。所以,在指令中如何表達運算元或運算元所在位置就是正確運用匯編指令的一個重要因素。

在指令中,指定運算元或運算元存放位置的方法稱為定址方式。運算元的各種定址方式是用匯編語言進行程式設計的基礎,也是本課程學習的重點之一。

微機系統有七種基本的定址方式:立即定址方式、暫存器定址方式、直接定址方式、暫存器間接定址方式、暫存器相對定址方式、基址加變址定址方式、相對基址加變址定址方式等其中,後五種定址方式是確定記憶體單元有效地址的五種不同的計算方法,用它們可方便地實現對陣列元素的訪問。

另外,在32位微機系統中,為了擴大對儲存單元的定址能力,增加了一種新的定址方式——32位地址的定址方式

為了表達方便,我們用符號“(X)”表示X的值,如:(AX)表示暫存器AX的值。


助記圖:


1、立即定址方式:

運算元就包含在指令中。作為指令的一部分,跟在操作碼後存放在程式碼段。

這種運算元成為立即數。立即數可以是8位的,也可以是16位的。

例如:

    指令: MOV AX,1234H

      則: AX = 1234H

 在組合語言中,規定:立即數不能作為指令中的第一運算元(目的運算元)。

2、暫存器定址方式:

運算元在CPU內部的暫存器中,指令指定暫存器號。

對於16位運算元,暫存器可以是:AX、BX、CX、DX、SI、DI、SP和BP等。

對於8位運算元,暫存器可以是AL 、AH、BL、BH、CL、CH、DL、DH。

這種定址方式由於運算元就在暫存器中,不需要訪問儲存器(比如記憶體)來取得運算元因而可以取得較高的運算速度。

3、直接定址方式:

指令所要的運算元存放在記憶體中,在指令中直接給出該運算元的有效地址,這種定址方式為直接定址方式。

在通常情況下,運算元存放在資料段DS中,所以,其實體地址將由資料段暫存器DS和指令中給出的有效地址直接形成,但如果使用段超越字首,那麼,運算元可存放在其它段。

例:假設有指令:MOV BX, [1234H],在執行時,(DS)=2000H,記憶體單元21234H的值為5213H。問該指令執行後,BX的值是什麼?

解:根據直接定址方式的定址規則,把該指令的具體執行過程用下圖來表示。

從圖中,可看出執行該指令要分三部分:


由於1234H是一個直接地址,它緊跟在指令的操作碼之後,隨取指令而被讀出;

訪問資料段的段暫存器是DS,所以,用DS的值和偏移量1234H相加,得儲存單元的實體地址:21234H;

取單元21234H的值5213H,並按“高高低低”的原則存入暫存器BX中。

所以,在執行該指令後,BX的值就為5213H。
 

由於資料段的段暫存器預設為DS,如果要指定訪問其它段內的資料,可在指令中用段字首的方式顯式地書寫出來。

下面指令的目標運算元就是帶有段字首的直接定址方式。

MOV ES:[1000H], AX

直接定址方式常用於處理記憶體單元的資料,其運算元是記憶體變數的值,該定址方式可在64K位元組的段內進行定址。

注意:立即定址方式和直接定址方式的書寫格式的不同,直接定址的地址要寫在括號“[”,“]”內。在程式中,直接地址通常用記憶體變數名來表示,如:MOV BX, VARW,其中,VARW是記憶體字變數。

試比較下列指令中源運算元的定址方式(VARW是記憶體字變數):
  MOV AX, 1234H            MOV AX, [1234H] ;                前者是立即定址,後者是直接定址 
  MOV AX, VARW           MOV AX, [VARW] ;                兩者是等效的,均為直接定址


在組合語言指令中,可以用符號地址代替數值地址

如:MOV AX,VALUE

此時VALUE為存放運算元單元的符號地址。

如寫成:MOV AX,[VALUE]也是可以的,兩者是等效的。

如VALUE在附加段中,則應指定段超越字首如下:

MOV AX,ES:VALUE 或 MOV AX,ES:[VALUE]

4、暫存器間接定址方式:

運算元在暫存器中,運算元有效地址在SI、DI、BX、BP這四個暫存器之一中。在不使用段超越字首的情況下,如果有效地址在SI、DI和BX中,則以DS段暫存器中的內容為段值。如果有效地址在BP中,則以SS段暫存器中的內容為段值。該定址方式實體地址的計算方法如下:


暫存器間接定址方式讀取儲存單元的原理如圖所示:


例如:

MOV AX, [DI]

如果(DS) = 1000H            (DI) = 2345H

則實體地址 =  1000H * 16 + 2345H = 12345H

12345H地址中的內容為:4354H

執行該指令後,(AX) = 4354H

如圖所示:

 

5、暫存器相對定址方式:

運算元在儲存器中,運算元的有效地址是一個基址暫存器(BX、BP)或變址暫存器(SI、DI)的內容加上指令中給定的8位或16位位移量之和。

    BX    8位    位移量

EA(有效地址) =  BP  + 

    SI    16位    位移量

    DI

在一般情況下,如果SI、DI、或BX中的內容作為有效地址的一部分,那麼引用的段暫存器是DS;如果BP中的內容作為有效地址的一部分,那麼引用的段暫存器是SS。

實體地址 = 16d × (DS) + (BX) + 8

           或(SI)或16位位移量

           或(DI)

實體地址 = 16d × (SS) + (BP) + 8位位移量

                       或16位位移量

在指令中給定的8位或16位位移量採用補碼形式表示。在計算有效地址時,如位移量是8位,則被帶符號擴充套件成16位。

例如:

MOV AX,[DI+1223H]

假設,(DS) = 5000H,(DI) = 3678H

則實體地址 = 50000 + 3678 + 1233 = 5489BH

5489BH地址中的內容:55AAH

執行該指令後AX = 55AAH

下面指令中,源運算元採用暫存器相對定址,引用的段暫存器是SS: MOV BX,[BP-4]

下面指令中,目的運算元採用暫存器相對定址,引用的段暫存器是ES: MOV ES:[BX+5],AL

指令:MOV AX,[SI+3]與MOV AX,3[SI]是等價的

6、基址加變址定址方式:

運算元在暫存器中,運算元的有效地址由:

基址暫存器之一的內容與變址暫存器之一的內容相加

   BX   SI

即: EA =    + 

   BP   DI

在一般情況下,如果BP之內容作為有效地址的一部分,則以SS之內容為段值,否則已DS

為段值。

例如:

MOV AX,[BX][DI]

如:(DS)=2100H,

   (BX)=0158H,

   (DI)=10A5H

則EA=0158 + 10A5 = 11FD

實體地址=21000 + 11FD = 221FDH

221FDH地址中的內容:1234H

執行該指令後AX = 1234H

下面指令中,目的運算元採用基址加變址定址,

引用的段暫存器是DS: MOV DS:[BP+SI],AL

下面指令中,源運算元採用基址加變址定址,

引用的段暫存器ES: MOV AX,ES:[BX+SI]

這種定址方式使用與陣列或表格處理。用基址暫存器存放陣列首地址,而用變地暫存器

來定位陣列中的各元素,或反之。由於兩個暫存器都可改變,所以能更加靈活地訪問數

組或表格中的元素。

下面的兩種表示方法是等價的:

MOV AX,[BX+DI]

MOV AX,[DI][BX]

7、相對基址加變址定址方式:

運算元在儲存器中,運算元的有效地址由於基址暫存器之一的內容與變址暫存器之一的

內容及指令中給定的8位或16位位移量相加得到。

         BX    SI    8位

即: EA =     +     +      位移量

   BP    DI    16位

在一般情況下,如果BP中的內容作為有效地址的一部分,則以SS段暫存器中的內容為段

值,否則以DS段暫存器中的內容為段值。

在指令中給定的8位或16位位移量採用補碼形式表示。

在計算有效地址時,如果位移量是8位,那麼被帶符號擴充套件成16位。

當所得的有效地址操作FFFFH時,就取其64K的模

例如:

MOV AX,[BX+DI-2]

假設,(DS) = 5000H, (BX) = 1223H, DI = 54H, (51275) = 54H, (51276) = 76H

實體地址= 50000 + 1223 + 0054 + FFFE(-2 各位取反末位加一) = 51275H

執行該指令後 (AX) = 7654H

相對基址加變址這種定址方式的表示方法多種多樣,以下四種方法均是等價的:

MOV AX,[BX+DI+1234H], MOV AX,1234H[BX][DI]

MOV AX 1234H[BX+DI],  MOV AX,1234H[DI][BX]


相關推薦

方式

一、暫存器 總共有14個16位暫存器,8個8位暫存器。 通用暫存器:   資料暫存器:   AH(8位)  AL(8位)  AX(16位)   (AX和AL又稱累加器)   BH(8位)  BL(8位)  BX(16位)   (BX又稱基址暫存器,唯一作為儲

微機原理 方式

16位cpu 八個通用暫存器 指令指標IP 標誌暫存器FR 段暫存器 AX BX  CX DX BP SP SI DI 其中前四個又分為高八位和低八位 AX 累加器 BX 基址暫存器 CX 計數暫存器 DX 資料暫存器 BP 基址指標暫存器 SP 堆疊指標暫存器 

MIPS的、指令和方式的分類

MIPS的32個暫存器 助記符 編號 作用 zero 0 恆為0 at 1 (assembly temporary)保留給彙編器使用 v0,v1 2-3

運算元的方式間接,基址,間,比例間接

計算機中程式是由按一定順序排列的一系列指令,通常一條指令包括兩方面的內容:操作碼和運算元,操作碼決定要完成的操作,告訴計算機要幹什麼;運算元指參加運算的資料及其所在的單元地址。整條指令以二進位制編碼的形式存放在儲存器中。指令要進行操作,都有相應的資料參加,可是資

組合語言的方式

立即定址   指令中直接給出運算元 MOV A, #30H ;把立即數30H傳送到累加器A,執行後(A)=30H 直接定址   指令中直接給出運算元內部RAM單元地址 MOV A,

組合語言——彙編的8方式,以及2個預設段

1.立即定址方式 MOV AH, 80H(直接給暫存器賦值)2. 暫存器定址方式(源或者目的有一個是暫存器) 2.1) 源運算元是暫存器定址方式 如:ADD VARD, EAX  ADD VARW, AX   MOV VARB, BH等。 其中:VARD、VARW和VARB是雙字,字和位元組

彙編的8方式,以及2個預設段

16位CPU所含有的暫存器有(見圖2.1中16位暫存器部分): 4個數據暫存器(AX、BX、CX和DX) 2個變址和指標暫存器(SI和DI) 2個指標暫存器(SP和BP) ,32位CPU增加2個16位的段暫存器:FS和GS。 4個段暫存器(ES、CS、SS和DS) 1個指令

espebp介紹

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

儲存器物理區別

從根本上講,暫存器與RAM的物理結構不一樣。 一般暫存器是指由基本的RS觸發器結構衍生出來的D觸發,就是一些與非門構成的結構,這個在數電裡面大家都看過; RAM則有自己的工藝,一般1Bit由六MOS管構成。 所以,這兩者的物理結構不一樣也導致了兩者的效能不同。暫存器訪問

IA32x86-64的區別

IA32暫存器 一個IA32CPU包含一組8個儲存32位值的通用暫存器,這些暫存器用來儲存整數資料和指標: 31-0 15-0 15-8 7-0 使用慣例 %eax %ax %ah %al 呼叫者儲存 %ecx %cx %ch %cl 呼叫者

浮點數指令

暫存器 AVX浮點體系結構允許資料儲存在16個YMM暫存器中 255 127 0 %ymm0 %xmm0 1st FP arg.返回值 %ymm1 %xmm1 2nd FP引數 %ymm2 %x

詳細解析ESPEBP

               詳細解析ESP暫存器與EBP暫存器    最近在看彙編碼,經常在程式的開頭看到ESP和EBP暫存器的出現,由於本人基礎知識的不牢靠,便上網查閱相關的資料,可惜網上的資料都不給力,都只是流於形式,沒有好好的解釋這兩個東西是什麼.終於通過goo

8086彙編學習之[BX],CXloop指令,ES

一、彙編程式的基本格式: 1、基本格式與解析: assume cs:codeseg //assume假設CS暫存器與codeseg段有關聯,codeseg段本就是程式碼段 codeseg segment //段開始,codeseg為段名,可

64位彙編

 區別有:64位有16個暫存器,32位只有8個。但是32位前8個都有不同的命名,分別是e _ ,而64位前8個使用了r代替e,也就是r _。e開頭的暫存器命名依然可以直接運用於相應暫存器的低32位。而剩下的暫存器名則是從r8 - r15,其低位分別用d,w,b指定長度。32位使用棧幀來作為傳遞的引數的儲存位置

快取的區別

這裡的快取是指的CPU的快取。 按與CPU遠近來分,離得最近的是暫存器,然後快取,最後記憶體。 所以,暫存器是最貼近CPU的,而且CPU只與暫存器中進行存取。 (寄存的意思是,暫時存放資料,不中每次從記憶體中取,它就是一個臨時放資料的空間,火車站寄存處就是這個意思)

微控制器的幾方式

定址就是尋找指令中運算元或運算元所在的地址。所謂定址方式,就是如何找到存放運算元的地址,把運算元提取出來的方法。通常指源運算元的定址方式。 MCS-51系列微控制器定址方式共有七種:暫存器定址、直接定址、立即數定址、暫存器間接定址、變址定址、相對定址、位定址。 1、暫存器定址 暫

ARM的9方式

1)立即定址 運算元是立即數,以“#”為字首,表示 16 進位制數值時以“0x”表示。 例: MOV   R0,#0xFF00   ;0xFF00 ->  R0 SUBS   R0,R0,#1     ;R0 – 1 ->  R0 2)暫存器定址

組合語言入門:幾方式之比較

考慮到上一章的“定址方式”太重要了,遂單獨成章,作文於此 直接定址 適用於偏移地址為[idata]的情形 CS: IP存放程式碼指標(2000: 000E) 地址加法器合成C

ARM處理器 八方式

ARM處理器的八種定址方式: 前言:1.什麼是定址?資料都存在儲存器中,定址簡單地說就是找到儲存資料或指令的地址。儲存器有很多儲存單元,用於儲存資料。或者說,定址就是讀取資料所在儲存裝置中對應地址編號中儲存的內容。以儲存單位定址分為位,字,節,字,雙字定址。以功能定址分為直

C語言的本質(29)——C語言彙編之方式

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