首页 文章

Visual Studio是否会发出错误的汇编代码?

提问于
浏览
0

使用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 回答

  • 1

    差异,最有可能的是,反汇编程序的作者打算让其输出由人而不是汇编程序读取 . 因为它是一个反汇编,所以假设底层代码已经被组装/编译,那么为什么要担心它是否可以重新组装?

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

    • 作者没有记得被分红是隐含的 idiv (在这种情况下,这可能被认为是一个错误) .

    • 他们认为在输出中明确表示将有助于读者试图理解反汇编的流程(在这种情况下它是一个特征) . 如果没有显式操作数,很容易忽略 idiv 在扫描反汇编时依赖并修改 eax .

相关问题