X86主要的幾種尋址方式


一、首先

P33:

嚴格來說有三種尋址方式

  1. 與數據有關的尋址方式
  2. 與轉移指令或過程調用指令有關的尋址方式
  3. 與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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM