我刚刚编写了一个整数数组的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 片段不能直接使用?