C++ Visual Studio是否发出错误的程序集代码?
使用VS2010反汇编以下函数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
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发射的是完全相同的组件)最有可能的区别是,反汇编程序的作者希望其输出由人工读取,而不是由汇编程序读取。由于它是一个反汇编程序,我们假设底层代码已经被组装/编译,那么为什么还要担心它是否可以被重新组装呢 这里有两种主要的可能性:
- 作者没有意识到或不记得红利对于
是隐式的(在这种情况下,这可能被认为是一个bug)idiv
- 他们认为,在输出中使其显式化将有助于读者理解反汇编的流程(在这种情况下,这是一个特性)。如果没有显式操作数,则很容易忽略在扫描反汇编时,
既依赖于eax又修改eaxidiv