C++ 内联汇编错误

标签 c++ visual-c++ assembly inline-assembly

我正在尝试使用内联汇编,但收到错误..

这是部分代码:

char * buffer = new char[10];
__asm {
    mov ecx,&buffer
    mov edx,07
}

以及错误;

Error 1 error C2400: inline assembler syntax error in 'second operand'; found 'AND'

我做错了什么?

最佳答案

这完全取决于您想要实现的目标。

1。如果您尝试将分配的 char 数组的地址加载到 ecx

buffer 的值已经是 ecx 所需的地址。它类似于 0x004F5A42 (仅作为示例),它是内存中 char 数组的地址,因此没有理由将 & 附加到 buffer 在你的 asm 代码中。 &buffer 将是 buffer 指针本身的地址,在内存中可能距离 char 数组有兆字节。

2。如果您尝试将 buffer 的地址加载到 ecx

你应该尝试这个:

char * buffer = new char[10];
char ** buffer_ptr = &buffer;
__asm {
    mov ecx,buffer_ptr
    mov edx,07
}

采用此解决方法的原因是,正如所显示的那样,& 的角色仅保留给 AND 运算符。以下引用摘自x86 Assembly Language Reference Manual

Operators

The assembler supports the following operators for use in expressions.

...

& Bitwise logical AND

此后手册中从未提及&

关于C++ 内联汇编错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11529659/

相关文章:

c++ - 在 VS 2005(8) IDE 中使用 GCC

linux - linux中的 'registering an ISR in DOS'相当于什么

c++ - 如何保证准确的线程休眠间隔?

c++ - SendMessage 收不到短信

c++ - 无法创建 constexpr std::vector

C++ 中的 Java 样式引用返回

c# - 如何使用 C++ 非托管库在 Visual Studio 2017 中为 Xamarin.Forms 设置项目?

c++ - 具有 0..n 参数的跨平台可变参数宏

c - 为什么编译器坚持在这里使用被调用者保存的寄存器?

c - 我怎样才能组装一个最小的工作 MIPS 程序?