查看系列文章点这里: 操作系统真象还原
前言
在前一节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的寻址方式并不复杂,反而很简单很固定,缺少变通,这是由于硬件设计原因导致的,不过只要一到保护模式,一切都不一样咯。
持续更新~~