汇编语言入门:几种寻址方式之比较

时间:2022-11-26 01:19:21

考虑到上一章的“寻址方式”太重要了,遂单独成章,作文于此


直接寻址

适用于偏移地址为[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……
汇编语言入门:几种寻址方式之比较

然后根据指令指针找指令咯……
汇编语言入门:几种寻址方式之比较

找到的指令放入缓冲器哟……
汇编语言入门:几种寻址方式之比较

读取并执行缓冲器的指令嗬……
汇编语言入门:几种寻址方式之比较

找数据啊喂……
汇编语言入门:几种寻址方式之比较

写数据嘿嘿……
汇编语言入门:几种寻址方式之比较


至此,寻址的三种方式全部讲解完毕!(撒花。)