Assembly &引用;cqo"&引用;干熄焦;及;cwd“;x86_64指令。为什么不只用cqo呢?

Assembly &引用;cqo"&引用;干熄焦;及;cwd“;x86_64指令。为什么不只用cqo呢?,assembly,x86-64,Assembly,X86 64,我不是最有经验的汇编程序员,我遇到了“cqo”、“cdq”和“cwd”指令,它们都是有效的x86_64汇编 我想知道当在较小的值上运行时,使用干熄焦或cwd是否有任何优势。在性能上有什么不同吗 编辑: 当计算一位数的绝对值时,最初开始研究这个问题 例如,如果al中的值为-9: cwd xor al,dl sub al,dl 与将其作为32位值并计算 cdq xor eax,edx sub eax,edx 或者如果-9有一个64位的值 cqo xor rax,rdx sub rax,rdx

我不是最有经验的汇编程序员,我遇到了“cqo”、“cdq”和“cwd”指令,它们都是有效的x86_64汇编

我想知道当在较小的值上运行时,使用干熄焦或cwd是否有任何优势。在性能上有什么不同吗

编辑: 当计算一位数的绝对值时,最初开始研究这个问题

例如,如果al中的值为-9:

cwd
xor al,dl
sub al,dl
与将其作为32位值并计算

cdq
xor eax,edx
sub eax,edx
或者如果-9有一个64位的值

cqo
xor rax,rdx
sub rax,rdx

如果原始值是64位,并且由值-9到9组成,那么实际上它们看起来都是一样的。

只有当值已经符号扩展到rax的16位以上时,您才可以选择

如果ax中有带符号的16位int,但eax的上限16未知或为零,则必须继续使用16位指令
cdq
将根据eax顶部的垃圾位设置edx,而不是ax中值的符号位

类似地,如果在eax中使用32位ops生成带符号的32位int,则upper32将归零,而不是符号扩展

如果可以,请使用
cdq
。如果需要在rdx中设置所有64位,则可能需要
cqo


请参阅以了解如何使asm在x86上快速运行。32位操作数大小是64位模式下的默认值,因此16位或64位操作数需要额外的前缀。这意味着更大的代码大小,这意味着更差的I-cache效率(通常在Sandybridge之前的CPU上存在更多解码瓶颈;SnB的uop缓存通常意味着解码不是问题。)


16位对寄存器先前的内容也有错误的依赖关系,因为写入ax不会清除rax的其余部分。幸运的是,AMD64在设计时考虑到了无序的CPU,因此避免了重复不利于高性能的设计选择。(在设计AMD64时,x86 CPU已经使用OOO,这与ax扩展到eax时不同)。

您好,欢迎使用堆栈溢出。请提供一些使用示例和特定用例,以便我们提供帮助。尽量提供更多信息,以便我们了解情况。:)好的,我添加了一些例子。我还听说在32位机器中使用32位值比使用字节更快。在x86_64的情况下,64位值是真的,还是真的?看起来很棒!现在很清楚了,我已经投票支持了你的问题,希望它能得到更多的关注。
cwd
在现代微体系结构上速度较慢,因为它只修改寄存器的下部,所以结果取决于
edx
的旧值。相反,无论是
cqo
还是
cdq
都不依赖于
[r/e]dx
的旧值。它们是相同的,它们都具有相同的指令操作码0x99。效果取决于您的目标体系结构,16位对32位对64位。给他们起不同的名字只会有助于编写易懂的代码。@LưuVĩnhPhúc:谢谢,我懒得去查找和链接这个问题,我知道这个问题是存在的。