所需知識點:乙個暫存器可以儲存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 段暫存器作為目標運算元的段暫存器 一般的資料...