1. 程式人生 > >彙編中的定址方式

彙編中的定址方式

儲存器

  儲存器(Memory)是現代資訊科技中用於儲存資訊的記憶裝置。其概念很廣,有很多層次,在數字系統中,只要能儲存二進位制資料的都可以是儲存器;在積體電路中,一個沒有實物形式的具有儲存功能的電路也叫儲存器,如RAM、FIFO等;在系統中,具有實物形式的儲存裝置也叫儲存器,如記憶體條、TF卡等。

  計算機中全部資訊,包括輸入的原始資料、計算機程式、中間執行結果和最終執行結果都儲存在儲存器中。它根據控制器指定的位置存入和取出資訊。有了儲存器,計算機才有記憶功能,才能保證正常工作。計算機中的儲存器按用途儲存器可分為主儲存器(記憶體)和輔助儲存器(外存),也有分為外部儲存器和內部儲存器的分類方法。外存通常是磁性介質或光碟等,能長期儲存資訊。記憶體指主機板上的儲存部件,用來存放當前正在執行的資料和程式,但僅用於暫時存放程式和資料,關閉電源或斷電,資料會丟失。

  定址

  定址是資料恢復技術的基礎,是定位資料和扇區的關鍵。定址這個概念比較抽象,簡單的說是磁頭在碟片上定位資料的一個過程。如果你想找到你的計算機中的一個檔案,你可能會在Windows中先開啟我的電腦、分割槽、資料夾,再開啟你要找的檔案。這是表面的尋找檔案的過程,而磁頭在碟片的尋找過程就是定址。 定址在資料恢復中為什麼非常重要?因為當資料出現丟失的情況後,你在我的電腦、分割槽、資料夾下就找不到這個檔案了,甚至找不到資料夾和分割槽。

  計算機有多種定址方式,如立即數定址方式,暫存器定址,儲存器定址方式,與I/0埠有關的定址方式,又包括直接埠定址和間接埠定址。

  儲存器定址方式有哪些?

  儲存器定址方式的運算元存放在主儲存器中,用其所在主存的位置表示運算元。在這種定址方式下,指令中給出的是有關運算元的主存地址資訊。8088的儲存器空間是分段管理的。程式設計時採用邏輯地址;由於段地址在預設的或用段超越字首指定的段暫存器,所以採用偏移地址,稱之為有效地址(EffecTIve Address, EA) 1. 直接定址

  在這種定址方式下,指令中直接包含了運算元的有效地址,跟在指令操作碼之後。其預設的段地址在DS段暫存器中,可以採用段超越字首。

  例 將資料段中偏移地址2000H處的記憶體資料送至AX暫存器。 MOV AX, [2000H]

  該指令中給定了有效地址2000H, 預設與資料段暫存器DS一起構成運算元所在儲存單元的實體地址。

七種定址方式(立即定址、暫存器定址)

七種定址方式(立即定址、暫存器定址)

一、立即定址方式

運算元作為指令的一部分而直接寫在指令中,這種運算元稱為立即數,這種定址方式也就稱為立即數定址方式。

立即數可以是8位、16位或32位,該數值緊跟在操作碼之後。如果立即數為16位或32位,那麼,它將按“高高低低”的原則進行儲存。例如:

MOV AH, 80H   ADD AX, 1234H   MOV ECX, 123456H
MOV B1, 12H   MOV W1, 3456H   ADD D1, 32123456H

其中:B1、W1和D1分別是位元組、字和雙字單元。

以上指令中的第二運算元都是立即數,在組合語言中,規定:立即數不能作為指令中的第二運算元。該規定與高階語言中“賦值語句的左邊不能是常量”的規定相一致。

立即數定址方式通常用於對通用暫存器或記憶體單元賦初值。圖是指令“MOV AX, 4576H”儲存形式和執行示意圖。

二、暫存器定址方式

  指令所要的運算元已儲存在某暫存器中,或把目標運算元存入暫存器。把在指令中指出所使用暫存器(即:暫存器的助憶符)的定址方式稱為暫存器定址方式。
