Встроенный asm в c ++ в vs __asm - PullRequest
2 голосов
/ 18 мая 2011
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;

Я не знаю, как получить адрес моего массива chay в блоке asm. Когда я пытаюсь использовать "&", например & name я получаю ошибку при компиляции:

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

UPDATE:

mov esi, name дает мне эту ошибку компиляции: C2443: конфликт размера операнда

ОБНОВЛЕНИЕ 2: Леа работает отлично.

Ответы [ 4 ]

7 голосов
/ 18 мая 2011

Вы, похоже, ищете инструкцию lea, которая загружает эффективный адрес некоторого символа в регистр. Следующая инструкция сохранит адрес name в esi.

lea esi, name
4 голосов
/ 18 мая 2011

name уже (или скорее распадается) на указатель. Просто используйте mov esi, name.

1 голос
/ 18 мая 2011

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;
}
1 голос
/ 18 мая 2011
move esi, name

уже является адресом имени.Если бы вы хотели контент (имя [0]), вы бы использовали

move esi, [name]
...