組合語言之定址方式

2021-06-02 02:42:59 字數 3952 閱讀 3613

1 固定定址(inherent addressing )

特定的單運算元指令,運算元隱含在操作碼中,在固定定址的指令中,運算元被隱含在指令中,不需要執行匯流排週期,執行速度快

例子:1.1 cbw命令,將al中的符號位擴充套件到ah中,形成16位的運算元。比如al中的符號位是1,則執行cbw命令後,ah則變成ff,如果符號位是0,則ah則變成00

1.2 push ax ,源運算元是暫存器ax,目的運算元為堆疊頂部,將ax暫存器中的內容壓入堆疊

1.3 cwde命令,是32位彙編指令,將ax中的符號位擴充套件到eax的高位。

2  立即數定址 (immediate addressing)

立即數定址中,運算元包含在指令中,作為指令的一部分。特點:執行速度快,主要給暫存器賦值。同樣不需要執行匯流排週期。

例子:2.1 mov ax,14 ;主要給暫存器賦值,不能直接給段暫存器賦值,如不能mov ds/es/ss/cs ,立即數,會報錯

3 暫存器定址(register addressing)

說白了,就是運算元在暫存器中,直接去暫存器中尋找運算元。

例子:3.1 mov ax,bx ;兩個運算元都是暫存器定址,

執行-debug

-r 檢視暫存器中的值

-a 編輯彙編命令

輸入mov ax,12

mov [1234],ax,

然後檢視1234處的指令

-d ds:1234  ;驗證此時的值

然後執行兩次 -p命令,

然後執行-d ds:1234命令,可以看到1234處的值變了

4  儲存器定址(momory addressing)

資訊,執行指令時,cpu先根據指令提供的位址資訊,計算出偏移位址,用位址產生器產生出直接訪問的記憶體位址,再從記憶體中取到運算元,執行規定的操作。

注意點:

1 可以採用段跨越字首的方式來改變系統指定的預設段,(有的人叫段超越),預設的是ds段

2 串處理指令必須用es段

3 棧操作指令必須用ss段

4 指令必須在cs中

4.1 直接定址方式(direct addressing)

例子:mov al,[2000] ;源運算元是直接定址,目的運算元是暫存器存執,指令執行結果是將ds段中的偏移位址為2000的位元組單元傳送到al中

mov ax,[2000] ; 唯一與上一條不同的是將字單元傳送到ax中

mov ax ,es:[2000] ;段超越

mov dword ptr [1234] ,eax ;將eax中的32位雙字資料傳送到記憶體中,目的運算元採用的儲存器存執,源運算元採用暫存器存執。

4.2 暫存器間接定址方式(register indirect addressing)

指運算元的偏移位址存放在制定的暫存器中,暫存器作為指標指向記憶體單元,而運算元在儲存器中,這樣的暫存器稱為間址暫存器

在8086cpu中,只能使用bx,bp,si ,di 四個暫存器來充當儲存器位址來進行定址。bx,bp作為基址暫存器,si,di變址暫存器

當bx,si,di作為間址暫存器時,預設段暫存器在ds中,bp作為間址暫存器時,預設段暫存器為ss。

當然可以採用段超越改變段位址。

4.3 暫存器相對定址方式(register relative addrssing)

與暫存器間接定址方式類似,但不同的是,指令中還需要指定乙個位移量,對於16位系統來說,位移量是8位或16位,對於32系統來說,位移量是

8位或32位的位移量,位移量是乙個帶符號的整數。

mov ax,10h[si]  ;等值與mov ax,[si+10h]

4.4 基址變址定址方式(based indexed addressing)

運算元的偏移位址一部分在基址暫存器,一部分在變址暫存器,基址暫存器的內容加上變址暫存器的內容就是運算元的偏移位址,

例子:mov ax,[bx][si] 等價於mov ax,[bx+si]

4.5 相對基址變址定址方式(relative based indexed addressing)

帶位移量的基址變址定址方式稱為基址 變址定址方式。

例子:mov ax,100[bx][si]  ;段位址再ds中