指令中可以引用的暫存器及其符號名稱如下:
  8位暫存器有:AH、AL、BH、BL、CH、CL、DH和DL等;
  16位暫存器有:AX、BX、CX、DX、SI、DI、SP、BP和段暫存器等;
  32位暫存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。
暫存器定址方式是一種簡單快捷的定址方式,源和目的運算元都可以是暫存器。


1、源運算元是暫存器定址方式
  如:ADD VARD, EAX  ADD VARW, AX   MOV VARB, BH等。
  其中:VARD、VARW和VARB是雙字,字和位元組型別的記憶體變數。在第4章將會學到如何定義它們。


2、目的運算元是暫存器定址方式
  如:ADD BH, 78h    ADD AX, 1234h   MOV EBX, 12345678H等。


3、源和目的運算元都是暫存器定址方式
  如:MOV EAX, EBX   MOV AX, BX     MOV DH, BL等。


  由於指令所需的運算元已儲存在暫存器中,或操作的結果存入暫存器,這樣,在指令執行過程中,會減少讀/寫儲存器單元的次數,所以,使用暫存器定址方式的指令具有較快的執行速度。通常情況下,我們提倡在編寫組合語言程式時,應儘可能地使用暫存器定址方式,但也不要把它絕對化。

七種定址方式(直接定址方式)

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

在通常情況下,運算元存放在資料段中,所以,其實體地址將由資料段暫存器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] ;兩者是等效的,均為直接定址

七種定址方式(暫存器間接定址方式)

運算元在儲存器中,運算元的有效地址用SI、DI、BX和BP等四個暫存器之一來指定,稱這種定址方式為暫存器間接定址方式。該定址方式實體地址的計算方法如下:



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

在不使用段超越字首的情況下,有下列規定:

若有效地址用SI、DI和BX等之一來指定,則其預設的段暫存器為DS;
若有效地址用BP來指定,則其預設的段暫存器為SS(即:堆疊段)。

例:假設有指令:MOV BX,[DI],在執行時,(DS)=1000H,(DI)=2345H,儲存單元12345H的內容是4354H。問執行指令後,BX的值是什麼?

解:根據暫存器間接定址方式的規則,在執行本例指令時,暫存器DI的值不是運算元,而是運算元的地址。該運算元的實體地址應由DS和DI的值形成,即: 

PA=(DS)*16+DI=1000H*16+2345H=12345H。

所以,該指令的執行效果是:把從實體地址為12345H開始的一個字的值傳送給BX。

其執行過程如圖所示。


七種定址方式(暫存器相對定址方式)

運算元在儲存器中,其有效地址是一個基址暫存器(BX、BP)或變址暫存器(SI、D

I)的內容和指令中的8位/16位偏移量之和。其有效地址的計算公式如公式所示。

在不使用段超越字首的情況下,有下列規定:
 
    若有效地址用SI、DI和BX等之一來指定,則其預設的段暫存器為DS;
 
    若有效地址用BP來指定,則其預設的段暫存器為SS。
 
指令中給出的8位/16位偏移量用補碼錶示。在計算有效地址時,如果偏移量是8位,則進行符號擴充套件成16位。當所得的有效地址超過0FFFFH,則取其64K的模。

例:假設指令:MOV BX, [SI+100H],在執行它時,(DS)=1000H,(SI)=2345H,記憶體單元12445H的內容為2715H,問該指令執行後,BX的值是什麼?

解:根據暫存器相對定址方式的規則,在執行本例指令時,源運算元的有效地址EA為:
 
EA=(SI)+100H=2345H+100H=2445H
 
該運算元的實體地址應由DS和EA的值形成,即:
 
PA=(DS)*16+EA=1000H*16+2445H=12445H。

所以,該指令的執行效果是:把從實體地址為12445H開始的一個字的值傳送給BX。

其執行過程如圖所示。


七種定址方式(基址加變址定址方式)

