2014-12-09 2 views
0

Мне нужно отредактировать строку, полученную от пользователя в коде C++ в сборке. Я нашел этот учебник http://msdn.microsoft.com/en-US/library/y8b57x4b(v=vs.80).aspx и в соответствии с этим моим код должен работатьVisual C++ inline assembly char *

int main() 
{ 
    char* s; 
    s=new char[80]; 
    cin.getline(s,80); 
    __asm 
    { 
     mov eax, offset s 
    } 
} 

Но компилятор выдает ошибку на линию с мами «неправильным типом операнда». Что не так, и как я могу это исправить?

+0

Возможно ли ваше приложение с 64-битным приложением? –

+0

@ 500-InternalServerError Nope – Ivan

+1

У вас есть недостающие точки с запятой ... Кроме того, зачем вам нужна сборка? Почему не внутренне? – Cameron

ответ

0

char* s - локальная переменная. Он будет создан, когда функция будет вызвана и «забыта», когда функция вернется. Для компиляции не существует «смещения» (то есть абсолютного адреса памяти). Но вы можете inline-ассемблерной силой загрузить указатель:

#include <iostream> 
using namespace std; 

int main() 
{ 
    char* s; 
    s=new char[80]; 
    __asm 
    { 
     mov ebx, s     ; = mov ebx, [ebp-4] 
     mov byte ptr [ebx], 'H' 
     mov byte ptr [ebx+1], 'e' 
     mov byte ptr [ebx+2], 'l' 
     mov byte ptr [ebx+3], 'l' 
     mov byte ptr [ebx+4], 'o' 
     mov byte ptr [ebx+5], 0  ; Don't forget the terminator! 
    } 

    cout << s << endl; 
    return 0; 
} 
+0

Спасибо! Это немного прояснилось. Но что, если я хочу скопировать строку в другой элемент за раз? Я попытался это: MOV EAX, с MOV EBX, d мов байт PTR [EBX], аль Но когда моя исходная строка содержит только цифры, некоторые случайные символы попадают в мою строку назначения. – Ivan

+0

Проклятье stackoverflow и отсутствие форматирования кода в комментариях. Надеюсь, ты понял, что я имел в виду. – Ivan

+0

Хорошо, я понял это сам. Большое спасибо, все работает сейчас – Ivan

Смежные вопросы