アセンブリで製品に問題があります。私は次元、広告例、1raw x 1columnの2つの行列を乗算したい。 結果が2^15より大きい場合、IMULはオーバーフローのフラグOF = 1を設定しますが、理由はわかりませんが、実際には32ビットレジスタで16ビットではありません。ここでは、この問題を説明するためのいくつかのコードは、例えば:32ビットレジスタ乗算におけるOFのタグ
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)、および= 1フラグでありますか?結果は行列の代わりに数値と同じですが、私はそれらと一緒に作業していますが、それが不快なものかどうかはわかりません。この例ではmat1とmat2を投稿しました。
を32ビットレジスタでは、メモリ参照も16ビットではなく32ビットです。その結果、2番目のオペランドは20000ではなく、何か他のもの(mat2の次の2バイトになることによる) –
"mov edx、[ebx]"ならedxはCCCC4E20です。では、正しい結果を得るために何をすべきですか?わかりません。 – Caramelleamare