Сравнить поэлементно два массива и записать максимальный элемент из каждой пары в третий массив - 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

Объяснение кода листинга программы

В данном коде происходит сравнение двух массивов попарно и запись максимального элемента в третий массив.

  1. Первые три строки кода определяют три указателя на начало каждого из массивов: ESI — на первый массив, EDX — на второй массив, EDI — на третий массив.
  2. Четвёртая строка определяет счётчик числа элементов в массивах.
  3. Пятая строка изменяет направление переходов в циклах на прямые.
  4. Метка _lp обозначает начало цикла.
  5. Десятая строка выполняет загрузку из первого массива в регистр AL и увеличивает счётчик ESI на 1 (переход к следующей ячейке).
  6. Одиннадцатая строка сравнивает значение в AL с соответствующим значением второго массива (EDX). Если значение в AL больше или равно значению в EDX, то происходит переход к следующей итерации цикла (jump).
  7. Двенадцатая строка выполняет загрузку значения из второго массива в AL.
  8. Семнадцатая строка выполняет запись значения из AL по адресу в EDI и увеличивает счётчик EDI на 1 (переход к следующей ячейке).
  9. Восемнадцатая строка увеличивает счётчик EDX на 1 (переход к следующей ячейке).
  10. Девятнадцатая строка выполняет проверку, что счётчик ECX не равен нулю, и в случае, если это так, происходит возврат к началу цикла (loop).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы