2

我不明白为什么这段代码

#include <iostream>
using namespace std;
int main(){
    int result=0;

    _asm{
        mov eax,3;
        MUL eax,3;
        mov result,eax;
    }

    cout<<result<<endl;
    return 0;
}

显示以下错误。

1>c:\users\david\documents\visual studio 2010\projects\assembler_instructions\assembler_instructions.cpp(11): error C2414: 非法操作数数

一切似乎都很好,但为什么会出现此编译器错误?

4

4 回答 4

11

根据此页面,该mul指令仅采用一个参数:

多参数

这将“arg”乘以 A 寄存器中相应字节长度的值,见下表:

操作数大小 1 字节 2 字节 4 字节

其他操作数 AL AX EAX

结果的较高部分存储在:AH DX EDX

结果的下半部分存储在:AL AX EAX

于 2010-07-16T18:19:14.063 回答
4

因此,按照贾斯汀的链接遵循注释:

#include <iostream>

int main()
{
    int result=0;

    _asm{
        mov eax, 3;
        mov ebx, 4;
        mul ebx;
        mov result,eax;
    }

    std::cout << result << std::endl;

    return 0;
}
于 2010-07-19T15:31:03.540 回答
2

采用:

imul eax, 3;

或者:

imul eax, eax, 3;

这样你就不用担心 edx -register 被破坏了。它是“有符号整数乘法”。你似乎有 'int' -result 所以无论你使用 mul 还是 imul 都无关紧要。

有时我会因为在除法或乘法时没有将 edx 寄存器归零而出错。CPU是Intel core2 quad Q9550

您可以阅读令人麻木的过度设计但正确的英特尔说明参考手册。虽然英特尔前一段时间破坏了它的网站。不过,您可以尝试从 AMD 网站找到相同的参考手册。

更新:我找到了手册: http: //www.intel.com/design/pentiumii/manuals/243191.htm

我不知道他们什么时候会再次破坏他们的网站,所以你真的总是需要搜索它。

更新 2:阿格尔!这些是从 1999 年开始的。不幸的是,大多数细节都是一样的。

于 2010-07-20T16:34:11.763 回答
1

您应该下载英特尔架构手册。

http://www.intel.com/products/processor/manuals/

出于您的目的,第 2 卷将对您提供最大的帮助。

截至 2010 年 7 月访问时,它们是最新的。

于 2010-07-20T16:42:14.710 回答