Top.Mail.Ru
Ответы

Кодеры на 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++ являются продвинутыми темами, требующими глубокого понимания обеих областей.

Аватар пользователя
Ученик

Умоляю вас подскажите где вы научились 🙏