14 指令系统

图片来源:南京大学软件学院COA课程PPT

©author:zzb

14 指令系统

image-20211212092749737

image-20211212092911122

image-20211212093045231

image-20211212093132151

image-20211212093330607

操作码

image-20211212093423565

image-20211212094308250

image-20211212094720725

  • 寄存器可以支持没有嵌套的函数调用,如果要多层调用,多个寄存器会用来存放返回地址

  • 每一个过程开始的位置是空出来的,空出来存放调用它的程序需要返回的位置,可以多层调用,但不能支持如递归调用,重复调用一个过程。

  • 使用栈可以解决上述问题

操作数

image-20211212095506376

image-20211212095700587

image-20211212141558649

image-20211212141622889

image-20211212141640355

image-20211212141844113

image-20211212141939122

寻址方式

image-20211212141957517

image-20211212142102038

地址A指向的不一定是操作数本身,而可能是一个地址,这个地址才指向操作数,那么这个地址就叫做有效地址EA

立即寻址

image-20211212155348063

地址字段存放的就是操作数,操作数以立即数的方式给出

直接寻址

image-20211212155841498

地址字段是有效地址,可以直接获取操作数的有效地址EA,操作数始终可以表示为(EA)

间接寻址

image-20211212160306179

地址引用的数量限制可能是有益的指的是虽然采用了间接寻址,虽然A的长度会限制放EA的范围(A长度可能很小,涵盖的地址空间小)但这未必是一件坏事

寄存器寻址

image-20211212160858665

寄存器数量少,所以需要的编号长度小,寄存器里面存放了操作数,所以EA=R

当一个数/变量被多次使用时,数据存放在寄存器才有意义,因为寄存器速度快,如果只是从主存中取一个数,使用一次就不用了,那么就没必要存放在寄存器中,直接从主存中读取即可

寄存器间接寻址

image-20211212161338438

寄存器中存放的是有效地址

偏移寻址(计算出的都是EA,需要到EA中取得操作数,因此偏移寻址都是要计算出EA的,都可以看作是一种间接寻址,直接寻址的EA是直接给出的)

image-20211212162310774

偏移寻址结合了直接寻址(A)和寄存器间接寻址((R))两个地址字段,即上面的寄存器编号和偏移地址A。其中至少有一个必须是显式,即A必须是显式的

相对寻址

image-20211212162632473

利用程序的局部性原理,用短的地址差,去代替长的实际地址,节省指令中地址段长度

基址寄存器寻址

image-20211212163015601

寄存器(基址寄存器)的引用可以是显式的,也可以是隐式的(隐含在操作码中)

变址寻址

image-20211212163206119

A是地址,而寄存器中存放的是偏移量(所以是变址寄存器),比如访问数组,寄存器中的值增加,就可以逐步访问数组中的内容

前变址就是先变址再用间接寻址;后变址就是先对A间接寻址,再变址,得到的都是EA

栈寻址

image-20211212163601750

image-20211212163843782

image-20211212163935559

image-20211212164209420

  • 中缀表达式转后缀表达式,对于操作数,直接输出,而对于运算符,则看这个运算符和栈顶的运算符的优先级,如果这个运算符比栈顶运算符优先级,那么把这个运算符压栈,反之,如果小于等于,则弹出栈顶运算符,然后再比较下一个运算符

  • 对于左括号,直接压入,但括号的优先级比其他运算符低,所以新的+遇到栈顶的括号,+优先级比括号高,直接压入

  • 对于右括号,则把运算符弹出,直到遇到左括号,把左括号弹出就结束,即左右括号被消除了

  • 当输入为空,则把栈中的运算符逐个弹出

指令格式

image-20211212170223424

设计原则

image-20211212170339085

指令长度

image-20211212170548422

位的分配

image-20211212170801192

变长操作码是指指令的长度是固定的,只是对于有些指令,操作码长度长,有些短,所以操作数的长度也会相应变化,操作码长,那么操作数就少/短

变长指令

image-20211212171345310

指令的长度是变化的

通过取至少为最长指令长度的内容,来保证每次至少能取到一条指令

CPU内部有个指令预取单元,每周期从一级指令缓存中取16字节指令流,此时并不知道取了多少指令。随后有一个指令预译码阶段,会根据x86指令的译码规则界定出每条指令的边界。后续是指令译码阶段,将x86指令翻译成微指令。

RISC处理器是定长指令,没有这个问题,CISC处理器采用变长指令,指令预取部件会从指令缓存中取一段到指令队列中,并不限于单指令最大长度,可能达到几十字节,和每时钟周期指令发射条数有关。

指令集设计

image-20211212171634673

image-20211212171738524

指令集的设计要和寄存器个数匹配

总结

image-20211212171915782

  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
  • Copyrights © 2022-2024 zzb
  • RZ
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信