Сумма элементов матрицы ассемблер

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14

; Его адрес в сегменте стека ВР + 4, потому что при выполнении

; команды CALL в стек поместили адрес возврата – 2 байта для процедуры

; типа NEAR (или 4 – для FAR), а потом еще и ВР – 2 байта

mov bx,[bp+6] ; считать параметр 1

Параметры в стеке, адрес возврата и старое значение ВР вместе называются активационной записью функции.

Для удобства ссылок на параметры, переданные в стеке, внутри функции иногда используют директивы EQU, чтобы не писать каждый раз точное смещение параметра от начала активационной записи (то есть от ВР), например так:

xyzzy proc near

xyzzy_z equ [bp+8]

xyzzy_y equ [bp+6]

xyzzy_x equ [bp+4]

(команды, которые могут использовать стек)

mov ax, xyzzy_x ;считать параметр X

При внимательном анализе этого метода передачи параметров возникает сразу два вопроса: кто должен удалять параметры из стека, процедура или вызывающая ее программа, и в каком порядке помещать параметры в стек. В обоих случаях оказывается, что оба варианта имеют свои «за» и «против», так, например, если стек освобождает процедура (командой RET число_байтов), то код программы получается меньшим, а если за освобождение стека от параметров отвечает вызывающая функция, как в нашем примере, то становится возможным вызвать несколько функций с одними и теми же параметрами просто последовательными командами CALL. Первый способ, более строгий, используется при реализации процедур в языке Pascal, а второй, дающий больше возможностей для оптимизации, – в языке С. Разумеется, если передача параметров через стек применяется и для возврата результатов работы процедуры, из стека не надо удалять все параметры, но популярные языки высокого уровня не пользуются этим методом. Кроме того, в языке С параметры помещают в стек в обратном порядке (справа налево), так что становятся возможными функции с изменяемым числом параметров (как, например, printf – первый параметр, считываемый из [ВР+4], определяет число остальных параметров). Но подробнее о тонкостях передачи параметров в стеке рассказано далее, а здесь приведен обзор методов.

4.4.3 Передача параметров в потоке кода

Читайте также:  Столик на руль своими руками

В этом необычном методе передаваемые процедуре данные размещаются прямо в коде программы, сразу после команды CALL (как реализована процедура print в одной из стандартных библиотек процедур для ассемблера UCRLIB):

db "This ASCIZ-line will be printed",0

Чтобы прочитать параметр, процедура должна использовать его адрес, который автоматически передается в стеке как адрес возврата из процедуры. Разумеется, функция должна будет изменить адрес возврата на первый байт после конца переданных параметров перед выполнением команды RET. Например, процедуру print можно реализовать следующим образом:

print proc near

mov si,[bp+2] ; прочитать адрес

cld ; установить флаг направления

; для команды lodsb

lodsb ; прочитать байт из строки,

test al, al ; если это 0 (конец строки),

jz print_done ; вывод строки закончен

int 29h ; вывести символ в AL на экран

jmp short print_readchar

mov [bp+2],si ; поместить новый адрес возврата в стек

Передача параметров в потоке кода, так же, как и передача параметров в стеке в обратном порядке (справа налево), позволяет передавать различное число параметров. Но этот метод – единственный, позволяющий передать по значению параметр различной длины, что и продемонстрировал этот пример. Доступ к параметрам, переданным в потоке кода, несколько медленнее, чем к параметрам, переданным в регистрах, глобальных переменных или стеке, и примерно совпадает со следующим методом.

Дан двумерный массив. Размер массива и его элементы вводятся пользователем с клавиатуры. Результат работы программы выводится на экран.

1) Посчитать и вывести сумму положительных элементов, расположенных под главной диагональю матрицы.

2) Заменить элементы главной диагонали на суммы элементов соответствующих строк, затем отсортировать получившийся массив по возрастанию элементов главной диагонали.

3) Решить систему линейных уравнений методом Гаусса, в случае несуществования решения вывести сообщение.

4) Посчитать и вывести суммы элементов больше заданного пользователем числа, расположенных в верхнем и нижнем треугольниках, образуемых диагоналями. Заменить элементы кратные 3 левого треугольника на первую сумму, а кратные 5 на вторую.

5) Отсортировать массив по возрастанию элементов побочной диагонали, затем поменять местами элементы, расположенные над и под побочной диагональю.

6) Отсортировать строки матрицы по суммам модулей элементов и вывести столбец с максимальным количеством отрицательных элементов.

Читайте также:  Цезарь 5 игра дата выхода

7) Подсчитать и вывести максимальный диагональный минор матрицы.

