寻址方式——数据寻址(2)

前言

上次我们了解了七种较为简单的寻址方式,直接寻址,间接寻址,寄存器寻址,寄存器间接寻址,立即数寻址,隐含寻址和堆栈寻址。
这次来了解剩下三种寻址方式:基址寻址,变址寻址,相对寻址。

基址寻址

寻址方式——数据寻址(2)_第1张图片
在讲基址寻址之前,我们先来看一下从写程序到程序运行的过程,代码经历了编译,连接,装入的过程。我们发现代码先经过编译变成一堆指令然后再装入内存。如果我们用直接寻址方式的话,我们在编译出指令的时候是无法知道他要装入内存在何处。也就是无法确定上图中的N,解决这个问题就用到了我们的基址寻址。
寻址方式——数据寻址(2)_第2张图片
基址寻址中使用了一个基址寄存器,我们说寄存器就是一个临时存一个数的地方。基址寄存器就存着代码装入后在内存的起始位置。这样,我们就不用考虑我们的操作数会被放在内存的什么位置。编译时只需考虑操作数在相对于整个装入模块的位置,也叫逻辑地址。执行指令时,逻辑地址+基址寄存器的值就得到了我们最终的操作数地址。
寻址方式——数据寻址(2)_第3张图片
基址寄存器可以使用专用寄存器,也可以使用通用寄存器,使用通用寄存器需要指定寄存器地址。
访存次数为2次
取指令1次,
根据相加和的地址取操作数1次

变址寻址

寻址方式——数据寻址(2)_第4张图片
变址寻址形式上类似于基址寻址,变址寻址拥有一个变址寄存器寻址时也是变址寄存器的值相加逻辑地址,形成最终的地址。
变址寄存器是面向用户的,也就是说变址寄存器的内容是用户改变的。
这个应用在数组处理,我们可以设置逻辑地址为数组首地址,变址寄存器为偏移量,便可以随机访问数组中任意数据的地址。特别适合编写循环程序。
访存次数为2次
取指令1次
根据相加和的地址取操作数1次
我们来看一下变址寻址时生成的指令的不同

for (int i = 0; i < 10; i++) {
   sun += a[i];
}

如果用原来的寻址方式编译上述代码
寻址方式——数据寻址(2)_第5张图片
如果用变址寻址编译
寻址方式——数据寻址(2)_第6张图片

变址寻址与基址寻址的不同

基址寻址是面向系统的,基址寄存器的内容通常由操作系统或管理程序确定。在程序执行过程中其值不可变。
变址寻址是面向用户的,变址寄存器的内容由用户设定,在程序执行过程中其值可变。

相对寻址

寻址方式——数据寻址(2)_第7张图片
相对寻址是程序计数器(PC)的内容加上指令中的形式地址A而形成操作数的有效地址,其中A的值是下一跳指令与操作数的相对距离,可正可负。这也可以解决刚才问题,并且,这还有利于程序浮动。
访存次数两次
取指令1次
取操作数1次

总结

数据寻址方式可以相互组合使用。

你可能感兴趣的