整数配列の bubble_sort (前の質問を参照) を作成したところ、標準のスワップを無視して、次のようなアセンブリ スワップを実装することにしました。
int swap(int* x, int* y)
{
if(x != y)
{
_asm
{
mov eax,[x];
mov ebx, [y];
mov [y],eax;
mov [x], ebx;
}
}
return 0;
}
結果のコードにそのまま挿入され、機能することを実際に確信していました。さて、このスワップを使用する私のコードは機能しますが、コンパイラがそれをどのように変換したかを調べたところ、私のスワップは次のように変更されました。
if(x != y)
00E01A6F inc ebp
00E01A70 or byte ptr [ebx],bh
00E01A72 inc ebp
00E01A73 or al,74h
if(x != y)
00E01A75 or al,8Bh
{
_asm
{
mov eax,[x];
00E01A77 inc ebp
00E01A78 or byte ptr [ebx+45890C5Dh],cl
mov [y],eax;
00E01A7E or al,89h
mov [x], ebx;
00E01A80 pop ebp
00E01A81 or byte ptr [ebx],dh
}
}
return 0;
00E01A83 rcr byte ptr [edi+5Eh],5Bh
}
MS VS 2012 でコンパイルしました。これらの余分な行は何を意味し、なぜそこにあるのでしょうか? _asm フラグメントをそのまま使用できないのはなぜですか?