指令寻址方式与数据寻址方式
Posted PacosonSWJTU
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指令寻址方式与数据寻址方式相关的知识,希望对你有一定的参考价值。
【README】
1.本文总结自bilibili《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐;
2. cpu访存寄存器耗费 10ns,访问缓存(高速缓冲寄存器)耗费20ns,访问主存200ns;访问磁盘1ms;一般情况下,CPU内部执行指令最长耗时是在访问内存(外设除外),所以本文列出了寻址方式是否访存的情况;
【1】指令寻址
- 方式1: 顺序寻址 , PC+1 -> PC ;PC程序计数器寄存器用于存储要执行的下一条指令的地址;
- 方式2:跳跃寻址, 如 JMP 7;无条件跳转到7号地址的指令;
【2】数据寻址
【2.1】 指令格式
操作码 | 寻址特征 | 形式地址A |
形式地址 A:机器指令中操作数的形式地址;
有效地址EA:操作数的真实地址; effective address;
约定: 指令字长=存储字长=机器字长;
【2.2】数据寻址方式(10种)
【2.2.1】立即寻址
形式地址A就是操作数;(无需访存)
【2.2.2】直接寻址
形式地址A就是有效地址EA;(无需访存)
【2.2.3】 隐含寻址
操作数地址隐含在操作码中;根据操作码隐含指出操作数在某寄存器中;(如操作数在寄存器中,无需访存)
【2.2.4】间接寻址
通过访存取出形式地址A指向的内存单元的操作数有效地址EA;再通过访存取出有效地址EA指向的内存单元的操作数;(需要2次访存)
【2.2.5】寄存器寻址
形式地址就是寄存器编号,操作数存储在寄存器中;(无需访存)
【2.2.6】寄存器间接寻址
形式地址就是寄存器编号,但操作数有效地址存储在寄存器中;(需要1次访问寄存器,1次访存);
【2.2.7】基址寻址
操作数有效地址EA等于基址+形式地址A;其中基址存储在专用寄存器或通用寄存器中,形式地址作为偏移量;专用寄存器或BR,通用寄存器如R0;(1次计算,1次访存);(注意,基址不变,但形式地址改变,通常用于多道程序设计);
【2.2.8】变址寻址
操作数有效地址EA等于变址+形式地址A;其中变址存储在变址寄存器IX(或通用寄存器)中;(1次计算,1次访存);(注意,变址可变,但形式地址不变,通常用于遍历数组);
【2.2.9】相对寻址
以pc寄存器作为基址寄存器,形式地址作为偏移量;
【2.2.10】堆栈寻址
操作数存储在堆栈的栈顶中,其中栈底是低地址,栈顶是高地址(SP寄存器存储);
Push:入栈;把ACC累加器的数据压入栈顶(内存);
Pop:出栈:把栈顶元素出栈并存入ACC累加器;
【3】寻址示例:求数组N个元素均值
【3.1】 直接寻址实现
直接寻址步骤(共计N+2条指令):
序号 | 指令 | 描述 |
1 | LDA D | 把操作数存入ACC累加器中; |
2 | ADD D+1 | 把ACC内容与D+1内容相加;和存入ACC; |
3 | ADD D+2 | 把ACC内容与D+2内容相加;和存入ACC; |
4 | …… | 此处省略100字 |
5 | ADD D+(N-1) | 把ACC内容与(N-1)内容相加;和存入ACC; 至此,N个数据的累加和已完成,结果存入到ACC中; |
6 | DIV #N | 求ACC中和的均值 |
7 | STA ANS | 保存结果到内存单元 |
【3.2】变址寻址实现
变址寻址步骤(共计8条指令):
序号 | 指令 | 描述 |
1 | LDA #0 | 把ACC累加器清零; |
2 | LDX #0 | 把IX变址寄存器清零; |
3 | ADD X, D | 把变址寄存器IX的内容和指令中的形式地址存储的操作数做加法,结果存入累加器ACC;D为形式地址,如数组0号元素地址; |
4 | INX | 变址寄存器IX自增1; |
5 | CPX #N | Compare-变址寄存器IX 与 N做比较; |
6 | BNE M | Not equal-若不等,则跳转到M号指令(M=3); 通过这个循环,我们累加; |
7 | DIV #N | 求和的均值 |
8 | STA ANS | 保存结果到内存单元 |
【小结】直接寻址和变址寻址对比:
直接寻址需要n+2条指令;而变址寻址只需要8条指令即可(变址寻址性能更优);
以上是关于指令寻址方式与数据寻址方式的主要内容,如果未能解决你的问题,请参考以下文章