8086 CPU 尋址方式
8086 CPU 尋址方式靈活。有以下幾種
idata 表示常量
1. [ idata ] 用一個常量來表示地址,可用於直接定位內存單元,但是在 MASM中要顯實在的說明 ds 段寄存器, 比如 mov ax, ds:[0] ,表示把 ds 寄存器中所在段的地址+偏移地址 0 的內存單元中的值賦給ax , 不能用
mov ax, [0] ,這樣在masm 中會當作mov ax, 0, 在windows的 debug 和 nasm 中可以用 mov ax, [..] 的方式定位內存,段地址默認放在 ds 中。
2. [bx] 用一個變量來表示內存地址,可用於間接定位一個內存單元。 比如 mov ax, [bx] ,段地址默認放在ds 中
3. [bx+idata] 用一個變量加常量表示內存地址,可在一個其實地址的基礎上用變量間接定位一個內存單元
比如:
mov ax, [bx+idata]
mov ax, [idata+bx]
mov ax, idata[bx]
都是等價的,相當於高級語言中的數組表示方法。
4. [bx+si] 用兩個變量表示地址。
5. [bx+di] 等價於 [bx+si].
6. [bx+si+idata] 用兩個變量和一個常量表示地址。
7 [bx+di+idata] 等價於 [bx+si+idata].
關於 bx,si,di,bp
在 8086 CPU 中,只有這四個寄存器可以用在 [...] 中進行內存單元的尋址,比如
mov ax, [bx]
mov ax, [bx+si]
mov ax, [bx+di]
mov ax,[ bp]
mov ax, [bp+si]
mov ax, [bp+di]
在[..]中,bx,di,si,bp,可以單個出現,但是只能以四種組合方式出現
bx和si, bx和di, bp和si, bp和di
比如
mov ax,[bx+bp]
mov ax,[si+di]
這兩條指令是錯誤的。
只要在[...]中使用寄存器bp, 而指令中沒有顯實的給出段地址,段地址默認在 ss 中
mov ax, [bp] 段地址在 ss中
mov ax,[bp+idata] 段地址在 ss中
mov ax,[bp+si] 段地址在 ss中
mov ax, [bp+si+idata] 段地址在 ss中
也可以顯實的指定段寄存器
mov ax, ds:[bp]
mov ax, es:[bx]
mov ax, ss:[bx]
mov ax ,cs:[bx+si]
-------------------------------------------------------------------------------------------------
尋址方式總結
尋址方式 名稱
[idata] 直接尋址
[bx] 寄存器間接尋址
[si] 寄存器間接尋址
[di] 寄存器間接尋址
[bp] 寄存器間接尋址
[bx+idata] 寄存器相對尋址
[ si+idata] 寄存器相對尋址
[di +idata] 寄存器相對尋址
[bp+ idata] 寄存器相對尋址
[bx+si] 基址變址尋址
[bx+di] 基址變址尋址
[bp+si] 基址變址尋址
[bp+di] 基址變址尋址
[bx+si+idata] 相對基址變址尋址
[bx+di+idata] 相對基址變址尋址
[bp +si +idata] 相對基址變址尋址
[bp+di+idata] 相對基址變址尋址
http://blog.csdn.net/daiyutage/article/details/9141251
8086 CPU 尋址方式