程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了根据 EAX >= 0 条件将 EDX 设置为 0 或 -1?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决根据 EAX >= 0 条件将 EDX 设置为 0 或 -1??

开发过程中遇到根据 EAX >= 0 条件将 EDX 设置为 0 或 -1?的问题如何解决?下面主要结合日常开发的经验,给出你关于根据 EAX >= 0 条件将 EDX 设置为 0 或 -1?的解决方法建议,希望对你解决根据 EAX >= 0 条件将 EDX 设置为 0 或 -1?有所启发或帮助;

我正在学习 intelx64 汇编 (AT&T)

我看到一个从 C 代码转换为汇编的问题:

if (a>=0)
    b=0;
else
    b=-1;

给我的地方:

@H_69_7@movl a,%eax
___________
movl %edx,b

然我可以用 2 行或更多行来解决这个问题,但我想不出用 1 行来解决的问题,有什么帮助或提示吗?

解决方法

cdq 将 EAX 的符号位复制到 EDX 的所有位中。
设置符号位相当于 EAX 小于零。

-1 在像 x86 这样的 2 的补码机中是全位设置的。

另一种描述 cdq 的方法是将 EAX 符号扩展为 EDX:EAX。

The AT&T mnemonic for it is cltd,very easy to confuse with cltq,所以我建议只对这些指令使用 Intel 助记符(cdq vs. cdqe,其中 E 表示“扩展”是提醒它在一个寄存器内,进入 RAX。)


一般来说,您可以尝试询问编译器是否可以让他们使用一条指令来处理某事,或者查看他们生成的指令。

或者使用 superoptimizer 软件,该软件可以蛮力尝试可能的指令序列,以找到最佳/最短的指令序列,以针对给定的输入集产生给定的结果。 (仅适用于非常的短序列,例如少量指令。)

通过手工/肉眼,您可以看到 @H_69_7@mov 并没有根据值设置 FLAGS,因此排除了 cmov 之类的任何指令。并且没有任何基于 EAX 的分支指令(与 RCX 的 loop 不同),无论如何您都不希望那样。对我来说,当我看到它将 EDX 存储到 b 时,我想到了解决方案。 EAX 和 EDX 的组合,以及需要 0-1,让我想起了 cdq

大佬总结

以上是大佬教程为你收集整理的根据 EAX >= 0 条件将 EDX 设置为 0 或 -1?全部内容,希望文章能够帮你解决根据 EAX >= 0 条件将 EDX 设置为 0 或 -1?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。