X86主要的几种寻址方式

寻址方式

严格来说有三种寻址方式

1、与数据有关的寻址方式
2、与转移指令或过程调用指令有关的寻址方式
3、与IO指令有关的寻址方式

各个寻址

1. 与数据有关的寻址方式

寻址方式详解
立即数寻址指令所需的操作数直接包含在指令代码中,就是常说的立即数注意,
立即数有8/16位两种,在使用时要求与
另一个操作数长度匹配且只能出现在源操作数位置
直接寻址操作数来源于(指令中直接指出的地址所指向的内存)MOV AX [2000H]
这个方括号的意思是“以括号内的值作为地址,
(所指向的内存)中存储的值MOV AX,x这里的这个x是之前在数据段定义的变量,
当汇编程序被汇编时,汇编器会计算出x的偏移值,
然后替换掉原来的x所以在DEBUG模式下,看到的就不是变量名,而是变量名在数据段中的偏移地址
寄存器间接寻址这就很好理解了,现在括号里放的不是立即数了,放的是寄存器了,代表操作数在内存中,它的地址的括号内的寄存器中不过这个间接寻址有几个注意点:
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里的寄存器简介寻址吧)
段间间接类似于段内间接,但是,间接寻址的地址不能直接放在寄存器里,只能放在内存单元中,而且是一个双字

a.段内直接转移

具体格式:CALL 过程名。此时CS不入栈,IP的内栈入栈,入栈后再将加上目的地址与CALL指令的下一条指令的偏移地址之差值就可以转移到目的地址,详细过程:

SP-2=>SP;将堆栈指针SP减2
(SP)<=IP;将IP进栈
IP+偏移地址之差;转到目的地址

** b.段内间接转移**

具体格式:CALL OPRD,那么在这里OPRD可以寄存器或内存单元,它的具体实现过程:

SP-2=>SP;将堆栈指针SP减2
(SP)<=IP;将IP进栈
IP<=(OPRD);转到目的地址
同a一样,CS不入栈

** c.段间直接转移**

具体格式:CALL [FAR] 过程名 ,此时CS,IP均要入栈,详细的实现过程:

SP-2=>SP;将堆栈指针减2
(SP)<=CS;将CS入栈
SP-2=>SP;将堆栈指针再减2
(SP)<=IP;将IP入栈
;装入新的CS,IP
IP<=过程入口的偏移地址
CS<=过程入口的段地址

d.段间间接转移

具体格式:CALL [FAR] OPRD ,此时CS,IP均要入栈,OPRD是32位,你知道在8086中没有32位寄存器。因此,这里的OPRD一定是存储单元,高16位是CS的值,低16位是IP值,详细的实现过程:

SP-2=>SP;将堆栈指针减2
(SP)<=CS;将CS入栈
SP-2=>SP;将堆栈指针再减2
(SP)<=IP;将IP入栈
;装入新的CS,IP
IP<=(OPRD+2,OPRD+3)
CS<=(OPRD,OPRD1)

e.段内返回
格式:RET。实际上它的实现过程:

(SP)=>IP;从当前栈顶弹出一个字,将它送给IP指令计数器
SP+2=>SP;SP

f.段间返回
格式:RETF,实际上它的实现过程:

(SP)=>IP;IP出栈
SP+2=>SP;
(SP)=>CS;CS出栈
SP+2=>SP;

补充:

int 调用中断返回
iref 弹出 3个参数,一个给 ip,一个 给 cs ,一个 个 flag标志位## 合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值