在vs __asm中使用c ++内联asm

时间:2011-05-18 12:06:29

标签: c++ pointers assembly compiler-errors inline-assembly

char name[25];
int generated_int;

for(int i = 0; i<sizeof(name); i++)
{
    name[i] = (char)0;
}

cout << "Name: ";
cin >> name;

int nameLen = strlen(name);

__asm
{
    pusha;

    mov esi, &name //I got error here, I cant use "&". How to move name address to esi?
    mov ecx, nameLen
    mov ebx, 45

start:
    mov al, [esi]
    and eax, 0xFF
    mul ebx
    inc esi
    add edi, eax
    inc ebx
    dec ecx
    jnz start

    mov generated_serial, edi

    popa
}



cout << endl << "Serial: " << generated_serial << endl << endl;

我不知道如何在asm块中获取我的chay数组的地址。 当我尝试使用“&amp;”时例如&amp; name我在编译时遇到错误:

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

更新:

mov esi,name给我这个编译错误:C2443:操作数大小冲突

更新2: lea工作正常。

4 个答案:

答案 0 :(得分:7)

您似乎正在寻找lea指令,该指令将某些符号的有效地址加载到寄存器中。以下说明会将name的地址存储在esi

lea esi, name

答案 1 :(得分:4)

name已经(或者更确切地说是衰变)指针。只需使用mov esi, name

答案 2 :(得分:1)

move esi, name

已经是姓名的地址。如果您想要内容(名称[0]),您将使用

move esi, [name]

答案 3 :(得分:1)

lea正在寻找:

#include <stdio.h>

int main()
{
    char name[25];
    char* fmt = "%p\n";

    __asm {
        lea eax,name
        push eax
        mov eax,fmt
        push fmt
        call printf
    }
    return 0;
}