32位寄存器乘法中的Tag OF

时间:2016-08-28 20:18:57

标签: assembly product

我在装配中遇到产品问题。我想将两个矩阵与维度相乘,例如,1raw x 1列。 如果结果大于2 ^ 15 IMUL将标志OF = 1设置为overflaw,但我不明白为什么,实际上我使用32位寄存器而不是16位。以下是一些解释此问题的代码,例如:

short int mat1[] = {-70};
short int mat2[] = {20000};

__asm {
        lea eax, mat1
        lea ebx, mat2
        xor edx, edx
        xor ecx, ecx
        movsx esi, [eax][ecx*2]  //esi = 70
        imul esi, [ebx][edx*2]   //multiplicates esi for mat2 that is 20000
}

现在esi是0022A340h而不是FFFFFDDD20h(-140000),并且标志OF = 1,为什么?结果与数字而不是矩阵相同,但我正在使用它们,我不确定它是否不相关,所以我在这个例子中发布了mat1和mat2。

1 个答案:

答案 0 :(得分:3)

你也应该签名扩展第二个操作数:

short int mat1[] = {-70};
short int mat2[] = {20000};

__asm {
        lea eax, mat1
        lea ebx, mat2
        xor edx, edx
        xor ecx, ecx
        movsx esi, WORD PTR[eax][ecx*2]  //esi = 70
        movsx edi, WORD PTR[ebx][edx*2] 
        imul esi, edi
}

或者只做16位乘法(将在dx:ax中返回32位结果)

__asm {
        lea esi, mat1
        lea edi, mat2
        xor edx, edx
        xor ecx, ecx
        mov ax, [esi][ecx*2]  //esi = 70
        imul WORD PTR[edi][edx*2] 
        // result is now in dx:ax
}