数据寻址(1)
作者:互联网
数据寻址(1)
确定本条指令和地址码指明的真实地址。
地址码应该如何解读?
一共十种。
访存
直接寻址
把数据放到MAR,给出目标地址,直接找到。
一地址指令:
OP | 特征 | A
访存次数
一条指令的执行:取指令访存1次、执行指令访存1次、暂不考虑存结果,共访存2次
优点
简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址。
缺点
- A的位数决定了该指令操作数的寻址范围,如果A是16位,就只有2^16个数可做地址。
- 操作数的地址不易修改。
间接寻址
指令的地址字段不给出操作数的真正地址,给出形式地址,即操作数有效地址的地址,也就是操作数地址的地址,即EA=(A)。
一次间接寻址:指令中的A指向EA,EA再指向目标操作数。
两次间接寻址:指令中的A指向A,A再指向EA,EZ再指向目标操作数。
访存次数
一条指令的执行:取指令访存1次、执行指令访存2次、暂不考虑存结果,共访存3次。
优点:
- 可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)。
- 例如直接寻址的地址数就216个;但在间接寻址中,EA如果用232次方,表示则有2^32个
- 多次的:便于编制程序(用间接寻址可以方便地完成子程序返回)。【了解即可、这篇知识在汇编】
缺点:
- 指令在执行阶段要多次访存(一次间址需两次访存,多次寻址需根据存储字的最高位确定几次访存)。
- 执行效率下降
寄存器寻址
寄存器寻址:在指令字中直接给出操作数所在的寄存器编号,即EA = Ri ,其操作数存储在由Ri 所
表示的寄存器内。
OP | 特征 | 1001 // 这一条指令中,目标寄存器9
访存次数
- 一条指令的执行:取指令访存1次、执行指令访存0次、暂不考虑存结果,共访存1次。
优点:
- 指令在执行阶段不访问主存,只访问寄存器,指令字短且执行速度快。
- 支持向量/矩阵运算【了解】。
缺点:
- 寄存器价格昂贵,计算机中寄存器个数有限。
开始套娃:寄存器间接寻址
寄存器间接寻址:寄存器R,中给出的不是一个操作数,而是操作数所在主存单元的地址,
即EA=(R)。
访存次数
- 一条指令的执行:取指令访存1次、执行指令访存1次、暂不考虑存结果,共访存2次。
隐含寻址
- 奇葩1号——不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址。
- 一个数指明,一个数默认在ACC累加寄存器中。
优点:
- 有利于缩短指令字长
缺点:
- 需增加存储操作数或隐含地址的硬件(来存储另一个数)。
立即寻址
- 奇葩2号——容易与直接寻址混淆。
- 操作数直接写到指令中
- 例:对于一地址指令的立即寻址:
OP | # | 0…011 //结尾的00…011就是3就是我们要的操作数,#就是它的特征,说明是立即寻址
访存次数
- 一条指令的执行:取指令访存1次执行指令访存o次暂不考虑存结果共访存1次
优点:
- 指令执行阶段不访问主存,指令执行时间最短
缺点:
- A的位数限制了立即数的范围。
- 如A的位数为n,那就2^n个地址数。
堆栈寻址
-
操作数存放在堆栈中,隐含使用堆栈指针(SP—— Stack Pointer)作为操作数地址。
-
堆栈是存储器(或专用寄存器组)中一块特定的按“后进先出 (LIFO)“原则管理的存储区,该存储区中被读/写单元的地址堤用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP) .
-
CPU内部有个指针
-
它是存在于专门的寄存器中的。
-
操作数地址隐含在SP中。
例:出栈取出SP中的R0、R1求和,再压栈放回来。
上方为寄存器中原内容,下方左边是汇编语言执行,能看懂就不再赘述。
注:
-
栈顶在小地址方向
出栈: (Msp) → ACC (SP)+1 → SP 入栈: (SP)-1 → SP (Y) → Msp
-
栈顶在大地址方向
出栈: (Msp) → ACC (SP)-1 → SP 入栈: (SP)+1 → SP (Y) → Msp
硬堆栈、软堆栈
硬堆栈 | 软堆栈 | |
---|---|---|
含义 | 使用专用的寄存器作堆栈 | 在主存中划分区域用于堆栈 |
访存 | 当然一次都不访存 | 每一次pop、push都要访存 |
速度比较 | 速度快 | 速度慢 |
成本 | 成本高 | 成本低(故一般使用软的) |
标签:操作数,访存,地址,寻址,指令,寄存器,数据 来源: https://www.cnblogs.com/tupo/p/15658918.html