Кодеры на C++ помощь! Проблема с операyдом на 37 строке.
Проблема с операндом на 37 строке. недопустимый тип операнда. Если что, это задание на курсовую пытаюсь сделать, по нему я должен «В каждом предложении
текстового файла переставить очередность слов в обратном порядке». И основную операцию алгоритма программы надо сделать на ассемблере. Вот код:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream inputFile;
inputFile.open ("input.txt");
ofstream outputFile;
outputFile.open ("output.txt");
if ( inputFile.fail ()) {
cout << "input.txt not found" << endl;
return -1;
}
if ( outputFile.fail ()) {
cout << "not able to open output.txt" << endl;
return -1;
}
int i = 0;
int count = 0;
string words[1000];
while (inputFile >> words[i]) {
count++;
i++;
}
__asm {
mov ecx, count
dec ecx
// Получаем текущее значение EIP с помощью вызова
call label_after_push
reverse_loop :
mov eax, offset words // Загружаем адрес массива слов в eax
mov ebx, ecx // Копируем значение ecx в ebx для вычисления смещения
shl ebx, 2 // Умножаем значение ebx на 4 (размер элемента массива)
add eax, ebx // Прибавляем смещение к адресу массива, чтобы получить адрес конкретного элемента
mov eax, [eax] // Загружаем слово words[i] в eax
push eax // Сохраняем слово в стеке для вызова функции записи в файл
lea eax, outputFile // Загружаем адрес объекта outputFile в eax
push eax // Сохраняем его в стеке для вызова функции записи в файл
call dword ptr[eax + 16] // Вызываем функцию write объекта outputFile
add esp, 8 // Очищаем параметры из стека
loop reverse_loop // Повторяем цикл до достижения конца массива
label_after_push :
pop edx // Получаем текущее значение EIP (адрес следующей инструкции после вызова)
}
inputFile.close();
outputFile.close();
return 0;
}
1. Вместо непосредственного вызова методов C++ из ассемблера, лучше выполните основные операции перестановки в ассемблере, а затем используйте C++ для ввода/вывода и работы с файлами.
2. Ограничьте использование ассемблера операциями перестановки в массиве слов, а затем возвращайтесь в C++ для записи результатов в файл.
Если ваша основная цель — научиться интеграции ассемблерного кода в C++ программу, я рекомендую начать с более простых задач, чтобы постепенно разобраться во взаимодействии между этими языками. Управление памятью, соглашения вызова и взаимодействие с объектами C++ являются продвинутыми темами, требующими глубокого понимания обеих областей.
Умоляю вас подскажите где вы научились 🙏