8) Отсортировать элементы матрицы по возрастанию среднего арифметического по столбцу.

9) Найти произведение матриц произвольного размера (должна производиться проверка возможности выполнения операции умножения).

10) Посчитать и вывести обратную матрицу методом Гаусса.

11) Найти в верхнем треугольнике, образуемом диагоналями максимальный элемент, а в нижнем минимальный. Затем увеличить минимальный элемент на 30%, а максимальный уменьшить на 30% от разности этих элементов. Повторять процедуру до тех пор, пока разность между элементами превышает 10%.

12) Найти и вывести определитель матрицы. Все элементы матрицы, значение которых больше определителя уменьшить на 20%, элементы, значение которых меньше увеличить на 30%.

13) В матрице поменять местами элементы треугольников, образованных диагоналями, заданное пользователем количество раз по часовой стрелке

Результат (количество раз – 2)

14) Повернуть элементы матрицы внутренний ряд по часовой стрелке, следующий против и т. д.

15) Найти максимум по каждому столбцу, затем вычесть из него n-1 (n количество элементов в массиве), к каждому элементу столбца прибавить 1. Найти минимум по строке, затем прибавить к нему n-1 (n количество элементов в массиве), из каждого элемента строки вычесть 1.

16) Сортировать каждый столбец по возрастанию, а строку по убыванию до тех пор, пока на очередном шаге итерации матрица останется неизменной, но не более 5 итераций.

4.6 Требования к отчету

Отчет лабораторной работы представляется в печатном виде.

Отчет должен содержать:

– цель лабораторной работы;

– исходный текст программы;

– результат в 16-тиричном и 10-тичном виде.

4.7 Контрольные вопросы и упражнения

1) Опишите способ задания одномерного и многомерного массивов.

2) Опишите способы обращения к элементам массива.

3) Опишите работу команды LOOP с примером.

4) Опишите синтаксис создания процедуры с примером.

5) Опишите команды работы со стеком.

6) Дан двумерный массив, найти среднее арифметическое элементов главной диагонали.

7) Дан двумерный массив, записать в качестве элементов побочной диагонали суммы по строкам.

8) Дан двумерный массив, отсортировать его по возрастанию.

9) Дан двумерный массив, поменять местами главную и побочную диагонали.

Читайте также:  Устройство не имеет необходимых служб bluetooth mac

5 Лабораторная работа №5 «Работа с математическим сопроцессором в среде Assembler»

Цель работы: изучить основные команды для работы с математическим сопроцессором: занесение/извлечение данных, арифметические операции.

5.1 Основные сведения

Сопроцессор – это специализированная интегральная схема, которая работает в содружестве с ЦП, но менее универсальна. Сопроцессор предназначен для выполнения специфического набора функций, например: выполнение операций с вещественными числами – математический сопроцессор, подготовка графических изображений и трехмерных сцен – графический сопроцессор, цифровая обработка сигналов – сигнальный сопроцессор и др.

Один из наиболее распространенных типов сопроцессоров – математический сопроцессор. Математический сопроцессор предназначен для быстрого выполнения арифметических операций с плавающей точкой, предоставления часто используемых вещественных констант (, log210, log2e, ln2, :), вычисления тригонометрических и прочих трансцендентных функций (tg, arctg, log, . ).

Для того, чтобы оценить ресурс, необходимо авторизоваться.

В методических указаниях приведено описание основных команд языка Assembler для ввода и вывод данных, работы с массивами, арифметическим сопроцессором и файлами. Методические указания предназначены для студентов направления подготовки бакалавров по направлению 230100.62 "Информатика и вычислительная техника", изучающих курс "Машинно-ориентированные языки".

Как задать матрицу способом, аналогичным тому, которым задается вектор?

1 ответ 1

В простейшем случае все элементы матрицы можно хранить в памяти подряд, тогда объявление матрицы с заданными значениями будет выглядеть так:

(отступы добавлены для удобства восприятия, особой смысловой нагрузки не несут)

Эти данные можно будет рассматривать как матрицу 3×5. Адрес элемента с индексами i, j (индексы считаем от 0) будет matrix1 + 2*i*5 + j (где 2 – размер элемента, 5 – длина строки).

Возможны другие варианты реализации, например, сначала идет массив смещений (адресов) строк, а потом уже сами строки. Это реализуется несколько сложнее (через макросы, например). Доступ к конкретному элементу будет выполняться в два этапа: получение адреса строки, потом получение адреса элемента в строке. Такой подход позволяет реализовать "зубчатые" массивы, т.е. массивы с переменной длиной строки, что удобно, например, при создании массива текстовых строк.

Оцените статью
Добавить комментарий

Adblock detector