運算元在儲存器中,其有效地址是一個基址暫存器(BX、BP)和一個變址暫存器(SI、DI)的內容之和。其有效地址的計算公式如公式所示。

在不使用段超越字首的情況下,規定:如果有效地址中含有BP,則預設的段暫存器為SS;否則,預設的段暫存器為DS。

例:假設指令:MOV BX, [BX+SI],在執行時,(DS)=1000H,(BX)=2100H,(SI)=0011H,記憶體單元12111H的內容為1234H。問該指令執行後,BX的值是什麼?

解:根據基址加變址定址方式的規則,在執行本例指令時,源運算元的有效地址EA為:

EA=(BX)+(SI)=2100H+0011H=2111H

該運算元的實體地址應由DS和EA的值形成,即:

PA=(DS)*16+EA=1000H*16+2111H=12111H

所以,該指令的執行效果是:把從實體地址為12111H開始的一個字的值傳送給BX。

其執行過程如圖所示。


 

 

七種定址方式(相對基址加變址定址方式)

運算元在儲存器中,其有效地址是一個基址暫存器(BX、BP)的值、一個變址暫存器(SI、DI)的值和指令中的8位/16位偏移量之和。其有效地址的計算公式如公式所示。 

在不使用段超越字首的情況下,規定:如果有效地址中含有BP,則其預設的段暫存器為SS;否則,其預設的段暫存器為DS。

指令中給出的8位/16位偏移量用補碼錶示。在計算有效地址時,如果偏移量是8位,則進行符號擴充套件成16位。當所得的有效地址超過0FFFFH,則取其64K的模。

例:假設指令:MOV AX, [BX+SI+200H],在執行時,(DS)=1000H,(BX)=2100H,(SI)=0010H,記憶體單元12310H的內容為1234H。問該指令執行後,AX的值是什麼?

解:根據相對基址加變址定址方式的規則,在執行本例指令時,源運算元的有效地址EA為:

EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H

該運算元的實體地址應由DS和EA的值形成,即:

PA=(DS)*16+EA=1000H*16+2310H=12310H

所以,該指令的執行效果是:把從實體地址為12310H開始的一個字的值傳送給AX。其執行過程如圖所示。

從相對基址加變址這種定址方式來看,由於它的可變因素較多,看起來就顯得複雜些,但正因為其可變因素多,它的靈活性也就很高。比如:
  
用D1[i]來訪問一維陣列D1的第i個元素,它的定址有一個自由度,用D2[i][j]來訪問二維陣列D2的第i行、第j列的元素,其定址有二個自由度。多一個可變的量,其定址方式的靈活度也就相應提高了。

相對基址加變址定址方式有多種等價的書寫方式,下面的書寫格式都是正確的,並且其定址含義也是一致的。

MOV AX, [BX+SI+1000H]   MOV AX, 1000H[BX+SI]
MOV AX, 1000H[BX][SI]    MOV AX, 1000H[SI][BX]

但書寫格式BX [1000+SI]和SI[1000H+BX]等是錯誤的,即所用暫存器不能在“[“,”]”之外,該限制對暫存器相對定址方式的書寫也同樣起作用。

相對基址加變址定址方式是以上7種定址方式中最複雜的一種定址方式,它可變形為其它型別的儲存器定址方式。下表列舉出該定址方式與其它定址方式之間的變形關係。

什麼是儲存器定址?

比如MOV AL, [BP]
AL和BP都是暫存器,為什麼叫儲存器定址啊?
儲存器 定址是 暫存器 與儲存器間的 定址方式 。使用儲存器定址的 指令 ,其 運算元 通常存放在 程式碼段 之外的儲存區,如 資料段 堆疊段 和附加段。指令中,通常給出的是 儲存單元 地址或產生儲存單元地址的有關資訊。執行指令時,需要首先計算出資料存放的 有效地址 ,接著計算出其在儲存器中的 實體地址 ,然後訪問儲存器,讀取資料,再執行指令規定的基本操作。