【问题标题】:C++ Inline assembly errorsC++ 内联汇编错误
【发布时间】:2012-07-17 19:36:56
【问题描述】:

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

这是部分代码:

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

还有错误;

错误 1 ​​错误 C2400: 'second 中的内联汇编语法错误 操作数';找到“和”

我做错了什么?

【问题讨论】:

  • Visual C++ 对我来说是一个遥远的记忆,但 lea ecx, buffer 怎么样?
  • 您将缓冲区定义为指针,为什么要将双指针传递给ecx?对吗?
  • & 是汇编语言中的 AND 运算符。看起来您在 _asm 块中使用 C++,这往往效果不佳。目前尚不清楚您要在这里做什么。您是否尝试将buffer 的值加载到寄存器中?还是您尝试加载buffer 变量的地址?
  • 我正在尝试加载地址
  • 您要加载哪个地址?你刚刚创建的 10 个字符的地址?或者buffer变量的地址?

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


【解决方案1】:

这完全取决于您要达到的目标。

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

buffer 的值已经是ecx 所需的地址。它类似于0x004F5A42(仅作为示例),它是内存中char 数组的地址,因此没有理由在您的asm 代码中将& 附加到buffer。 &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

运营商

汇编器支持在表达式中使用以下运算符。

...

& 按位逻辑与

此后& 从未在手册中提及。

【讨论】:

  • "&buffer 将是 buffer 指针本身的地址" 这就是 OP 在他们想要的 cmets 中所说的。 ;-]
猜你喜欢
  • 2015-03-17
  • 2010-10-23
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 2016-05-19
相关资源
最近更新 更多