1、指令寻址
顺序寻址
由于指令在内存中是顺序存放,当执行一段程序时,通常是一条指令接一条指令的顺序执行。为了能够指示下一条欲执行指令的指令地址,CPU内部有
一个程序计数器 PC (指令指针寄存器IP),每执行一条指令其值自动加1,指向下一条欲执行指令的指令地址。这种程序顺序执行的过程我们称为指令的顺序寻址。PC 就是用来做指令追踪
跳跃寻址方式
当程序执行循环指令或者转移指令时,指令的寻址就采取跳跃寻址方式。所谓跳跃,是指下条指令的地址不是由程序计数器PC加1产生,而是将本条指令给出的目标地址装入PC作为下条指令的地址。
2、 *** 作数寻址
形式地址是指令字中的地址,有效地址是 *** 作数的内存地址。寻址过程就是通过寻址特征位把 *** 作数的形式地址,变换为有效地址的过程。
立即寻址
地址码部分的形式地址 A就是 *** 作数D,而不是 *** 作数的地址
寻址特征位:#
例:mov R0,#10H
把二进制数10直接取出到R0中
直接寻址
直接内存寻址特点是:在指令格式的形式地址 A 中直接指出 *** 作数的有效地址EA。由于 *** 作数地址直接给出而不需要变换,称为直接寻址方式。
寻址特征位:无
例:mov R0,10H
把内存编号为 10 里的内容取出到R0中。
间接寻址(基本不采用,效率太低)
间接寻址的情况下,指令地址字段中的形式地址A不是 *** 作数的有效地
址EA,A单元的内容才是 *** 作数的有效地址EA。虽然可以扩大寻址范围,但是需要至少访问 2 次内存。效率低下。
寄存器寻址
当 *** 作数不放在内存中,而是放在CPU的通用寄存器中时,可采用寄存器寻址方式。此时指令中给出的 *** 作数地址不是内存的地址单元号,而是通用寄存器的编号。
优点:执行阶段只访问寄存器,执行速度快。寄存器的个数有限,所以指令 的字长一般都很短。
寻址特征位:Ri
例:mov R0,R1
把寄存器R1中的内容取出到R0中
寄存器间接寻址
寄存器间接寻址方式与寄存器寻址方式的区别在于:指令中的 *** 作数地址指示出的寄存器中内容不是 *** 作数,而是 *** 作数的有效地址EA。
便于编制循环程序
寻址特征位:@或()
例:mov R0,@R1 或 mov R0,(R1)
立即寻址、直接寻址、寄存器寻址、寄存器间接寻址这四种寻址方式基本上在所有的指令集架构中都兼容。这四种是最基本的寻址方式。
那么存在这么多的寻址方式究竟有什么意义呢?
这就相当于是一个语法问题。因为计算机可能都采用不同的指令集架构,x86、ARM,那么它们所支持的寻址方式都会有所不同。CPU在 *** 作内存,读取数据时采用的都是本机的一套寻址方式。
首先我们要知道一个原则。在汇编语言中,和一些高级语言不同的是,我们首先考虑的不是定义变量的问题。而是要考虑要使用多少个寄存器来解决这个问题。
偏移寻址
寻址特征位:+
例:mov R0,@(BR + 100H)
1、相对寻址方式
相对寻址是把程序计数器PC的内容加上形式地址A形成 *** 作数的有效地址。程序计数器的内容就是当前指令的地址.形式地址A通常称为偏移量。
2、基址寻址方式
基址寻址方式是将CPU中基址寄存器的内容加上指令格式中的形式地址A而形成 *** 作数的有效地址EA。
它的优点是可以扩大寻址能力。同形式地址相比,基址寄存器的位数可以设置得很长,从而可以在较大的存储空间中寻址。在程序的执行过程中BR内容不变,由 *** 作系统指定,形式地址A可变。
3、变址寻址方式
变址寻址方式与基址寻址方式计算有效地址的方法十分相似,它把CPU中某个变址寄存器的内容与形式地址A相加来形成 *** 作数有效地址。
堆栈寻址
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)