Выполнение арифметических операций с целыми числами на языке ассемблера

Страницы работы

Содержание работы

 


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

 


Краткие теоретические сведения: Две предлагаемые программы используют один и тот же алгоритм. Одна программа “mpy8u_c” имеет оптимизированный код и использует циклическое повторение операций. Другая “mpy8u_s” имеет оптимизированный код, который сокращает время исполнение, и содержит последовательные повторяющиеся участки кода. Обе программы используют четыре регистра, причем для уменьшения количества исп. Регистров, длины кода и времени исполнения множитель и младший байт результата разделяют один и тот же регистр.

Кроме имеющихся двух программ есть еще одна программа “mpy8s”, которая реализует алгоритм Бауса для умножения знаковых чисел. Данная программа способна обеспечить как быстрое время исполнения, так и компактный код. Однако данный алгоритм имеет одно ограничение, о котором необходимо знать. Данный алгоритм не может работать, если множитель имеет минимально возможное значение “-128” и требуется использовать все 16 разрядов результата. Программа “mpy8s” использует четыре регистра, имеет длину кода 8 слов и время исполнения 73 такта.

Выполнение работы:

1.  Запускаю среду разработки.

2.  Создаю новый проект

3.  Создаю ассемблерный файл и прикрепляю его к созданному пректу.

4.  набираю код первой программы “mpy8u_c”:

;текст программы mpu8u_c, оптимизированной с точки зрения кода

.include "1200def.inc"

.def mc8u =r16                ;множимое

.def mp8u =r17                ;множитель

.def m8uL =r17                ;младший байт результата

.def m8uH =r18               ;старший байт результата

.def mcnt8u =r19              ;счетчик цикла

mpu8u_c:  clr        m8uH              ;очистка старшего байта результата

ldi  mcnt8u,8         ;инициализация счетчика цикла

lsr  mp8u               ;сдвиг множителя вправо

m8u_1:                 brcc     m8u_2             ;переход, при С=0

add            m8uH,mc8u    ;прибавление множимого к старшему байту результата

m8u_2:                 ror       m8uH              ;сдвижка вправо старшего байта результата

ror m8uL              ;сдвижка вправо младшего байта результата и множителя

dec            mcnt8u                        ;уменьшение на 1 счетчик цикла

brne          m8u_1             ;переход, если счетчик цикла еще не равен 0

ret

5.Провожу ассемблирование программы, и наблюдаю за результатами ее действий.

6. Выполняю аналогичные действия со следующими программами:

;текст программы mpu8u_s, оптимизированной с точки зрения времени исполнения

.include "1200def.inc"

.def mc8u =r16                ;множимое

.def mp8u =r17                ;множитель

.def m8uL =r17                ;младший байт результата

.def m8uH =r18               ;старший байт результата

.def mcnt8u =r19  ;счетчик цикла

mpu8u_s:  clr        m8uH             

lsr        mp8u              

                  brcc     noad80                      

Похожие материалы

Информация о работе