使用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
这非常简单 .
现在,尝试使用与内联汇编相同的汇编代码失败 error C2414: illegal number of operands
,指向idiv .
我读了Intel's manual,它说idiv只接受1个操作数:
将AX,DX:AX或EDX:EAX(被除数)中的(带符号)值除以源操作数(除数),并将结果存储在AX(AH:AL),DX:AX或EDX中:EAX寄存器
果然,删除额外的eax编译,函数返回正确的结果 .
那么,这里发生了什么?为什么VS2010发出错误的代码? (顺便说一句,VS2012发出完全相同的组件)
1 回答
差异,最有可能的是,反汇编程序的作者打算让其输出由人而不是汇编程序读取 . 因为它是一个反汇编,所以假设底层代码已经被组装/编译,那么为什么要担心它是否可以重新组装?
这里有两个主要的可能性:
作者没有记得被分红是隐含的
idiv
(在这种情况下,这可能被认为是一个错误) .他们认为在输出中明确表示将有助于读者试图理解反汇编的流程(在这种情况下它是一个特征) . 如果没有显式操作数,很容易忽略
idiv
在扫描反汇编时依赖并修改eax
.