Нарушение прав доступа при записи по адресу в ассемблерной вставке на C

Возникла проблема с задачей с ассемблерной вставкой. Сама задача звучит так: дан массив A, состоящий из 16 байтов. Поместить в массив В адреса тех элементов исходного массива А, которые делятся на два. В исходном массиве А заменить их величинами с противоположным знаком. Элемент, для которого возможно переполнение при изменении знака, заменить 0. Использовать команды LEA. Задача и её решение в виде кода взяты из одного справочного материала, однако после запуска и ввода входных данных, которые опять же даны в этом справочном материале (например, при массиве А = {1, 2, 3, 4, 5, 6, -8, -128, 7, 8, 9, 10, 11, -128, -12, 12} в итоге должен получиться новый массив А = {1, -2, 3, -4, 5, -6, 8, 0, 7, -8, 9, -10, 11, 0, 12, -12 }, число элементов из массива A, делящихся на 2, k = 10, а массив адресов В = {AFFDD1, AFFDD3, AFFDD5, AFFDD6, AFFDD7, AFFDD9, AFFDDB, AFFDDD, AFFDDE, AFFDDF}), программа завершается с кодом -1073741819.

Код ассемблерной вставки:

__asm {
        ; начальные установки регистров
        lea esi, A; адрес начала массива А в esi
        lea edi, B; адрес начала массива В в edi
        mov cx, 16; счетчик числа повторений в цикле
        mov bl, 2; помещаем 2 в регистр bl для деления и подсчёта подходящих элементов
        mov k, 0; счетчик числа элементов в массиве В
        ; начало цикла
    L : mov al, [esi]; очередной элемент из А в регистр al
        cbw; расширяем байт до слова для деления
        idiv bl; деление текущего элемента из массива А на 2
        cmp ah, 0; сравнение остатка от деления с 0
        jne NEXT; если остаток от деления не равен 0 то переход к следующему элементу(метка NEXT)
        mov [edi], esi; иначе(делится на 2) помещаем адрес подходящего элемента массива А в массив В.
        inc k; увеличиваем счетчик подходящих элементов в массиве В на 1
        inc edi; увеличение адреса в массиве В на 2,
        inc edi; так как массив В описан как массив слов
        mov al, [esi]; возвращаем текущий элемент из А в регистр al
        neg al; изменение знака элемента массива А на противоположный
        jo M; если произошло переполнение, то замена элемента 0 (метка М)
        mov [esi], al; иначе текущий элемент из А меняется на противоположный из регистра al
        jmp NEXT; переход к следующему элементу массива А(метка NEXT)
    M: mov byte ptr [esi], 0; Замена текущего элемента массива А нулем при переполнении
    NEXT : inc esi; увеличение адреса массива А на 1 (для байтового массива)
    LOOP L; анализ конца цикла и переход на его начало(метка L)
    }

Результаты отладки приведены на фото:

Результат отладки

Я читала о том, с чем может быть связано вызывание данного исключения, но пока, к сожалению, не понимаю, в чём проблема в данном коде.


Ответы (0 шт):