您的位置:首页 > 其它

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

2018-02-17 10:38 274 查看
考虑到上一章的“寻址方式”太重要了,遂单独成章,作文于此

直接寻址

适用于偏移地址为
[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……



然后根据指令指针找指令咯……



找到的指令放入缓冲器哟……



读取并执行缓冲器的指令嗬……



找数据啊喂……



写数据嘿嘿……



至此,寻址的三种方式全部讲解完毕!(撒花。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息