6

インラインアセンブリを試してみて、インラインアセンブリに10進数(整数ではなく)を追加しようとしています。問題は、次の関数を呼び出すときです。

inline double ADD(double num1, double num2) {
  double res;
_asm{

    push eax; push the former state of eax onto stack
    mov eax, num1;
    add eax, num2;
    mov res, eax;
    pop eax; restore the former state of eax now that we are done   
     }  return res;}

コンパイラは、インラインアセンブリ(プッシュおよびポップ命令行を除くすべてのアセンブリ行)での不適切なオペランドサイズについて文句を言います。したがって、unsigned longなどの整数型に変更する必要があります。そうすれば機能しますが、もちろん整数型のみをサポートします。小数の結果は四捨五入されます。

8.4のような小数の結果を可能にするアセンブリを追加する方法はありますか?

4

5 に答える 5

7

私は10年間x87アセンブリを実行していませんが、次のようになります。

fld num1   ; load num1 and push it onto the fpu stack
fld num2   ; load num2 and push it onto the fpu stack
faddp      ; pop two numbers, add them, push sum on the stack
fstp res   ; pop sum from the stack and store it in res
于 2012-08-07T20:05:51.373 に答える
6

おそらくあなたが望む命令はADDSDですが、私にはわかりません。

Intelの命令セットマニュアルへのリンクは次のとおりです。 http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html/

以前はハードコピーを無料で郵送していましたが、それはもはや真実ではないようです。

于 2012-08-07T20:31:16.133 に答える
1

浮動小数点数を操作するには、別の一連の命令が必要です。これが役立つはずの紹介です:x86アセンブリ:浮動小数点

于 2012-08-07T20:07:06.787 に答える
1

これを試して:

_asm{

movq xmm0,[num1]
addpd xmm0, [num2];
movq [res],xmm0
// sse2
 }
于 2012-08-08T14:43:31.477 に答える
0

上記の答えは、オペランドをFPスタックにプッシュして、結果をポップする必要があるということです。

ただし、「不適切なオペランドサイズ」エラーの主な原因は、「拡張」レジスタ、「e __」(eaxなど)が32ビット、倍精度浮動小数点数が64ビットであることです。

于 2012-08-07T21:07:00.517 に答える