Код (Text): #include <iostream> using namespace std; extern "C" void TestProc(int n, char* mas); int main(void) { char* arr="Hello World"; int a=11; TestProc(a,arr); return 0; } Код (Text): .486 .MODEL FLAT,STDCALL OPTION CASEMAP:NONE .CODE TestProc PROC C size_array:DWORD, ptr_array:DWORD mov edi, ptr_array mov [edi], 35h ret TestProc ENDP END MASM на строчку mov [edi], 35h выдает modul.asm(9) : error A2070: invalid instruction operands Вопрос: как правильно получить адрес массива, чтобы с ним работать?
Код (Text): _TestProc ? Код (Text): mov byte ptr[edi], 35h mov word ptr[edi], 35h mov dword ptr[edi], 35h какой конкретно вариант нужен?
Во-первых, когда пишешь константу в память всегда нужно явно указывать размер области памяти byte ptr [edi] и т.п. (т.к. компилятор понятия не имеет, хочешь ли ты записать 35h байт, ворд или дворд) Во-вторых, по общему соглашению о вызовах процедуры\функции могут свободно изменять только регистры eax, edx и ecx, а остальные (ebx,ebp,edi,esi) не должны изменяться - в сл.необходимости их нужно сохранять на входе и восстанавливать на выходе из процедуры (или в масме юзать uses edi) В-третьих, в сишном коде объявления TestProc не мешало бы добавить stdcall
понятно. Вроде как extern "C" заставляет использовать sdtcall. С таким примером Код (Text): TestProc PROC C size_array:DWORD, ptr_array:DWORD mov ebx, ptr_array mov byte ptr [ebx], 35h ret TestProc ENDP собираться, но при запуске вылетает.
Dmitriy_M В сях не силен, но extern "C" вроде как просто не позволяет манглить имена, т.е. дописывать к ним всякте бяки "Заболели - полячитеся" (С) Использовать eax, вместо ebx - не судьба или религия не позволяет ? Ясно же было сказано:
Стал использовать eax. В описал процедуру extern "C" void __stdcall TestProc(char* mas); Добавил опцию для g++ -enable-stdcall-fixup. Все равно вылетает на mov byte ptr [eax], 35h Возврат массива работает Код (Text): .586 .MODEL FLAT,STDCALL OPTION CASEMAP:NONE .CODE TestProc PROC C ptr_array:DWORD mov eax, ptr_array lea eax, message ret TestProc ENDP .DATA message db "Hello World" Сложение двух чисел то же работает Код (Text): TestProc PROC C par1:DWORD, par2:DWORD mov eax, par1 add eax, par2 ret TestProc ENDP А с массивом не получается.
Ну ес-но, т.к. задает указатель на литеральную константу, запись в которую ес-но запрещена. Нужно юзать не константу, а реальный статический или динамич.массив