操作数是运算符作用于的实体,表达式中的一个组成部分,它规定了指令中进行数字运算的量。表达式是操作数与操作符的组合。
操作数形式:
- 立即操作数:指令要操作的数据以常量的形式出现在指令中,称为立即数,它只能作为源操作数
- 寄存器操作数:指令要操作的数据存放在CPU中的寄存器里,指令中给出寄存器名即可。
- 内存操作数:指令要操作的数据存放在内存某些单元中,指令中给出内存单元物理地址(实际上指令只给出了偏移地址,段地址采用隐含方式给出,也可以使用跨段方式指出当前段地址)。
形成操作数有效地址的方法
当数据在主存中时,需要计算机其他有效地址E
S=(E)
立即数寻址
- 地址码字段就是操作数本身
过程:指令的本身要操作的数据放在这条指令中,比如将200H赋值给AX,可以直接使用200H这个数据,不需要取主存中取数据
特点:
-
- 取指令操作将数据与指令一并读入CPU内部的寄存器,指令执行速度快
- 2)便于程序设计(变量赋初值)
- 3)数据大小收到字段位数限制
- 寄存器寻址
操作数在CPU内部寄存器中,操作数不需要访问主存,指令中保存的是寄存器的地址,取数据直接访问寄存器即可
特点:
1)操作数在寄存器中,指令执行速度快
2)能访问的数据大小一般与计算机的字长有关,因为字长和通用计算机位数有关系
3)地址字段的位数与计算机通用寄存器数量相关
- 直接寻址
地址码字段直接给出操作数在内存的地址。E=D,S=(D)
AX中的指令200H需要访问77号地址,就会通过77寻址,然后加载到AX内部,指令中保存的地址指向的是主存地址,需要访问一次主存
特点:
- 提供访问主存的操作
- 获得数据要访问主存,指令执行速度慢
- 地址字段的位数决定了访存空间大小
- 间接寻址
地址码字段给出的时操作数地址的地址 E=(D),S=((D))
- 先访问200H访问主存访问203地址,203地址并不是实际的操作数
- 然后203地址又再次执行了主存的8080H地址,取出数据放在AX中取
特点:
- 解决了直接寻址方式下地址字段的位数限制访存范围大小的问题
- 获得数据要访问主存2次,指令执行速度太慢
- 寄存器间接寻址
地址码字段给出的是寄存器编号R。E=(R),S=((R))
操作数所在真是的主存地址保存在寄存器中,寄存器间接寻址的指令中的地址码字段给的是主存地址所在的寄存器位置,我们可以根据这个地址去寄存器中找到操作数的有效地址,再去内存中寻找操作数。
1)通过BX访问主存,从BX取出的就是直接就是操作数
特点:
- 解决了直接寻址方式下地址字段的位数限制访存范围大小的问题
- 获得数据只需要访问主存1次
- 相对寻址
E=D +(PC),D为指令中地址字段的值
相对寻址是基址寻址的变种。将基址寄存器(BR)改为(程序计数器)PC。地址码中的A相当于指令地址的偏移量,可正可负,用补码表示。从而指出了操作数和现在这行指令的相对位置。
那这里pc计数器有什么用呢?为什么要用pc计数器?
这就需要回想一个问题,我们什么时候提到过pc计数器?没错就是在指令跳转那里。
程序的跳转指令就是通过pc来跳转,在这里也一样。
如果还是用基址寄存器(BR):
我们的A虽然指出了操作数和现在这行指令的相对位置,但是却无法改变地址跳转过去。所以才需要用pc来代替。程序计数器pc可以根据位移量指向下一条指令的地址,实现跳转。这就是相对寻址的作用。
特点:
- 可节省指令中的地址位数,便于程序在内存中成块移动
- 注意PC的改变对计算E的影响,如本例中E = 200 + 2000 + 2
- 基址寻址
指定一个基址寄存器B,与本指令地址无关
E=D +(B),D为指令中地址字段的值
基址寻址”之前,先要区分“逻辑地址”和“主存物理地址”两个概念。
“逻辑地址”是指程序员编写程序时使用的地址。就是之前讲解的物理内存为1G,而程序是4G,需要添加逻辑地址进行映射。“主存物理地址”是指程序段/数据段在主存中的实际存放地址。程序段/数据段的“逻辑地址”都是从零开始编址的。而程序段/数据段每次装入主存的起始地址是不确定的,所以每次运行时,某条指令或者某个数据的“主存物理地址”也是不确定的。但是,这条指令或者这个数据的“逻辑地址”是固定的。
因此,可以在处理器内部设置一个专门存放程序段/数据段在主存中起始地址的寄存器。称起始地址为“基地址”,简称“基址”,称该寄存器为“基址寄存器”。这样,在指令中只需给出“逻辑地址(也叫形式地址)”,在执行时将“逻辑地址”与基址寄存器中的值相加即可得到指令或数据的“主存物理地址”,也叫有效地址E=(基址R)+A。
基址寻址:CPU中基址寄存器(BR)的内容+指令格式中的形式地址A=操作数的有效地址,即EA=(BR)+A。
基址寻址的基址寄存器不变(作为基地址),改变的是形式地址A中的值(作为偏移量)。
需要通过ALU将BR中的基地址和形式地址A加起来才能对应到主存的有效地址。
当然不用专门的BR(基址寄存器)也行,可以用通用寄存器,原理一样,只不过需要给个编码定位到通用寄存器。
那基址寻址有什么用呢?
基址寻址最大的优点就在于可以扩大寻址范围。原先只能寻址A的位数范围内的地址,而有了基址寻址的方式,我们可以通过加上一个基地址从而在更大范围的空间内设计程序。
举个例子:
假设原先只能寻址的范围只有A(0~4)这么点范围。
用了基址寻址的方式,我们可以给其加一个基地址100,那么就可以在(100~104)这个范围内再存取。要是没有基地址我们怎么能访问得到这么远呢?
特点:
- 使用基址寄存器可以访问更大的主存空间
- 对某一程序而言,基址值设定后不变,故要访问不同数据需修改D
- 变址寻址
指定一个变址寄存器X,与本指令地址无关,内容可随要求改变
E=D +(X),D为指令中地址字段的值
变址寻址是为了支持用循环结构处理数组或向量而提出的。它所实现的逻辑基础是,用局部相对固定的程序代码 处理具有强逻辑关系的一组数据,有时也可以是一条指令循环处理批量数据。这组数据间的强逻辑关系,一般是从某个固定的地址开始,依次线性排列。而排列的起始地址就是数组或向量的首地址,可存于指令的地址码;线性排列中对应于不同数据的变量 i 存放在一个专门的寄存器——变址突破口中。指令执行时,用变址加法器将指令中的形式地址与变址寄存器中的内容相加,即可得到数组或向量元素的有效地址 E=(变址R)+A。
对数组或向量的访问既可能是顺序访问,也可能是随机访问。这样只需改变变址寄存器中的i值,就可以随机地访问数组或向量的任一个元素。
例如,要想采用循环结构来处理一个数组或向量的各个元素,那么循环体中的数据处理指令就可以采用“变址寻址”。只要在指令中给出数组或向量的起始地址,循环开始前将变址寄存器初始化为第一个或最后一个元素下标,每次处理结束后变址寄存器加1或减1。这样就可以用相同的指令来遍历处理数组或向量中的所有元素了。
与基址寻址很类似的是变址寻址。很多人会混淆基址寻址和变址寻址。但是最大的不同是变址寻址:变址寄存器的内容可以改变(作为偏移量),而形式地址A保持不变(作为基地址)。
变址寻址常用在一些有规律的操作上,比如遍历字符串,遍历数组。
特点:
- 不改变指令即可改变数据的有效地址,可改变数据的有效地址,可在变循环中使用
- 在字符串处理,向量运算等等成批数据处理中非常有用
- 数据寻址方式总结
参考文档:
https://zhuanlan.zhihu.com/p/370204019
http://tbar.cn/computer-organization/pnt/1647844215125.html
标签:操作数,5.3,主存,地址,寻址,指令,寄存器 From: https://www.cnblogs.com/smilexm/p/17157513.html