Отправка строк в C++ из MASM

Итак, я пытаюсь сделать игру Tik Tak Toe в MASM 32-битной, но я не могу понять, как передать строку из MASM в C++ для вывода текста на консоль. Любая помощь приветствуется.

C++

// main.cpp
using namespace std;
#include<iostream>
#include<string>

extern "C" void asmMain();
extern "C" void printString(string msg);

int main() {
    asmMain();
    return 0;
}

void printString(string msg)
{
    cout << msg << endl;
}

Масм

.386
.MODEL FLAT, stdcall
.STACK 4096

printString PROTO C
.DATA
sIntroMessage BYTE "Welcome To Tik Tak Toe!"

.CODE
asmMain PROC C
    mov ecx, sIntroMessage
    call printString
asmMain ENDP
END

person Hayden Stegman    schedule 14.12.2020    source источник
comment
Используйте строки C, а не строки C++, которые намного сложнее.   -  person doron    schedule 15.12.2020
comment
Убедитесь, что вы следуете соглашению о вызовах, которое для stdcall требует, чтобы вызывающий объект передавал параметры в стеке. Посмотрите на разборку, чтобы лучше понять   -  person doron    schedule 15.12.2020


Ответы (1)


Я предполагаю, что вы используете компилятор и ассемблер Microsoft C/C++, и, насколько я помню, соглашение о вызовах по умолчанию - это cdecl, а не stdcall, упомянутое в комментариях. Директива stdcall в вашем файле сборки применяется, если кто-то должен вызвать вашу функцию из C/C++. В вашем ассемблерном коде, если ваши функции принимают аргументы, вам нужно указать количество аргументов * 4. Предполагая, что printString является cdecl, вам нужно поместить аргументы в стек вместо того, чтобы перемещать их в ecx, а затем восстановить указатель стека после выполнения вызова.

.386
.MODEL FLAT, stdcall
.STACK 4096

printString PROTO C
.DATA
sIntroMessage BYTE "Welcome To Tik Tak Toe!"

.CODE
asmMain PROC C
    lea ecx, sIntroMessage
    push ecx
    call printString
    add esp,4
asmMain ENDP
END

Также упоминается в комментариях, что ваша функция printString должна вместо этого принимать аргумент char*, а не строковый объект. Если вы не хотите самостоятельно создавать строковый объект в файле сборки, что является более трудоемким и утомительным.

using namespace std;
#include<iostream>
#include<string>

extern "C" void asmMain();
extern "C" void printString(char* msg);

int main() {
    asmMain();
    return 0;
}

void printString(char* msg)
{
    cout << msg << endl;
}
person Jade    schedule 29.12.2020