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. 寄存器一般使用的是基址寄存器BPBX或变址寄存器SIDI
2. 完整的形式应该是[段地址]:[段内偏移]
3. 当未显式指定段寄存器时,BXSIDI中是相对于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

原文地址:https://www.cnblogs.com/ChildishChange/p/8666904.html