Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
mcs51_1 / Пособие ч1.doc
Скачиваний:
37
Добавлен:
21.03.2016
Размер:
957.44 Кб
Скачать

3.3. Макроассемблер

Ассемблер А51 является макроассемблером и позволяет заменить повторяющиеся небольшие фрагменты текста (3-5 команд ассемблера) одной ссылкой с параметрами –макрокомандой.

Структура макроопределения

<имя макрокоманды> macro <список формальных параметров>

<тело макроопределения – список ассемблерных команд с параметрами)

endm

В программе используются макрокоманды с именем, обозначенным в MACRO, и фактическими параметрами, для которых имеет смысл подстановка в теле макроопределения.

Компилятор заменяет эти ссылки соответствующим отредактированным текстом (макроопределением). Размер текста программы сокращается, уровень программирования возрастает.

Учитывая ограниченный доступ к различным типам памяти, можно расширить список команд.

rsadd macro ri, SS ; SS-имя в памяти Data

mov a,ri

add a, SS

mov ri,a

endm

ssadd macro S1, S2 ; Si-имя в памяти Data

mov a,S1

add a, S2

mov S1,a

endm

Программа вычислений в макроассемблере

mov S1,a

mov S2,#55

rsadd r1,S1

ssadd S2,S1

Для 8-разрядной машины можно ввести 16-битовые команды – добавлением к списку команд (макрокоманд) типа RR(регистр-регистр), SS(память-память), RS(регистр-память), 16-битовой арифметики.

Макрокоманды (макроподстановки) сокращают текст программы и позволяют использовать систему команд, более подходящую к алгоритму решаемой задачи и опять же с целью сокращения текста программы. К сожалению, в предлагаемых работах макрокоманды приходится применять к уже полученному тексту программы на Ассемблере, как бы на этапе оптимизации длины этого текста.

Макрокоманды не следует путать с подпрограммами и функциями, повторное применение которых всегда влияют на сокращение длины программы, но время вычисления возрастает за счет сохранения и восстановления контекста.

3.4. Вычисление функции с фиксированной точкой в дробных числах.

Функция задана разложением в ряд Тейлора

sinx ~ x/1 – x3/3! + x5/5! – x7/7!

Выберем аргумент в диапазоне дробных чисел 0- 0.99 радиан.

Масштабирование выполняется после ввода и преобразования десятичных чисел в двоичную систему в 8-разрядном формате умножением на m=28. Дробное число приводится к целому. Деление заменяем умножением на дробный коэффициент в масштабе, например, 1/6 *28=42

y=x*x/28

    1. sinx ~ x*(0xff- y/6*(0xff-y/20*(0xff-y/42)/28)/28)/28

    2. x*(0xff- y*42/28 *(0xff-y*13/28 *(0xff-y*6/28)/28)/28)/28

При вычитании в формате байта используем приближенное значение единицы 0xff. Если вычитаемое не равно нулю, можно добавить единицу для повышения точности.

Объем программы 51 байт и среднее время вычисления 0.04 мс

В тексте выделены повторяющиеся фрагменты, которые могут быть обобщены макрокомандой

Задания.

  1. Для заданных функций разработать программу вычисления функции с плавающей точкой, вывести график, измерить среднее время вычисления одного значения и объем программы.

  1. Разработать программы вычисления с фиксированной точкой в С51 и в макроассемблере. Вычисление функции - в целых 8-разрядных числах в диапазоне аргумента 0 – 1.0 и с использованием макрокоманд и подпрограмм.

В дробных числах разработать программу вычислений в Ассемблере

Измерить среднее время вычислений и объем программы. Привести гистограммы изменения этих параметров для трех рассмотренных способов (две программы в Си и две в макроассемблере).

Варианты Задания по разделу 2.2.

1. 1/(1-x) ~ 1 + x + x2 + x3 + -1<x<1 (сходимость ряда)

2. 1/(1+x) ~ 1 – x + x2 - x3 + -1< x<1

3. (1+x)0.5 ~ 1 + x/2 – x2/(2*4) + 1*3*x3/(2*4*6) -1*3*5*x4/(2*4*6*9) -1<=x<=1

ax ~ 1 + (lna)/1*x + (lna)2 x2/2! + (lna)3 x3/3! + при всех x

a>1; lna(10*a/10) = ln10 + ln(a/10) =ln10 + ln(1-(1-a/10))

4. a=2

5. a=1/2

6. cosx ~ 1 – x2/2! + x4/4! – x6/6! + при всех х

7. tgx ~ x + x3/3 +2x5/15 + 17x7/315 +62x9/2835 -π /2 < x < π /2

8. ctgx ~ 1/x – (x/3 +x3/45 + 2x5/945 + 2x7/4725 + …) -π < x < π

9. ln(1+x) ~ x – x2/2 + x3/3 –x4/4 + x5/5 + -1 <x <1

10. ln(1-x) ~ -x – x2/2 - x3/3 - x4/4 - x5/5 – -1 <x <1

11. arcsin(x) ~ x + x3/(2*3) + 1*3*x5/(2*4*5) + 1*3*5x7/(2*4*6*7) + -1 <x <=1

12. arctg(x) ~ x – x3/3 + x5/5 – x7/7 + -1 <x <=1

13. (1-x)0.5 ~ 1 - x/2 – x2/(2*4) - 1*3*x3/(2*4*6) -1*3*5*x4/(2*4*6*9) -1 <=x <=1

14. (1+x)1/3 ~ 1 + x/3 -2x2/(3*6) + 2*5*x3/(3*6*9) -1 <=x <=1

15. (1+x)3/2 ~ 1 + 3x/2 + 3x2/(2*4) – 3x3/(2*4*6) +9x4/(2*4*6*8) -1 <=x <=1

16. arsh(x) ~ x - x3/(2*3) + 1*3*x5/(2*4*5) - 1*3*5x7/(2*4*6*7)

  1. ch(x) ~ 1 + x2/2! + x4/4! + x6/6! +

  1. sh(x) ~ x/1 + x3/3! + x5/5! + x7/7! +

  1. Si(x) ~ x – x3/(3*3!) + x5/(5*5!) – x7/(7 *7!)+

  1. Ci(x) ~ 1 – x2/(2*2! + x4/(4*4! – x6/(6*6! +

Соседние файлы в папке mcs51_1