可以使用其他指令执行“ PUSH”指令的操作吗?

泰勒

在我看来,目前看来,我们拥有“推”之类的指令的唯一原因是要用一条指令替换多个MOV和算术指令。

是否有任何“推”无法通过更原始的指令来完成?

“ PUSH”只是一个可编译为多个机器代码指令的助记符吗?

彼得·科德斯

推式是真正的机器指令(https://www.felixcloutier.com/x86/push),不仅仅是汇编宏/伪指令。例如,push rax具有的单字节编码0x50

但是可以,您可以使用sub rsp, 8mov商店等其他指令来模拟它这对于x86这样的CISC机器来说是正常的!)例如,请参见x86汇编器中的寄存器上使用的push / pop指令的功能是什么?

为了精确地模拟它(不修改标志),请使用LEA而不是ADD / SUB。

  lea   rsp, [rsp-8]
  mov   qword [rsp], 123      ; push 123 in 64-bit mode

是否有任何“推”无法通过更原始的指令来完成?

除了效率和代码大小,没有什么比其他重要的东西了。

单一指令是原子性的。中断-它们要么发生,要么不发生。这通常是完全不相关的。异步中断通常不查看被中断的代码的堆栈/寄存器内容。

PUSH可以通过压入单个寄存器的机器代码的单个字节来完成工作,或者以2个字节的立即数完成操作。多指令序列要大得多。8086的ISA的架构师非常专注于使小代码成为可能,因此,有一条指令用一条短指令替换几条较长的指令完全正常的。例如我们有not不必使用xor reg, -1inc代替add reg, 1(尽管它们都具有不同的FLAGS语义,没有使标志保持不变,而INC / DEC使CF保持不变。)更不用说所有x86的其他特殊情况的编码,例如xchg-with- [e / r的1字节编码。 ]斧头。参见https://codegolf.stackexchange.com/questions/132981/tips-for-golfing-in-x86-x64-machine-code

还有效率:由于堆栈引擎可以通过push / pop和call / ret等指令处理堆栈指针的隐式使用,因此PUSH在Pentium-M和更高版本的CPU上解码为单个uop(在融合域中)。2条单独的指令当然会解码为至少2 oups。(除了特殊情况下的test / cmp + JCC的宏融合)。

在古老的P5 Pentium上,使用单独的ALU和mov指令模拟推入实际上是一个胜利-在PPro CPU不知道如何将复杂的CISC指令分解为单独的uops之前,复杂的指令无法按P5的双重发行顺序进行配对管道。(请参阅Agner Fog的微体系结构指南。)这里的主要好处是能够混入可能配对的其他指令,并且只做一个大的sub,然后再做mov存储,而不是对堆栈指针进行多次更改。

这也适用于堆栈引擎之前的早期P6系列。-march=pentium3例如,GCC倾向于避免使用,push而只是对ESP进行了较大的调整。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

到达其他指令的指令范围

来自分类Dev

在DirExistsWarning和其他指令中使用脚本常量

来自分类Dev

在指令定义中的其他指令内添加指令

来自分类Dev

在指令模板中使用ng-click调用其他指令

来自分类Dev

在指令模板中使用ng-click调用其他指令

来自分类Dev

角度消息嵌套指令,如何使其与其他指令配合使用

来自分类Dev

AngularJS指令-来自$ scope的模板和其他指令

来自分类Dev

替换汇编指令会更改其他指令

来自分类Dev

AngularJS Transcluded 指令的范围从其他指令中捕获

来自分类Dev

AngularJS-我的指令之一无效,其他指令有效吗?

来自分类Dev

设计指令序列,以便在使用偏移量解码时可以执行其他操作

来自分类Dev

R:我可以使用Reduce(或其他高级功能)执行以下操作吗?

来自分类Dev

有什么方法可以使用范围或其他值更新指令链接?

来自分类Dev

胡子和其他指令的AngularDart指令表达式语法

来自分类Dev

为什么ng-href指令需要{{}}而其他指令则不需要?

来自分类Dev

自定义验证程序指令与其他指令结合触发多次

来自分类Dev

一个指令与其他指令在运行时进行通信

来自分类Dev

x86中的JL指令是否受cmp和它之间的其他指令影响?

来自分类Dev

AngularJS指令切换菜单阻止其他指令的默认设置

来自分类Dev

如何在Angular的客户指令模板中包含其他指令?

来自分类Dev

在运行时将一个指令与其他指令进行通信

来自分类Dev

为什么ng-href指令需要{{}}而其他指令则不需要?

来自分类Dev

Angular - 将指令注入到同一元素的其他指令中

来自分类Dev

如何使其他指令在uib-tab元素中起作用

来自分类Dev

使用其他模块的指令

来自分类Dev

可以使用movss指令替换整数数据吗?

来自分类Dev

我可以使用其他值扩展枚举吗?

来自分类Dev

我可以使用其他类的静态方法吗?

来自分类Dev

可以使用其他路径代替/ home吗?

Related 相关文章

  1. 1

    到达其他指令的指令范围

  2. 2

    在DirExistsWarning和其他指令中使用脚本常量

  3. 3

    在指令定义中的其他指令内添加指令

  4. 4

    在指令模板中使用ng-click调用其他指令

  5. 5

    在指令模板中使用ng-click调用其他指令

  6. 6

    角度消息嵌套指令,如何使其与其他指令配合使用

  7. 7

    AngularJS指令-来自$ scope的模板和其他指令

  8. 8

    替换汇编指令会更改其他指令

  9. 9

    AngularJS Transcluded 指令的范围从其他指令中捕获

  10. 10

    AngularJS-我的指令之一无效,其他指令有效吗?

  11. 11

    设计指令序列,以便在使用偏移量解码时可以执行其他操作

  12. 12

    R:我可以使用Reduce(或其他高级功能)执行以下操作吗?

  13. 13

    有什么方法可以使用范围或其他值更新指令链接?

  14. 14

    胡子和其他指令的AngularDart指令表达式语法

  15. 15

    为什么ng-href指令需要{{}}而其他指令则不需要?

  16. 16

    自定义验证程序指令与其他指令结合触发多次

  17. 17

    一个指令与其他指令在运行时进行通信

  18. 18

    x86中的JL指令是否受cmp和它之间的其他指令影响?

  19. 19

    AngularJS指令切换菜单阻止其他指令的默认设置

  20. 20

    如何在Angular的客户指令模板中包含其他指令?

  21. 21

    在运行时将一个指令与其他指令进行通信

  22. 22

    为什么ng-href指令需要{{}}而其他指令则不需要?

  23. 23

    Angular - 将指令注入到同一元素的其他指令中

  24. 24

    如何使其他指令在uib-tab元素中起作用

  25. 25

    使用其他模块的指令

  26. 26

    可以使用movss指令替换整数数据吗?

  27. 27

    我可以使用其他值扩展枚举吗?

  28. 28

    我可以使用其他类的静态方法吗?

  29. 29

    可以使用其他路径代替/ home吗?

热门标签

归档