gpt4 book ai didi

c++ - Visual Studio 是否发出错误的汇编代码?

转载 作者:行者123 更新时间:2023-11-28 06:52:35 25 4
gpt4 key购买 nike

使用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 个操作数:

Divides the (signed) value in the AX, DX:AX, or EDX:EAX (dividend) by the source operand (divisor) and stores the result in the AX (AH:AL), DX:AX, or EDX:EAX registers

果然,删除额外的 eax 编译并且函数返回正确的结果。

那么,这里发生了什么?为什么 VS2010 发出错误代码? (顺便说一句,VS2012 发出完全相同的程序集)

最佳答案

差异很可能是反汇编程序的作者打算让人类而不是汇编程序读取其输出。既然是反汇编,就假设底层代码已经被汇编/编译好了,何必担心能不能重新汇编呢?

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

  • 作者没有意识到或不记得 idiv 的股息是隐含的(在这种情况下,这可能被认为是一个错误)。
  • 他们认为在输出中将其明确表示有助于读者理解反汇编的流程(在这种情况下它是一项功能)。如果没有明确的操作数,很容易忽略 idiv 在扫描反汇编时既依赖又修改 eax

关于c++ - Visual Studio 是否发出错误的汇编代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23664985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com