80x86的7種定址方式

2021-10-04 14:26:50 字數 1908 閱讀 1431

所需知識點:乙個暫存器可以儲存16bit資訊,即1個字,也可以分成2部分(高位位元組和低位位元組),每部分儲存8bit即1位元組

在8086中只有bx,bp,si,di可以在"[…]"中進行記憶體單元的定址

運算元在指令中,緊跟在操作碼之後,這樣的運算元成為立即數

例如:mov al,12h

mov ax,1234h

用乙個常量來表示位址,可用於直接定位乙個記憶體單元。

運算元的位址中的偏移量直接跟在操作碼之後,預設情況下基址存放在ds中,這個時候不需要加字首。如果是加了別的字首,如es,則表示基址在es中。

例如:mov ax,[40h]

運算元在cpu的暫存器中,指令指定暫存器號,這種定址速度快,它不需要訪問儲存器中的運算元,因為所有的運算元都在暫存器中。

例如:mov ds,ax

mov al,dh

用乙個變數表示位址

運算元在儲存器中,運算元有效位址在si,di,bx,bp這四個暫存器之一中,在一般情況下,如果有效位址在si,di和bx中,則以ds段暫存器之內容為段值。如果有效位址在bp中,則以ss段暫存器之內容為段值

例如:mov ax,[bx] 或 mov ax,[si]或 mov ax,[di]-----ds基址

mov ax,[bp]-----ss基址

對於bx暫存器來說,使用ds作為基址暫存器.例如:mov ax,count[bx] ------ds基址

對於bp暫存器來說,使用ss作為基址暫存器.例如:mov ax,count[bp] ------ss基址

注:si,di與bx的唯一區別是si,di不可拆分為2部分

mov ax, count[si]
在程式設計時,我們可以將一組記憶體單元定義為乙個段,這個完全取決於我們

但段的長度必須<=64kb的連續位址,且起始位址為16的倍數

如:123b0h—123b9h

這個段記憶體的段位址就是1230h,長度就是10個位元組了,5個字

那麼問題來了——為什麼要*16d?

80x86將16位位址匯流排擴充套件成了20位位址,段位址左移4位即乘16

比如段位址ds=2000h,偏移位址bx=0040h,則實體地址=20040h

用兩個變數表示位址,注意只有4種組合方式

例如:mov ax,[bx][si] 原變址定址

mov ax,[bp][si]

mov ax,[bx][di] 目的變址定址

mov ax,[bp][di]

可以用來表示陣列

;實現將陣列si複製到陣列di

mov ax,

2000h

mov ds,ax

mov si,

00h mov di,

10h mov bx,

00hs: mov ax,si[bx]

mov di[bx]

,ax add bx,

1h loop s;迴圈給bx賦值

用兩個變數和乙個常量定址

ea=ds16+bx+si(或di)+disp(8位或16位偏移量)

ea=ss16+bp+si(或di)+disp(8位或16位偏移量)

例如:mov ax, [bx+si+count]

可以這樣子記憶:

基址:出現[ax]、[bx]等

變址:出現[si]、[di]

相對:出現常量[count]

80X86定址方式

1 與定址相關的暫存器 8086 暫存器 段暫存器cs ds es ss 基址暫存器bx bp 變址暫存器di si 專用暫存器ip sp 具體每個暫存器的作用就不仔細介紹了。80386 及其以上的暫存器 段暫存器cs ds es ss fs,gs 基址暫存器eax ebx ecx edx ebp ...

80X86定址方式總結

一 概論 擇子存放在六個段暫存器 cs,ss,ds,es,fs,gs 中 段總是由 cs 段暫存器來指示 堆疊段總是由 ss 段暫存器來指示 字元處理指令總是使用 es 段暫存器作為目標運算元的段暫存器 一般的資料段可用 ds es fs gs來指示,但 ds 作為資料段的預設段暫存器,用它來定址比...

80X86定址方式總結

80x86定址方式總結 sandrain zeq的專欄 部落格頻道 csdn.net 一 概論 擇子存放在六個段暫存器 cs,ss,ds,es,fs,gs 中 段總是由 cs 段暫存器來指示 堆疊段總是由 ss 段暫存器來指示 字元處理指令總是使用 es 段暫存器作為目標運算元的段暫存器 一般的資料...