-3

これはばかげている、または怠惰に聞こえるかもしれません。ax レジスターは 16 ビットで double は 64 ビットであることはわかっています。__asm を使用して double を ax に転送するにはどうすればよいですか? 問題は、どうすればそれらを 4 (16 ビット) に分割するか、または 3 (16 ビット) にアクセスして、asm を使用して double の ax に入るのですか?

Part2 16 ビット (ビット単位) を i に戻すにはどうすればよいですか?

int main(void)
{
  double i= 0;

  __asm
  {
    MOV ax, i;
    //Some calucation
    MOV i, ax;
  }
  std::cout << i << std::endl;
  return 0;
}

最後にMOVSX、MOVSZとは

4

3 に答える 3

1

double の値を 16 ビット int に変換する場合:-

double d=3.1415;
__asm
{
  push ax
  fld [d]
  fistp word ptr [esp]
  pop ax ; ax = 3
}

値を 32 ビット int として取得するには:-

double d=3.1415;
__asm
{
  push eax
  fld [d]
  fistp dword ptr [esp]
  pop eax ; eax = 3
}

浮動小数点値の最下位ビットのビットごとの表現を取得する場合:-

double d=3.1415;
__asm
{
  lea edx,[d]
  mov ax,[edx] ; for the lowest 16 bits
  mov eax,[edx] ; for the lowest 32 bits
  mov eax,[edx+4] ; for bits 32-63
  ; etc
}

しかし、悪名高い inv-sqrt トリックのようなことをしていない限り、これはそれほど有用ではなく、対処するのが非常に難しいです (おそらく、非常に最近のプロセッサではあまり速度が上がりません)。

注: これはすべて DevStudio 2005 を使用して作成されました。

于 2013-05-11T09:45:55.343 に答える
0

「ax レジスタが 16 ビットで double が 64 ビットであることはわかっています。__asm を使用して double を ax に転送するにはどうすればよいですか?」

1 バイトは 8

単語は 16

ダブルワードは32

クワッドワードは64

つまり、「a double double word」は 64 と言っているに違いありません

それを斧に入れることに関する限り、私は64ビットをスタックにチャッキングしてから、そこから4x 16ビットの斧バイトを取り出すか、2x 32ビットのeaxバイトをちょっと考えます

スタック アドレスをポインタとして使用しない限り、オペレーティング システムが pop のサイズを決定することに注意してください。

16bit ポップはポインタを 2 バイト移動します。

32bit ポップはポインタを 4 バイト移動します。

編集: モンスター レジスタを実行する場合は、16 ビット ユニットで 64 ビット数値を処理し、32 ビット ユニットで 128 ビット数値を操作できる adc と sbb を調べて調べる必要があります。

したがって、16 ビットでは ax-bx-cx-dx レジスタを作成します (すごい)

于 2013-05-11T09:27:04.890 に答える