我在装配中遇到产品问题。我想将两个矩阵与维度相乘,例如,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。
答案 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
}