MULX导致NASM程序崩溃

MULX导致NASM程序崩溃,nasm,x86-64,Nasm,X86 64,我有一个简单的乘法,它将从两个64位数字的乘法中产生一个128位数字,所以我使用MULX。但是,MULX会导致程序崩溃: mov rax,[e] mov rdx,[e] mulx r8, r9, rax 根据英特尔的说法,这是MULX的正确语法。这个程序是用NASM组装的,为什么会崩溃呢 非常感谢 它在什么指令上出错?如果是mulx,那么您确定CPU支持BMI2吗?如果不是,则必须使用一个操作数mul。如果你的加载是错误的,那么这不是一个。顺便说一句,为什么你要加载e两次?为什么不mov-ra

我有一个简单的乘法,它将从两个64位数字的乘法中产生一个128位数字,所以我使用MULX。但是,MULX会导致程序崩溃:

mov rax,[e]
mov rdx,[e]
mulx r8, r9, rax
根据英特尔的说法,这是MULX的正确语法。这个程序是用NASM组装的,为什么会崩溃呢


非常感谢

它在什么指令上出错?如果是
mulx
,那么您确定CPU支持BMI2吗?如果不是,则必须使用一个操作数
mul
。如果你的加载是错误的,那么这不是一个。顺便说一句,为什么你要加载
e
两次?为什么不
mov-rax,[e]
/
mul-rax
,因为您正在重击rax和rdx,您也可以像正常情况一样在rdx:rax中生成结果。或
mov-rdx[e]
/
mulx-r8、r9、rdx
执行
r8:r9=rdx*rdx
。(为了人类读者的利益,将高半音放在编号较高的寄存器中更为正常)。无论如何,如果两次都不是同一个数字,如果以后不需要在寄存器中使用内存操作数,则可以使用内存操作数。我认为您对标志有误解
mul
clobbers CF,因此在需要将
adc
mul
混合的情况下,实现扩展精度乘法时可能会很不方便。您不需要“检查”任何内容,正则表达式总是将128位结果写入
rdx:rax
。如果RDX=0,因此如果您希望在该条件下进行分支,它将为您保存一个
测试rdx,rdx
。(或者,如果您真的想在rdx!=0时使用CF=1,而不是使用其他条件,则使用
cmp rdx,1
/
cmc
)您正在编写什么函数?它是否返回某种大小可变的对象?如果您谈论的是
mul
,它总是产生一个全宽度的结果。不管上半部分是否为零,它仍然是一个128位的数字。您不会说添加eax、ecx在与小输入一起使用时有时只产生8位结果。当然,根据高半部是否为零,使用128位结果优化后续代码可能会很有用。(例如,64x64=>128乘法仅为一条指令,但128x128=>128乘法是
mul
mulx
+2
imul r64、r64
和3
add
mul r64
始终写入RDX和RAX,在RDX:RAX寄存器对中产生其128位结果。唯一的问题是它写入RDX的值是否为i。)s 0或否。它从不让RDX保持不变。如果您只想要结果的下半部分,请使用
imul r64,r/m64
,因为它更快(只有1个uop而不是2个uop),并且您可以将结果放在您选择的寄存器中。