一、首先
P33:
嚴格來說有三種尋址方式
- 與數據有關的尋址方式
- 與轉移指令或過程調用指令有關的尋址方式
- 與IO指令有關的尋址方式
這篇博客只講1.2兩條
二、然后
1. 與數據有關的尋址方式
數據
,這個東西主要來自寄存器
,立即數
,內存
,知道這個,就比較好辦了
以下表格順序與書本中不同。
尋址方式 | 講解 |
---|---|
立即尋址 | 指令所需的操作數直接包含在指令代碼中,就是常說的立即數 注意,立即數有8/16位兩種,在使用時要求與另一個操作數長度匹配 且只能出現在源操作數位置 |
直接尋址 | 操作數來源於(指令中直接指出的地址所指向的內存)MOV AX [2000H] ,這個方括號的意思是“以括號內的值作為地址,(所指向的內存)中存儲的值”MOV AX,x 這里的這個x是之前在數據段定義的變量,當匯編程序被匯編時,匯編器會計算出x的偏移值,然后替換掉原來的x所以在DEBUG模式下,看到的就不是變量名,而是變量名在數據段中的偏移地址 |
寄存器尋址 | 操作數來源於某個寄存器/是這個寄存器里存儲的值 比如我要把某個16位的數從BX復制到AX,那么我可以用 MOV AX,BX 這里的兩個操作數都是寄存器尋址 |
寄存器間接尋址 | 這就很好理解了,現在括號里放的不是立即數了,放的是寄存器了,代表操作數在內存中,它的地址的括號內的寄存器中 不過這個間接尋址有幾個注意點: 1. 寄存器一般使用的是基址寄存器BP\BX或變址寄存器SI\DI 2. 完整的形式應該是[段地址]:[段內偏移] 3. 當未顯式指定段寄存器時,BX\SI\DI中是相對於DS段的偏移地址,BP是相對於SS段的偏移地址 |
寄存器相對尋址 | 操作數的地址 = 間址寄存器+偏移量 同直接尋址一樣,偏移量可以是一個常量也可以是一個符號名或變量名 例如 MOV AX,[SI+10H] 或MOV AX,ARRAY[SI] |
基址變址尋址 | 操作數地址 = 基址寄存器+變址寄存器 例如 MOV AX,[BX+SI] |
2.與轉移地址有關的尋址方式
這四種尋址方式主要運用於轉移指令JMP
和過程調用指令CALL
首先要了解這兩個東西:
標號,過程名(自己看,不講了)
尋址方式 | 講解 |
---|---|
段內直接 | 就是說我們現在程序運行到這里需要發生一個轉跳 去執行其他地方的一些代碼 辣么這些代碼在哪里呢 我們進行了一些運算,用當前IP的值加上指令中指定的偏移量,得到了一個地址 然后我們就要跳到那里去 比如 JMP func1 偏移量可以是8位或者16位,相對的我們就要使用 SHORT func1 或者NEAR PTR func1 |
段間直接 | 這個和段內直接 的區別是什么呢就是一個X86匯編程序,可能有幾個代碼段,當使用段間直接尋址時,需要改變段地址的值,相當於跳到了另一個代碼段,開始執行新的代碼 比如 JMP FAR PTR func1 |
段內間接 | 跟段內直接的區別是:要轉跳的地址放在了寄存器里,而不是一個標號 (參考一下2里的寄存器簡介尋址吧) |
段間間接 | 類似於段內間接,但是,間接尋址的地址不能直接放在寄存器里,只能放在內存單元中,而且是一個雙字 |
可以簡單看看這個博客:
https://blog.csdn.net/b_h_l/article/details/28866267