Проблема с написание программы с ассемблерной вставкой

Пишу сейчас работы для ВУЗа еще одну и там задание, что дан массив и через ассемблерную вставку нужно сложить все элементы массива (у меня 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 шт):

Автор решения: Anton Shchyrov

Команда 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
→ Ссылка