x86 CPU的实模式——寻址(二)


查看系列文章点这里: 操作系统真象还原

前言

  在前一节CPU的实模式——寄存器(一)中,我们已经介绍了8086常用的寄存器,也知道了寄存器的主要作用就是为了给CPU提供计算的数据,为了找到数据并传递给CPU,那么就必须要设计一套规则,这套规则就是寻址方式,接下来一起看看8086 CPU有哪些寻址方式。


二、实模式下CPU内存寻址方式

  寻址就是通过指令中的地址码字段找到其对应数据所在的物理地址,而在大多数指令都至少含有两个操作数,因此两个操作数有不同的寻址方式,这是完全有可能的。

1、寄存器寻址

  寄存器寻址是指我想要的数据就存在寄存器中,不需要去其它地方找啦!

  mov ds,ax      ;将ax寄存器中的值赋值给ds寄存器

2、立即数寻址

  立即数寻址是指我想要的数据就存在指令中,同样也不需要去其它地方找啦!

  mov ax,0x10     ;0x10在编译时,会直接成为指令的一部分
  mov sx,0x9      ;因此这两条指令,既是寄存器寻址,也是立即数寻址
  mul dx

3、内存寻址

  不用我说大家也知道,寄存器和立即数寻址限制很大,因此很多时候需要我们去内存中寻找数据,这就是内存寻址,它采用“ 段基址:段内偏移地址 ”访问内存,分为四类,接下来一一介绍。

(1)直接寻址

  直接寻址,就是直接将给出的操作数当做内存地址中的段内偏移地址,并通过中括号告诉CPU。如果不指定段寄存器则默认使用DS段寄存器。

  mov ax,[0x1234]      ;实际访问地址:DS*16+0x1234
  mov ax,[fs:0x5678]   ;实际访问地址:FS*16+0x5678

(2)基址寻址

  基址寻址,就是将操作数的段内偏移地址存储在bx或bp寄存器,其中bx默认DS为段寄存器,bp默认SS为段寄存器。注意只能是bx或bp寄存器。

  mov ax,[bx]
  mov ax,[bp]

如果你对bp寄存器为什么默认段寄存器感到疑惑,可以看这个通用寄存器的介绍。

(3)变址寻址

  变址寻址和基址寻址类似,只不过寄存器变成了SI与DI寄存器,默认段寄存器都是DS,通常用于字符搬运方面的指令,例如movsb、movsw、movsd等等。

  如果不使用数据搬运指令,变址寻址通常配合基址寻址一起实现基址变址寻址。

(4)基址变址寻址

  从名字也可以看出,是基址与变址的结合,bx或bp加一个si或di共同决定段内偏移地址。

  mov [bx+di],ax   ;[ds:bx+di]=ax
  mov [bx+si],ax   ;[ds:bx+si]=ax

总结

  总的来说8086 CPU的寻址方式并不复杂,反而很简单很固定,缺少变通,这是由于硬件设计原因导致的,不过只要一到保护模式,一切都不一样咯。

  持续更新~~

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值