mov ax,100[bp][si] ; 段位址再ss中

4.6 比例變址定址方式(scaled indexed addressing)

只有在32位及以後的80x86系統中使用,暫不介紹

5 i/o位址定址(

分為直接埠定址和間接埠定址

5.1 direct i/o port addressing

用00h-ffh表示最低的0-255個8位的i/o埠位址,就可以直接進行i/o埠定址,則可以定址256個。

in al,80h;將80h埠的資料輸入到al暫存器中

in ax,80h;將80h埠的資料輸入到ax暫存器中。

out 80h,al;位元組輸出指令,將al暫存器的內容輸入到80h埠

5.2 indirect i/o port addressing

如果埠大於256個,則可以定址65536個埠,必須使用間接定址,先把0000h-ffffh埠號存放到dx中,然後將dx暫存器中的值

mov ax,200h

out dx,al ; jiang al輸出到dx所指向的埠中

mov dx ,200h

in ax ,dx;將dx所指向的埠的乙個字輸入到ax暫存器中。

6  與轉移位址有關的定址

轉移分為段內轉移和段間轉移,段內轉移只是改變ip,並不改變cs,段間轉移都改變。

段內轉移和段間轉移,都可以使用直接定址和間接定址

6.1 段內直接定址 (intra segment indirect addressing)

jmp label ;label 為轉移的位址符號,也稱標號,

具體例子如下:

jmp short s

add ax,1

s:inc ax

當執行到jmp short s 後,會跳轉到inc ax 執行。

6.2 段內間接定址(intra segment indirect addressing)

jmp bx ;bx內容傳送到ip暫存器中,作為段內偏移位址

jmp word ptr [bp] ;bp指向的記憶體單元的乙個字傳送到ip,作為偏移位址

jmp word ptr[bp +val] ;bp+val指向的記憶體單元的乙個字送給ip,作為偏移位址

z6.3  段間直接定址(inter segment direct addressing)

段間定址和段內直接定址類似,指令中直接給出轉移位址,與段內定址不同的是,段內直接定址時,指令中提供了轉移位址的段位址和偏移位址

將其中的段位址傳送給cs,偏移位址傳給ip. 完成程式控制間的段間轉移

6.4 段間間接定址(inter segment indirect addressing)

間接的獲取轉移的段位址和偏移位址,目的位址的段位址和偏移位址存放在記憶體中,這裡儲存單元的位址是由指令制定儲存器定址方式獲取的

指令的格式:

jmp dword ptr [si] ;定址方式為儲存器定址方式, dword ptr  為雙字操作符,說明轉移位址需取雙字為段間轉移位址,其中高字是段位址。轉入cs,低字轉入ip.

jmp dword ptr [addr]    ;在32位系統中,使用儲存器定址方式獲取記憶體單元的48位指標,其中的低32位送eip暫存器,高16位從cs暫存器,就能取得轉移位址

組合語言之定址方式

如 mov ax,2a78 表示將乙個記憶體單元中的資料送入ax,這個記憶體單元的長度為2位元組 字單元 存放乙個字,偏移位址為2a78h,段位址 在ds中。如 mov al,10f3 表示將乙個記憶體單元中的資料送入al,這個記憶體單元的長度為1位元組 位元組單元 存放乙個位元組,偏移位址為10f...

組合語言之定址方式

目錄 定址方式 立即數定址方式 暫存器定址方式 儲存器定址方式 轉移位址定址 參照自 立即數 imm 可以是8位數值,也可以16位數值。立即數定址方式常用來給暫存器賦值 mov ax,1234h 運算元存放在cpu的內部暫存器中,通用暫存器 ax,bx,cx,dx,si,di,bp,sp 段暫存器 ...

組合語言之定址方式

1 固定定址 inherent addressing 特定的單運算元指令,運算元隱含在操作碼中,在固定定址的指令中,運算元被隱含在指令中,不需要執行匯流排週期,執行速度快 例子 1.1 cbw命令,將al中的符號位擴充套件到ah中,形成16位的運算元。比如al中的符號位是1,則執行cbw命令後,ah...