Проблема с написание программы с ассемблерной вставкой
Пишу сейчас работы для ВУЗа еще одну и там задание, что дан массив и через ассемблерную вставку нужно сложить все элементы массива (у меня 4 элемента) и вывести сумму. Я описал массив на 5 элементов, где в пятый элемент записывается вся сумма, но программа крашится. Подскажите пожалуйста, в чем проблема?
#include <iostream>
using namespace std;
int main() {
int arr[5];
cout << "Enter elements of array: ";
cin >> arr[0] >> arr[1] >> arr[2] >> arr[3];
cout << endl;
_asm {
Cycle:
mov eax,0
add eax, DWORD PTR arr[ecx * 4 - 4]
loop Cycle
mov arr[4],eax
}
cout << arr[4] << endl;
return 0;
}
Ответы (1 шт):
Команда loop проверяет равно ли значение регистра ecx нулю. И если нет, то уменьшает его на 1 и выполняет переход на метку.
У вас регистр ecx не инициализируется вообще, а значит ваш цикл выполняется произвольное число раз. А судя по тому, что программа крашится, выполняется больше 4 раз.
Вторая ошибка - зачем вы на каждой итерации обнуляете регистр eax?
Третья ошибка в неправильной индексации ecx * 4 - 4. Что вы этим хотели сказать? Зачем здесь -4? (У меня есть сомнения, что здесь нужно умножение на 4, но вроде таки нужно)
В итоге должно быть так
mov eax, 0
mov ecx, 3
Cycle:
add eax, DWORD PTR arr[ecx * 4]
loop Cycle
mov arr[4],eax