用DEBUG的D命令得出這樣的效果:
|---------->0B1F就是"樓房"------>段地址
|
| |------>右邊的就是"單元號"--->偏移地址
| |
| | |-------->這部分就是"門戶號"----->變地址
| | |<------------------------------------------>|
0B1F:0100 00 80 FF 02 75 05 C6 46-00 00 C3 E8 8C EB B4 3B
0B1F:0110 CD 21 72 39 8B FA 33 C0-8B C8 49 26 34 00 0E 0B
'
'
'
[省略]
看完這個圖之後,是不是就很明了呢?但是聰明的人就會有疑問,那我們怎麼走進"門戶號(家)"呢?問得好,所以了為了可以走進"門戶號(家)",就出現了一個叫做"尋址方式"的概念!說白了,就是教你如何找到這個"門戶號(家)".呵呵!
好現在都明白了嗎?那你們就看看我是怎麼理解PC的尋址方式(通俗易懂):
在這我就只介紹比較難理解的:
1:寄存器直接尋址:
你就想成:其實你已經站在你要找的"門戶號(家)"面前了,直接敲門進去就OK了!
例子: MOV AX,[2000H]
MOV AX,2000H -->2000H為存放操作數單元號的符號地址
上面兩者是不等效的
2:寄存器間接尋址方式:
你就想成:你已經站在你要找的"門戶號(家)"的"單元號",你要找到它,必須知道它在當前"單元號"幾樓.假如它在6樓,那你就上到6樓就OK了!!注意,最高只有16樓,因為什麼呢?那就用DEBUG的D命令看看呀,慢慢數哦,呵呵!!
例子: MOV AX,[BX]
計算公式: 物理地址=16d*(DS)+(BX)
物理地址=16d*(DS)+(SI)
物理地址=16d*(DS)+(DI)
物理地址=16d*(SS)+(BP)
3:寄存器相對尋址方式:
你就想成:你要找的"門戶號(家)"其實就在你家的樓上或者樓下,你要找到它,就 必須知道它在你樓上幾樓,或者在樓下幾樓!就OK了!
例子: MOV AX,COUNT[SI]
MOV AX,[COUNT+SI]
其中 COUNT為位移量的符號地址
計算公式: 物理地址=16d*(DS)+(BX)+8位位移量
或+(SI) 或 16位位偏移量
或+(DI)
物理地址=16d*(SS)+(BP)+8位偏移量
4:基址變址尋址方式:
你就想成:你要找的"門戶號(家)"是跟住在同一棟樓的不同"單元號",你要找到它,就必須知道它是該棟的哪個"單元號",並且住在幾樓!那樣你就可以找到它了 !
例子: MOV AX,[BX][DI]
MOV AX,[BX+DI]
計算公式: 物理地址=16d*(DS)+(BX)+(SI)
或+(DI)
物理地址=16d*(SS)+(BP)+(SI)
或+(DI)
5:相對基址變址尋址方式:
你就想成:你就想成:你要找的"門戶號(家)"是跟住在同一棟樓的不同"單元號",它比你高幾層樓或者低幾層樓,然後用的你目前的樓數+/-就可以得出你要找的住在幾樓了!
例子: MOV,AX,MASK[BX][SI]
MOV,AX,MASK[BX+SI]
MOV,AX,[MASK+BX+SI]
以上三個例子是等效的!!
計算公式: 物理地址=16d*(DS)+(BX)+(SI)+8位位移量
或+(DI) 或 16位位偏移量
物理地址=16d*(SS)+(BP)+(SI)+8位位移量
或+(DI) 或 16位位偏移量
---------------------------------------------------------------------
呵呵,終於寫完了這篇教程,好累哦!! 是不是覺得我的思維很另類呀,要創新呀!
書上太理論了,我就創新一個,不知道你們看得懂嗎?
呵呵,反正你們不要!@##)(#$*!@(@我就行了,我很努力寫了!!!
下面,我舉個程序例子,讓你們加深印象!!!
----------------------------------------------------------------------
編程步驟:
1: 建立緩沖區,為輸入字符串(最多能輸入9個)
2: 取緩沖區的首地址,以便後面進行"寄存器間接尋址方式"
3: 利用"寄存器間接尋址方式"取得實際輸入字符個數,以便確認循環次數
4: 利用"寄存器間接尋址方式"輸入字符串的最後一個字符
5: 利用LOOP指令和2號顯示功能來進行倒著顯示
----------------------------------------------------------------------
;程序功能:任意輸入幾個字符(最多能輸入9個),按回車則倒著輸出!
data segment
user_string db 10,0,10 dup(?)
data ends
code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
lea dx,user_string ;建立輸入字符串緩沖區
mov ah,0ah
int 21h
xor si,si
xor bx,bx
mov bx,dx
mov cx,[bx+si+1] ;看這個就是"寄存器間接尋址方式"
xor ch,ch ;其目的就是取實際輸入字符個數
mov di,cx
lop: mov ah,2
mov dx,[bx+di+1];看這又是"寄存器間接尋址方式"
int 21h ;其目的就是取輸入字符串的最後一個字符
dec di
loop lop ;依次循環倒著輸出字符
mov ah,4ch
int 21h
code ends
end start
-----------------------------------------------------------------------