【发布时间】:2014-05-14 20:58:18
【问题描述】:
用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 发出完全相同的程序集)
【问题讨论】:
-
您是生成汇编输出(由编译器)还是反汇编编译后的二进制文件?
-
你用的是什么汇编程序?
-
@FredLarson 我假设他正在使用 VS 2010 (ml.exe) 附带的汇编程序。
-
我正在使用 IDE 中的反汇编功能
-
@Yuval 查看stackoverflow.com/questions/1020498/… 并在编译时生成程序集。
标签: c++ visual-studio-2010 assembly x86