寻址方式,包含顺序寻址,指令寻址,数据寻址
顺序执行
直接让(pc)+1->pc 这里的1,我们理解为:当前取出的指令的字长
指令寻址
定长指令字结构
设定按照字节编址,那么(pc)+2->pc
变长指令字结构
读如一个字,根据操作码判断这条指令的总字节数n,修改pc的值
(pc)+2->pc
指令寻址,当cpu检测到JMP的时候(无条件转移)虽然pc会+1,但执行完转移指令之后,会把pc值修改为JMP指向的地址
数据寻址
确定本条指令的地址吗指明的真实地址
比如jmp 7 不一定是指向内存中7这个位置
有一些是而是指向这个程序的第7个位置
而还有一些是基于pc往后偏移7个位置
十种数据寻址方式
直接寻址
指令字中的形式地址A就是操作数的真实地址EA,即EA=A
一条指令的执行:
取指令访存一次;执行指令访存一次,不用考虑结果,共访存两次
优点:简单,指令执行仅访问一次主存,不需要专门计算操作数的地址
缺点:A的位数决定了该指令操作数的寻址范围,操作数的地址不易修改,灵活性差
间接寻址
假设指令字长=机器字长=存储字长吧,操作数=3
指令的地址字段给出的形式地址不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,
也就是操作数的地址的地址即EA=(A)【相对地址】 这里的括号A代表,A指向的主存单元里数据
一条指令的执行:
取指令访存一次;执行指令访存二次,不用考虑结果,共访存三次
优点:可以间接扩大寻址范围(有效地址EA的位数大于形式地址A的位数)便于编程
缺点:指令在执行阶段要多次访存
寄存器寻址
在指令字中给出操作数所在的寄存器编号,即EA=R,其操作数载由R所指的寄存器内
一条指令的执行:
取指令访存一次;执行指令访存零次,不用考虑结果,共访存一次
优点:指令在执行阶段不访问主存,只访问寄存器,指令字短,且执行速度快,支持向量和矩阵运算
缺点:寄存器价格贵,因此计算机中的寄存器数量有限
寄存器简介寻址
寄存器R中给出的不是一个操作数,而是操作数所在的主存单元的地址
EA=(R)
一条指令的执行:
取指令访存一次;执行指令访存一次,不用考虑结果,共访存两次
特点:比一般的简介寻址速度更快,但是指令执行的阶段需要访问主存,因为操作数在主存中
隐含寻址
不是明显的给出操作数的地址,而是在指令中隐含着操作数的地址
结合我们之前学的,有可能这个操作数隐藏在acc中
优点:有利于缩短指令字长
缺点:需要增加存储操作数或者隐含地址的硬件
立即寻址
并非直接寻址
形式地址A直接存的就是操作数本身,一般采用补码的形式。 #表示立即寻址特征
当你看到#那就知道后面这个是立即数,而不是地址
一条指令的执行:
取指令访存1次,执行指令访存0次,暂不考虑结果,共访存1次
优点:执行阶段不访问主存,执行时间最短
缺点:A的位数限制了立即树的范围,比如A的位数为n,且立即树采用补码时,可表示的数据范围是
寻址方式 | 有效地址 | 访存次数(执行指令期间) |
---|---|---|
隐含寻址 | 程序指定 | 0 |
立即寻址 | A即使操作数 | 0 |
直接寻址 | EA=A | 1 |
一次间接寻址 | EA=(A) | 2 |
寄存器寻址 | EA=R_i | 0 |
寄存器间接一次寻址 | EA=(R_i) | 1 |