
- •2202. Целью курса является изучение принципов построения
- •In out | разряды
- •000 До fff. В каждом слове памяти могут храниться четыре
- •1.2 Язык ассемблера простой эвм
- •4. Псевдокоманды указывают ассемблеру, каким образом разместить
- •1.2 Структуры данных ассемблера и алгоритм его работы
- •1.2 Пpимеpы использования макpоязыка. Обсуждение.
- •2. Имеется два макроопределения, предназначенных для
1.2 Пpимеpы использования макpоязыка. Обсуждение.
Рассмотрим несколько простых примеров.
Пример 1. Макроопределение для вычисления суммы двух слагаемых.
PLUS macro &result,&arg1,&arg2
lda &arg1 ; поместить первое слагаемое в А
add &arg2 ; прибавить второе слагаемое
sta &result ; сохранить результат
mend
Пример 2. Фрагмент программы на макроязыке, использующей
макроопределениe PLUS.
....
PLUS z,a,c ; Макрокоманда PLUS c фактическими параметрами z,a,c
PLUS u,u,=1 ; Ta же макрокоманда с параметрами u,u,=1 (третий параметр
; литерал)
....
Пример 3. Макроопределение для ввода/вывода числа.
Здесь один из параметров используется в поле кода операции.
TRANSFER macro &IO_oper,&data
ldy &data
&IO_oper
sty &data
mend
Пример 4. Использование макрокоманды TRANSFER.
TRANSFER in, word ; ввод из порта в слово word
TRANSFER out, area ; вывод в порт из слова area
Пример 5. Макроопределение для вычисления абсолютной величины числа.
ABS macro &data,&result
lda &data
jns *+2
neg
sta &result
mend
Пример 6. Программа на макроязыке, использующая макроопределения
TRANSFER, ABS и PLUS. В ней выполняется ввод двух чисел и
подсчитывается сумма их абсолютных величин.
TRANSFER in,_A
TRANSFER in,_B
ABS _A,_absA
ABS _B,_absB
PLUS _absA,_absB,sum
TRANSFER out,SUM
stop
_A bss 1
_B bss 1
_absA bss 1
_absB bss 1
sum bss 1
end
В результате макрогенерации будет получен текст
ldy _A
in
sty _A
ldy _B
in
sty _B
lda _A
jns *+2
neg
sta _absA
lda _B
jns *+2
neg
sta _absB
lda _absA
add _absB
sta sum
ldy sum
out
sty sum
stop
_A bss 1
_B bss 1
_absA bss 1
_absB bss 1
sum bss 1
end
Как видно из рассмотренных примеров, макроязык
позволяет вводить новые операции, которые отсутствуют в
исходном языке ассемблера. Макроопределения имеют
определенное сходство с подпрограммами, но в то же время
существенно отличаются от них. Сходство состоит в том, что с
использованием и макрокоманд и подпрограмм можно "расширить"
исходный язык, написав соответствующие подрограммы или
макроопределения для определения новых операции. Различие
заключается в использовании подпрограмм и макрокоманд. При
использовании подпрограммы ее вызов состоит в переходе на
первую команду этой подпрограммы и выполняется во время
выполнения программы. Код подпрограммы существует в одном
экземпляре. При использовании макрокоманд происходит их
замена на текст соответствующих макроопределений. Эта замена
выполняется во время макроге- нерации, т.е. до выполнения
самой программы. При этом если одна макрокоманда была
использована несколько раз, то происходит размножение текста
соответ- ствующего ей макроопределения. При использовании
подпрограмм достигается экономия памяти за счет того что код
подпрограммы не повторяется при каждом обращении к ней. При
использовании макрокоманд экономится время выполнения за
счет исключения дополнительных команды, связанных с
передачей параметров подпрограмме и перехода на нее. Обычно
использование макрокоманд на практике оказывается
оправданным в случаях когда требуется ускорить критический
участок программы за счет тщательно написанных небольших
макроопределений.
2. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
1. После вступительного коллоквиума получить задание.
2. Разработать алгоритм решения задачи.
3. Написать макроопределения и тщательно отладить их.
4. Написать программу, использующую макроопределения, и отладить ее.
5. Составить отчет по pаботе. Отчет должен содержать
- развернутую постановку задачи, включая необходимое
математическое обоснование;
- исходный текст программы на макроязыке;
- листинг трансляции исходной программы;
- результаты выполнения контрольного примера.
3. ВАРИАНТЫ ЗАДАНИЙ
( ВНИМАНИЕ : Приводмые ниже форматы макроопределений,
их имена, параметры, число параметров и порядок их
следования являются рекомендательными, а не обязательными. )
1. Макроопределение для копирования массива
COPY macro &dst,&src,&len
...
mend
и для вводa/вывода массивов
TRBLOCK macro &IO_oper,&area,&length
....
mend
и программа для ввода блока и вывода его в обратном порядке.
2. Макроопределение для вычисления факториала
FACT macro &n,&result
....
mend
и вычисление числа сочетаний с использованием разработанного
макроопределения.
3. Макроопределения для вычисления суммы элементов
массива и перестановка двух областей памяти
SUM macro &array,&length,&result
....
mend
SWAP macro &area1,&area2
....
mend
и сортировка массива массивов в порядке убывания суммы
с использованием макроопределений SUM и SWAP.
4. Макpоопеделения для сложения и умножения простых
дробей.
ADDFR macro &a1,&b1,&a2,&b2,&c,&d
....
mend
MULFR macro &a1,&b1,&a2,&b2,&c,&d
....
mend
и программа умножения матриц 2*2, элементами которых
являются простые дроби.
5. Макроопределения для доступа к элементам матрицы
(хранение по строкам)
GetMxEl macro &matr,&i,&j,&lrow,&result
....
mend
PutMxEl macro &matr,&i,&j,&lrow,&data
....
mend
и программа транспонирования матриц, использующая эти
макроопределения.
6. Макроопределения для работы с комплексными числами
ADDC macro &ReA,&ImA,&ReB,&ReB,&ReRes,&ImRes
...
mend
SUBB macro &ReA,&ImA,&ReB,&ReB,&ReRes,&ImRes
...
mend
MULC macro &ReA,&ImA,&ReB,&ReB,&ReRes,&ImRes
...
mend
DIVC macro &ReA,&ImA,&ReB,&ReB,&ReRes,&ImRes
...
mend
и программа вычисления выражения (a+b*c)/d, где a,b,c,d -
комплексные числа (деление целочисленное).
7. Макроопределения для вычисления суммы квадратов
элементов массива (т.е. квадрата нормы) и для перестановки
массивов
NORM2 macro &array,&len,&result
...
mend
SWAP macro &array1,&array2,&len
...
mend
и программа сортировки матрицы в порядке возрастания
квадрата нормы строк (хранение по строкам).
8. Макроопределение для выполнения сложения c
использованием команд sub, sta, jz ( использование дpугих
команд запрещено! )
ADDLTD macro &a,&b,&res
...
mend
и программа умножения двух чисел, использующая это макроопределение,
разрешенные команды sub, sta, и jz и команды ввода-вывода.
9. Макроопределения для сравнения двух элементов массива
и для перестановки двух элементов массива
WORDCOMP macro &array1,&index1,&array2,&index2
...
mend
SWAP macro &array1,&index1,&array2,&index2
...
mend
и программу сортировки введенного массива.
10. Макроопредеоения для организации цикла
INITC macro &index
. . .
mend
NEXTC macro &index,&limit,&labal
. . .
mend
и макроопределение для извлечения элемента массива по идексу
GETV macro &array,&index
. . .
mend
и программу поиска и вывода элемента массива, максимального по
абсолютной величине.
11. Макроопредеоения перестановки массивов
COPY macro &dst,&src,&len
...
mend
и макроопределение отыскания максимума в массиве
MAXITEM macro &array,&length
. . .
mend
и программу сортировки введенной квадратной матрицы
( хранение по строкам ) по убыванию значений максимальных
элементов в строке
4. Вопpосы и задания для самопpовеки
1. Какие действия выполняются с использованием
следующих макроопределений ?
а) SWAP macro &a,&b б) EXCHANGE macro &a,&b
push sta *+2
lda &a jmp *+2
push nop
lda &b lda &a
sta &a sta *+2
pop jmp *+2
sta &b nop
pop lda &b
mend sta &a
lda *-7
sta &b
lda *-9
mend