如何反转符号扩展?

How to reverse sign extension?

我用 imulq 乘以两个数字。它 returns rdx:rax 上的签名号码。我想将其压缩到 rax 寄存器中。基本上,我正在寻找反转 cqo.

的指令

如果结果适合 64 位,则 rax 已经包含 64 位结果,您无需执行任何操作即可将结果放入 rax 寄存器。 但是,如果您只需要一个 64 位结果,那么您应该使用 two-operand 形式的指令,imul rax, <src>,它更快,因为它不必计算完整的 128 位结果.

如果要处理溢出错误,请在乘法后使用 jo <error-handler> 来检查不适合 64 位的结果。这适用于生成 128 位结果的 imul 的 single-operand 形式,以及生成 64 位结果的双或 three-operand 形式。但是,如果您打算在发生溢出时丢弃高 64 位,则没有理由使用这种形式的指令。