考虑到上一章的“寻址方式”太重要了,遂单独成章,作文于此
直接寻址
适用于偏移地址为[idata]
的情形
CS: IP存放代码指针(2000: 000E)
地址加法器合成CS和IP的值为一个物理地址(CPU只能看懂物理地址,2000E)
通过地址总线传送该地址,找到符合该地址的内存单元(下图,三字节长度,根据首地址2000E读取到的指令是A10E00)
把读到的指令A10E00送入指令缓冲寄存器,同时IP增加指令长度(为读取下一条指令做准备)
现在我们读指令就直接看指令缓冲器好了,根据指令缓冲器(机器码,表示的内容就是MOV AX, DS:[000E]),把立即数000E和DS段寄存器DS的值在地址加法器合成后得到的值,送入寄存器AX中(这都是指令的内容)
既然指令是这么说的,那我们就这么做(送入AX)……
呼,终于完成了。
寄存器间接寻址
适用于偏移地址为[bx]、[si]、[di]、[bp]
的情形
首先CS:IP指向代码段(内存对应单元)地址,合成为物理地址
然后根据该物理地址(2011)索引到相应的代码
接着把读到的指令送入指令缓冲器
到目前为止,和直接寻址没有区别。不过现在要读取并缓冲器的执行指令了;不同的是,寄存器间接寻址的偏移地址在BX中读取(段地址当然还是DS)
然后就执行指令,改变AX寄存器的值呗……
寄存器相对寻址
适用于偏移地址为[BX+idata]、[SI+idata]、[DI+idata]、[BP+idata]
的情形
不变的CS:IP寻址……
找到2013对应的内存单元,读取指令代码
将指令送入指令缓冲器保存,IP增加
根据指令读取并执行;注意这里有三个数据进入地址加法器(BX、DS、idata)
三位一体,合成物理地址……
根据物理地址找到对应的内存单元(这时候8B00这个内存单元看成是数据)
成功读取到8B00的数据,送入覆盖AX的值
基址变址寻址
适用于偏移地址为[BX+SI]、[BX+DI]、[BP+SI]、[BP+DI]
的情形
开始的CS:IP我都懒得写了
根据物理地址找到对应的内存单元
读取指令,存进指令缓冲器,IP相应增加
注意段地址来自DS,偏移地址来自BX和SI(哦,还是三位一体)
那就三位合一,进入地址加法器,BOOM!产生了一个物理地址078B(对应数据)
找到这个物理地址对应的值,写入AX寄存器中
相对基址变址寻址
适用于[BX+SI+idata]、[BX+DI+idata]、[BP+SI+idata]、[BP+DI+idata]
的情形
最后写一次,CS:IP……
然后根据指令指针找指令咯……
找到的指令放入缓冲器哟……
读取并执行缓冲器的指令嗬……
找数据啊喂……
写数据嘿嘿……
至此,寻址的三种方式全部讲解完毕!(撒花。)