Нарушение прав доступа при записи по адресу в ассемблерной вставке на 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)
}
Результаты отладки приведены на фото:
Я читала о том, с чем может быть связано вызывание данного исключения, но пока, к сожалению, не понимаю, в чём проблема в данном коде.