2011-05-18 158 views
2
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塊中的地址。 當我嘗試使用「&」時,例如&名字我得到錯誤,而編譯:inline asm in C++ in vs __asm

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

UPDATE:

MOV ESI,名字給我這個編譯錯誤:C2443:操作數大小衝突

更新2: LEA工作正常。

回答

6

您似乎在尋找lea指令,該指令將某個符號的有效地址加載到寄存器中。以下指令將把name的地址存儲在esi中。

lea esi, name 
+0

mov esi,名稱給我這個編譯錯誤:C2443:操作數大小衝突 – Hooch 2011-05-18 12:59:46

4

name已經(或相當衰減)一個指針。只需使用mov esi, name即可。

+0

MOV ESI,名字給我這個編譯錯誤:C2443:操作數大小衝突 – Hooch 2011-05-18 12:59:54

+0

將操作數大小等於esi寄存器。 (鑄造之前_asm) – 2012-07-17 13:03:45

1
move esi, name 

已經是名稱的地址。如果你想要的內容(姓名[0]),需要使用

move esi, [name] 
+0

mov esi,名稱給我這個編譯錯誤:C2443:操作數大小衝突 – Hooch 2011-05-18 12:59:30

+0

@Hooch - 可能是因爲它是一個char數組。彙編程序真的不應該關心類型,它只是一個地址。 – 2011-05-18 13:18:40

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; 
}