大佬教程收集整理的这篇文章主要介绍了根据 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,请注明来意。