欢迎光临散文网 会员登陆 & 注册

空指令的作用

2023-03-09 12:44 作者:papadogbl  | 我要投稿

大多数CPU指令集设计中会有空指令实现:

例如:

  • x86的空指令是nop,对应的机器指令是0x90,它等价于xchge ax,ax 指令;

  • MIPS的空指令nop对应的机器码是0x0000 0000(32位全零),它等价于将R0(0值)左移0位;

  • ARM32的空指令nop对应机器码是0x00 00 A0 E1 ,ARM64将NOP改为伪指令了,对应的机器码是0xE0 03 00 AA,等价于MOV X0,X0,或者0x00 00 00 91,等价于 ADD X0, X0, #1

不管是哪种空指令,本质都是CPU做了个没有意义的动作,做完后不改变CPU所有寄存器的内容,只是白白占用了指令执行周期。

那空指令的作用是什么?

 编译器可以利用加nop指令来解决流水线冲突问题:

加入空指令指令冲突

解决流水线冲突,也可以像大多数教材里说的,使流水线暂停或加气泡。

Nop和气泡的区别:加nop指令是在编译环节由编译器做的事情,nop是一条完整的指令,必须从取指阶段开始。加气泡bubble一般都是在某条指令取指令以后发现冲突时,由处理器判断,当前已经取指的指令如果进行到执行阶段,就会产生错误结果,因此会让这条错误的指令在bubble之后的各个阶段都执行相当于nop的操作,不改变寄存器状态。这样就相当于取消了这条错误指令。

关于流水线加气泡和暂停的区别:

https://blog.csdn.net/zhousiyuan0515/article/details/126910056

暂停是避免冒险的一种常用手段,暂停时,处理器会停止流水线中一条或多条指令,直到冒险条件不再满足,让一条指令停在译码阶段直到产生它的源操作数的指令通过了写回阶段,因此,其后的指令也应该暂停在取指阶段,直到暂停结束。

我们使用插入气泡来实现暂停(暂停和气泡不是一个东西,气泡是把流水线寄存器清空,而暂停时维持流水线寄存器的状态,我们只是说插入气泡来实现暂停,并没有说暂停和气泡是一个东西),暂停不会改变任何状态,而只会阻止被暂停的指令流水进入下一个阶段。因此我们查看上文讨论过的程序发现,我们需要产生三条nop指令,虽然实现起来非常容易,但是带来的副作用就是我们暂停了三个周期,这是很大的代价。


空指令的作用的评论 (共 条)

分享到微博请遵守国家法律