C++ Visual Studio是否发出错误的程序集代码?

C++ Visual Studio是否发出错误的程序集代码?,c++,visual-studio-2010,assembly,x86,C++,Visual Studio 2010,Assembly,X86,使用VS2010反汇编以下函数 int __stdcall modulo(int a, int b) { return a % b; } 给你: push ebp mov ebp,esp mov eax,dword ptr [ebp+8] cdq idiv eax,dword ptr [ebp+0Ch] mov eax,edx pop ebp ret

使用VS2010反汇编以下函数

int __stdcall modulo(int a, int b)
{
    return a % b;
}
给你:

push        ebp  
mov         ebp,esp  
mov         eax,dword ptr [ebp+8]  
cdq  
idiv        eax,dword ptr [ebp+0Ch]  
mov         eax,edx  
pop         ebp  
ret         8  
这很简单

现在,尝试与内联程序集相同的程序集代码失败,错误为C2414:操作数非法,指向idiv

我读到它说idiv只接受1个操作数:

将AX、DX:AX或EDX:EAX(股息)中的(有符号)值除以 源操作数(除数)并将结果存储在AX(AH:AL)中, DX:AX或EDX:EAX寄存器

果然,删除额外的eax编译后,函数将返回正确的结果


那么,这里发生了什么?为什么VS2010会发出错误代码?(顺便说一句,VS2012发射的是完全相同的组件)

最有可能的区别是,反汇编程序的作者希望其输出由人工读取,而不是由汇编程序读取。由于它是一个反汇编程序,我们假设底层代码已经被组装/编译,那么为什么还要担心它是否可以被重新组装呢

这里有两种主要的可能性:

  • 作者没有意识到或不记得红利对于
    idiv
    是隐式的(在这种情况下,这可能被认为是一个bug)
  • 他们认为,在输出中使其显式化将有助于读者理解反汇编的流程(在这种情况下,这是一个特性)。如果没有显式操作数,则很容易忽略在扫描反汇编时,
    idiv
    既依赖于eax又修改eax

您是(由编译器)生成汇编输出还是反汇编已编译的二进制文件?您使用的是什么汇编程序?@FredLarson我假设他使用的是VS 2010(ml.exe)附带的汇编程序。我是从IDE@Yuval请参见此图,并在编译时生成程序集。