Сравнить поэлементно два массива и записать максимальный элемент из каждой пары в третий массив - Assembler
Формулировка задачи:
Доброго времени суток! Я пишу программу на С++, у меня есть 3 массива: 2 исходных и 1 результирующий. Мне необходимо написать ассемблерную вставку, в которой будут сравниваться элементы 2 исходных массивов, после чего максимальный элемент из каждой пары будет записываться в третий массив. Как это реализовать? В каких регистрах хранить ссылки на массивы?
Решение задачи: «Сравнить поэлементно два массива и записать максимальный элемент из каждой пары в третий массив»
textual
Листинг программы
; для массива с размером ячейки байт mov ESI,mass_1 ; адрес массива 1 в ESI mov EDX,mass_2 ; адрес массива 2 в EDX mov EDI,mass_3 ; адрес массива 2 в EDI mov ECX,[size_mas] ; счетчик числа элементов массива cld ; адреса возрастают _lp: ; начало цикла lodsb ; загрузка из адреса ESI в AL, ESI+1 перейти на следующую яч. массива 1 cmp AL,[EDX] ; сравнить ячейку первого массива с ячейкой второго jae @f ; если яч. из массива 1 больше или равна яч. массива 2 то прыгать на метку вперёд mov AL,[EDX] ; если нет, то загрузить в AL значение из второго массива @@: ; та самая "метка вперёд" stosb ; загрузка из AL по адресу в EDI в , EDI+1 перейти на следующую яч. массива 3 inc EDX ; EDX+1 ; перейти на следующую яч. массива 2 loop _lp ; ECX-1 и если ECX не 0, то вернуться на _lp
Объяснение кода листинга программы
В данном коде происходит сравнение двух массивов попарно и запись максимального элемента в третий массив.
- Первые три строки кода определяют три указателя на начало каждого из массивов: ESI — на первый массив, EDX — на второй массив, EDI — на третий массив.
- Четвёртая строка определяет счётчик числа элементов в массивах.
- Пятая строка изменяет направление переходов в циклах на прямые.
- Метка _lp обозначает начало цикла.
- Десятая строка выполняет загрузку из первого массива в регистр AL и увеличивает счётчик ESI на 1 (переход к следующей ячейке).
- Одиннадцатая строка сравнивает значение в AL с соответствующим значением второго массива (EDX). Если значение в AL больше или равно значению в EDX, то происходит переход к следующей итерации цикла (jump).
- Двенадцатая строка выполняет загрузку значения из второго массива в AL.
- Семнадцатая строка выполняет запись значения из AL по адресу в EDI и увеличивает счётчик EDI на 1 (переход к следующей ячейке).
- Восемнадцатая строка увеличивает счётчик EDX на 1 (переход к следующей ячейке).
- Девятнадцатая строка выполняет проверку, что счётчик ECX не равен нулю, и в случае, если это так, происходит возврат к началу цикла (loop).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д