Задача состоит из нескольких блоков.
Первый – инициализация массива данных. Для того, чтобы наглядно показать преимущества одномерных и двумерных массивов, половина программы массивы не использует совсем, во второй же половине используется одномерный массив, но работа с ним происходит как с двумерным.
Инициализация переменных идет последовательными запросами. Т.к. переменные типа байт, а чтение и запись в подпрограмме io.asm идет только с двубайтными переменными, то используется перенос в верхний регистр нулей, а в нижний – значащей части, размером в байт.
Вторая часть – вывод форматированной матрицы –столбцы состоят из ребер параллелепипедов. Вывод осуществляется стандартным 21м прерыванием и функциями io.asm.
Третья часть – расчеты 4х площадей поверхности параллелепипедов. Площадь задается двубайтным словом, а ребра – байты, поэтому для соблюдения правил работы с типами данных используется тот же прием, что и с инициализацией переменных.
Четвертая часть – вывод матрицы с площадями параллелепипедов в четвертой строке – для облегчения кода используется тот же примитивный метод обращения вне цикла к 21му прерыванию и функциям io.asm.
На этом этапе работа с данными без использования циклов становится невозможной, поэтому для дальнейшей работы все переменные переводятся в массив элементов размерностью слово (тот же метод использования верхнего и нижнего регистров).
Пятая часть – аналогична шестой – поиск наибольшего и наименьшего элементов массива площадей параллелепипедов. Для этой цели используются циклы без вложенности, с внутренним индексированием внутри массива. Причем, поскольку массив одномерный, представляющий двумерную матрицу, то индексация идет не последовательно, а скачками в 4 элемента по 2 байта каждый. В результате работы двух данных циклов на выходе получаем две переменных с самым большим и маленьким элементом массива, а также их индексами в нижней строке, для дальнейшей работы со столбцами.
Для выполнения шестой части программы – обмена местами столбцов с наименьшей площадью и наибольшей, вводится одномерный массив, для временного хранения в нем элементов столбца с наибольшей площадью. Т.е. сначала последовательно в цикле переводятся элементы столбца с наибольшей площадью во временный массив. После этого перемещаются элементы наименьшего массива на места элементов с наибольшей площадью.
После этого осуществляется перенос данных из временного массива на места элементов столбца с наименьшей площадью. Для внутренней индексации используются стандартные регистры si, di, bp во вложенных массивах.
Последняя, седьмая часть – вывод на экран преобразованной матрицы. Для вывода используется невложенный цикл, внутри которого выводится строка и символ конца строки с переводом каретки.
По завершении программы выводится сообщение и ожидается нажатие клавиши клавиатуры, для облегчения восприятия информации.