Assembly 组件ia32上的imull操作

Assembly 组件ia32上的imull操作,assembly,x86,Assembly,X86,我想在汇编中执行完整操作,并将结果返回给C 我的函数的签名是“long-long-multilar(void)”,代码是: multiplicar: movl op1, %eax imull op2, %eax adcl $0, %edx ret 我的op2是3。当我的op1为399时,效果良好(给出1197)。但当我的op1是-399时,我得到4294966093,不知道为什么。我必须使用cdc吗 我的op1和op2是long-long类型。 感谢当给定32

我想在汇编中执行完整操作,并将结果返回给C

我的函数的签名是“long-long-multilar(void)”,代码是:

multiplicar:
    movl op1, %eax
    imull op2, %eax
    adcl $0, %edx

    ret
我的op2是3。当我的op1为399时,效果良好(给出1197)。但当我的op1是-399时,我得到4294966093,不知道为什么。我必须使用cdc吗

我的op1和op2是long-long类型。
感谢当给定32位操作数时,
imul
指令执行有符号32x32位乘法。这将产生高达64位的结果,但是在2/3操作数形式中,只有最低有效位的字保留,并通过进位指示溢出

请注意,进位只是用于错误检测的一个位标志,不能携带将多个扩展精度乘法链接在一起所需的信息


在本例中,在最新编辑之后,目标似乎是将两个64位变量相乘,并获取截断的64位结果。使用32x32=>64位原语实现这一点需要将四个乘法按小学方法链接在一起。也就是说,
(a当给定32位操作数时,
imul
指令执行有符号32x32位乘法。这将产生高达64位的结果,但是在两个/三个操作数形式中,只有最低有效位保留,并通过进位指示溢出

请注意,进位只是用于错误检测的一个位标志,不能携带将多个扩展精度乘法链接在一起所需的信息


在这种情况下,在最新的编辑之后,它的目标似乎是将两个64位变量相乘,并获取截断的64位结果。使用32x32=>64位原语实现这一点需要将四个乘法与小学方法的总和链接在一起。即
(a两个/tree操作数版本的
imul
产生单字结果。您希望单操作数版本与
EAX
隐式相乘。此外,相乘后的进位标志指示结果是否适合32位,通常仅用于检测溢出,在多字算术中,整个
X
寄存器实际上是执行项。因此我不需要使用adcl?4294966093=-1203,我不确定您期望的是什么,但这是什么格式(4294966093)?@harold:Modulo 2^32,是的,但不是这里的64位。在这种情况下,单操作数
imul
执行所有需要的操作,包括符号扩展,并以函数返回值的形式返回预期寄存器对中的结果。
imul
的两个/树操作数版本产生单字结果。是否需要单操作数版本在与
EAX
进行隐式乘法时。乘法后的进位标志指示结果是否符合32位,通常仅用于检测溢出,在多字算术中,整个
EDX
寄存器实际上是执行项。因此,我不需要使用adcl?4294966093=-1203,我不是苏re what you expected though这是什么格式(4294966093)?@harold:Modulo 2^32,是的,但不是这里的64位。在这种情况下,单操作数
imul
执行所有需要的操作,包括符号扩展,并将结果作为函数返回值返回到预期的寄存器对中。
multiply: ;int64_t __cdecl multiply(int64_t lhs, int64_t rhs)
        fildq 4(%esp)
        fildq 12(%esp)
        fmul
        fistpq 4(%esp)
        movl 4(%esp),%eax
        movl 8(%esp),%edx
        ret