我编写了以下 C 程序:
#include "stdio.h"
__declspec(noinline) void DivideTest(int num, int denom)
{
int quo = num / denom;
int rem = num % denom;
printf("Quotient: %d\nRemainder: %d\n", quo, rem);
}
int main(int argc, char* argv[])
{
//Use volatile variables to prevent result from being hardcoded.
volatile int num = 20;
volatile int denom = 3;
DivideTest(num, denom);
return 0;
}
正如预期,输出如下:
Quotient: 6
Remainder: 2
但是,当我在发布模式下进行编译(即启用优化)时,在 Visual Studio 中调试程序并查看反汇编代码,它显示 DivideTest 使用双操作数 idiv:
_DivideTest:
push esi
mov esi,edx
mov eax,ecx
cdq
idiv eax,esi
使用 dumpbin 进行反汇编会产生相同的结果。但是我发现的每个来源( 示例)都说 idiv 只能接受一个操作数。
当我尝试使用双操作数 idiv 汇编代码时,它失败了,正如我根据文档所预料的那样。为什么反汇编显示双操作数 idiv?