寄存器间接寻址:
想象一下,你有一个信使(寄存器),他知道你想要的东西(操作数)放在哪里。你告诉信使去拿,但他得先看看地址本(寄存器里的地址信息)才知道东西具体在哪。这种方式挺快的,但信使可能要跑几趟,因为他得先查地址本,再去拿东西。
相对寻址:
这就像是你告诉信使,从当前位置(程序计数器)往东走一段距离(加上形式地址),就能找到东西。这样的好处是,即使你搬家了(程序移动了),只要告诉信使新的起点,他还是能找到东西。不过,这样信使得先算一下到底要往东走多远。
基址寻址:
假设你有一个大本营(基址寄存器),信使知道从大本营出发,再加上一些额外的指引(形式地址),就能找到东西。这种方式可以让你在不同地方都能找到相同的东西,但信使得先去大本营,然后再出发,可能会有点复杂。
变址寻址:
这就像是信使有一个伙伴(变址寄存器),他们俩一起决定东西的位置。信使根据伙伴的指引(变址寄存器的内容)和自己的地址本(形式地址),一起找到东西。这样可以让信使找到更远的东西,但计算起来可能会有点麻烦。
堆栈寻址:
想象一下,你有一个特殊的抽屉(堆栈),东西是按照最后放的先拿出来的规则存放的。你告诉信使,只要看最上面的抽屉(堆栈指针给出的地址),就能找到最近放的东西。这种方式很简单,因为信使只需要看最上面的抽屉,不需要计算。
这些方式就像是不同的寻宝游戏,每种游戏都有自己的规则和技巧,程序员就像是玩游戏的人,要根据情况选择最合适的方法来找到宝藏(操作数)。
知识点讲解
寄存器间接寻址:
这种方式中,寄存器中存储的是操作数的地址信息。
优点:与一般的间接寻址相比,速度较快。
缺点:指令执行过程中需要访问主存,可能需要多次访问(取决于间接寻址的次数)。
相对寻址:
通过将程序计数器(PC)的内容与指令中的形式地址相加来形成操作数的有效地址。
优点:操作数的地址不是固定的,便于程序的浮动,即可以在内存中移动而不影响程序的执行。
缺点:需要计算操作数的地址,执行步骤相对复杂。
主要用于转移指令,只需要访问一次存储器。
基址寻址:
通过将CPU中的基址寄存器(Base Register, BR)的内容与指令中的形式地址相加来形成操作数的有效地址。
优点:可以扩大寻址能力,便于编写浮动程序,有利于多道程序的设计。
缺点:寻址过程较为复杂,需要增加内部部件,偏移量的位数较短。
主要面向操作系统,解决程序逻辑空间与存储器物理空间的无关性,只需要访问一次存储器。
变址寻址:
有效地址EA是形式地址A和变址寄存器IX的内容之和。
优点:可以扩大寻址范围。
缺点:寻址过程较为复杂,变址寄存器的位数影响操作数的寻址范围。
主要用于数组处理和循环程序的编写,只需要访问一次存储器。
堆栈寻址:
使用存储器或寄存器组中的一块特定区域,按照先进后出(Last In, First Out, LIFO)的原则进行管理。
堆栈指针(Stack Pointer, SP)给出读写单元的地址。
堆栈分类:
硬堆栈:由寄存器构成,成本高,容量小。
软堆栈:在主存中划分区域。
大部分使用堆栈的指令表现为无操作数,因为操作数地址隐含使用了SP。
这些寻址方式各有优缺点,适用于不同的场景和需求。在编写程序时,程序员需要根据程序的特定要求选择合适的寻址方式。