内联汇编lea与数组

时间:2013-12-23 18:45:31

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

你好我有关于lea指令和数组的问题,这很好用:

char *msg = new char[6];
msg = "hello";

_asm{
    push        10h
    push        0
    mov         eax, [msg]
    push        eax
    push        0
    call        MessageBox
     }

}

但为什么我在这里遇到“操作数大小冲突”错误?

char msg2[] = "hey2";
_asm{
    push        10h
    push        0
    mov         eax, [msg2]
    push        eax
    push        0
    call        MessageBox
}  

为什么它再次与lea一起工作?

char msg2[] = "hey2";
_asm{
    push        10h
    push        0
    lea         eax, [msg2]  // <-
    push        eax
    push        0
    call        MessageBox
}  

1 个答案:

答案 0 :(得分:1)

在这里,您尝试取消引用指向大小为char的指针,但是您尝试从中加载一个int。

mov         eax, [msg2]

不确定这是否是正确的语法,但您可以使用

mov   eax, offset msg3

这里,要加载地址,或使用lea指令。

在C中,这类似于:

char msg2[10];
char *p = &msg2[0];
int x = *p;

该指令不取消引用指针,它只取得它的地址,它也可以用某些运算符计算地址。

lea         eax, [msg2]  // <-

是等效的:

char msg2[10];
char *p = &msg2[0];