前言
上次咱们理解了七种较为简单的寻址形式,间接寻址,间接寻址,寄存器寻址,寄存器间接寻址,立刻数寻址,隐含寻址和堆栈寻址。
这次来理解剩下三种寻址形式:基址寻址,变址寻址,绝对寻址。
基址寻址
在讲基址寻址之前,咱们先来看一下从写程序到程序运行的过程,代码经验了编译,连贯,装入的过程。咱们发现代码先通过编译变成一堆指令而后再装入内存。如果咱们用间接寻址形式的话,咱们在编译出指令的时候是无奈晓得他要装入内存在何处。也就是无奈确定上图中的 N,解决这个问题就用到了咱们的基址寻址。
基址寻址中应用了一个基址寄存器,咱们说寄存器就是一个长期存一个数的中央。基址寄存器就存着代码装入后在内存的起始地位。这样,咱们就不必思考咱们的操作数会被放在内存的什么地位。编译时只需思考操作数在绝对于整个装入模块的地位,也叫逻辑地址。执行指令时,逻辑地址 + 基址寄存器的值就失去了咱们最终的操作数地址。
基址寄存器能够应用专用寄存器,也能够应用通用寄存器,应用通用寄存器须要指定寄存器地址。
访存次数为 2 次
取指令 1 次,
依据相加和的地址取操作数 1 次
变址寻址
变址寻址模式上相似于基址寻址,变址寻址领有一个变址寄存器寻址时也是变址寄存器的值相加逻辑地址,造成最终的地址。
变址寄存器是面向用户的,也就是说变址寄存器的内容是用户扭转的。
这个利用在数组解决,咱们能够设置逻辑地址为数组首地址,变址寄存器为偏移量,便能够随机拜访数组中任意数据的地址。特地适宜编写循环程序。
访存次数为 2 次
取指令 1 次
依据相加和的地址取操作数 1 次
咱们来看一下变址寻址时生成的指令的不同
for (int i = 0; i < 10; i++) {sun += a[i];
}
如果用原来的寻址形式编译上述代码
如果用变址寻址编译
变址寻址与基址寻址的不同
基址寻址是面向零碎的,基址寄存器的内容通常由操作系统或管理程序确定。在程序执行过程中其值不可变。
变址寻址是面向用户的,变址寄存器的内容由用户设定,在程序执行过程中其值可变。
绝对寻址
绝对寻址是程序计数器 (PC) 的内容加上指令中的模式地址 A 而造成操作数的无效地址,其中 A 的值是下一跳指令与操作数的绝对间隔,可正可负。这也能够解决方才问题,并且,这还有利于程序浮动。
访存次数两次
取指令 1 次
取操作数 1 次
总结
数据寻址形式能够互相组合应用。