close

Вход

Забыли?

вход по аккаунту

?

TrofTroyan

код для вставкиСкачать
Федеральное агенТство по образованию
Государственное образовательное учреждение
высшего профессионального образования
Санкт-Петербургский государственный университет
аэрокосмического приборостроения
СИСТЕМНОЕ ПРОГРАММИРОВАНИЕ
методические указания
к выполнению лабораторных работ
Санкт-Петербург
2009
Составители: кандидат технических наук, доцент А. Н. Трофимов; доцент Б. К. Трояновский
Рецензент кандидат технических наук, доцент кафедры
информационно-сетевых технологий Санкт-Петербургского государственного университета аэрокосмического приборостроения О. И. Красильникова
Пособие содержит методические указания по выполнению лабораторных работ по курсу «Системное программирование».
Приводятся методические указания по выполнению лабораторных работ по курсу «Системное программирование». Кратко
излагаются архитектура гипотетической ЭВМ, синтаксис языка
ассемблера и макроязыка. Содержатся примеры и варианты заданий для выполнения студентами лабораторных работ по курсу.
Методические указания предназначены для студентов специальности 090104 «Комплексная защита объектов информатизации», а также могут быть использованы студентами других специальностей и направлений.
Подготовлено кафедрой безопасности информационных систем и рекомендовано к изданию редакционно-издательским советом Санкт-Петербургского государственного университета аэрокосмического приборостроения.
Корректор Т. В. Звертановская
Верстальщик С. Б. Мацапура
Сдано в набор 09.02.09. Подписано к печати 19.03.09.
Формат 60×84 1/16. Бумага офсетная. Печ. л. 2,0.
Уч.-изд. л. 1,82. Тираж 100 экз. Заказ № 183
Редакционно-издательский центр ГУАП
190000, Санкт-Петербург, Б. Морская ул., 67
© ГУАП, 2009
ВВЕДЕНИЕ
Разработка содержит методические указания к циклу лабораторных работ по курсу «Системное программирование», выполняемых студентами специальности 090104. Целью курса является изучение принципов построения основных компонентов
общего программного обеспечения, таких как ассемблеры, загрузчики, компиляторы и др., и алгоритмов их работы. Основное
место среди них занимают алгоритмы обработки текста, поиска
в таблицах, синтаксического анализа. В цикле лабораторных
работ указанные алгоритмы изучаются студентами на примере разработки модели макроассемблера гипотетической ЭВМ.
В ходе выполнения работ предполагается самостоятельная работа студентов по разработке, программированию, тестированию и
отладке программных модулей. При выполнении работ студенты
используют знания и навыки, полученные при изучении курсов
«Информатика» и «Методы программирования и прикладные
алгоритмы».
Лабораторный цикл по курсу «Системное программирование»
состоит из трех лабораторных работ. Задания, выполняемые в
течение семестра, связаны между собой и в целом помогают получить законченное представление о структуре и алгоритмах работы трансляторов с языков низкого уровня.
ЛАБОРАТОРНАЯ РАБОТА №1
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ АССЕМБЛЕРА
Цель работы: изучение языка ассемблера гипотетической ЭВМ,
изучение методов разработки, программирования и отладки программ на языке ассемблера на примере гипотетической ЭВМ.
1. МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ПОДГОТОВКЕ
К ЛАБОРАТОРНОЙ РАБОТЕ
1.1 Структура гипотетической ЭВМ
В цикле лабораторных работ по курсу «ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ СИСТЕМ ОБРАБОТКИ ИНФОРМАЦИИ», а также
3
и в самом лекционном курсе в качестве основы для примеров иллюстраций будет использоваться некоторая вымышленная (гипотетическая) вычислительная машина, называемая в дальнейшем «простая ЭВМ» (рис. 1). Структура этой машины, несмотря
на предельную простоту, имеет много общего со структурой реально существующих ЭВМ. На примере этой простой ЭВМ удобно
изучать общие принципы построения основных компонент программного обеспечения настоящих ЭВМ, таких как ассемблеры,
загрузчики, макропроцессоры, компиляторы и др.
Работа простой ЭВМ моделируется на персональной ЭВМ с помощью специально разработанного программного интерпретатора.
Простая ЭВМ представляет собой шестнадцатеричную, одноадресную ЭВМ с одним сумматором А (аккумулятором) и двумя
дополнительными регистрами общего назначения X и Y. Гипотетическая ЭВМ содержит также программный счетчик PC, указатель стека SP, регистр флагов FLAGS и оперативную память
RAM (Random Access Memory).
Регистры общего назначения A, X, Y состоят из одного знакового и четырех числовых разрядов, каждый из которых может
содержать одну шестнадцатеричную цифру.
3".
§ ¬
ƹÃ
ɹÀÉؽ¹
* /0 65
:
1$
¸° ¸° "
9
41
¸° cc
cc
cc
cc
¸° ' ' '
' - " (4
;$ 4 &
"9:sɾ¼ÁÊËÉÔǺҾ¼ÇƹÀƹоÆÁØ
'-"(4sɾ¼ÁÊËÉÍĹ¼Ç»
1$sÈÉǼɹÅÅÆÔÂÊоËÐÁÃ
41sÌùÀ¹Ë¾ÄÕÊ˾ù
3".sÇȾɹËÁ»Æ¹ØȹÅØËÕ¼ÁÈÇ˾ËÁоÊÃǶ›¥
Рис. 1. Структура гипотетической ЭВМ
4
Программный счетчик PC состоит из трех числовых разрядов
и хранит адрес текущей команды.
Указатель стека SP состоит из трех числовых разрядов, содержит адрес верхушки стека (ячейки памяти, с которой будет
выполняться следующая стековая операция). Указатель стека
может программно изменяться, путем записи из трех младших
числовых разрядов аккумулятора.
Регистр флагов состоит из четырех числовых разрядов, содержащих флаги, характеризующие результат выполнения последней операции в сумматоре. Флаги используются при выполнении
команд условного перехода.
Имеются флаги:
z – равен ‘1’, если нулевой результат;
c – равен ‘1’, если произошло переполнение;
s – равен ‘1’, если отрицательный результат;
e – равен ‘1’, если четный результат.
Оперативная память содержит 4096 ячеек с адресами от 000
до FFF. В каждом слове памяти могут храниться четыре шестнадцатеричные цифры и знак, представляющие собой команду
или число.
Гипотетическая ЭВМ имеет в своем составе одно устройство
ввода (in) и одно устройство вывода (out).
Формат команд простой ЭВМ следующий:
Каждая команда занимает одно слово оперативной памяти и
имеет формат
+СААА
или
–СААА,
где:
+С/–С – код операции (КОП). Адресные команды имеют КОП
> –7;
ААА – представляет собой адрес (для адресных команд) или
расширение кода операции (для безадресных команд).
Все числовые комбинации вида +С/–С (для адресных команд)
или вида +СААА/–СААА (для безадресных команд), не представлявшие собой код команды (см. таблицу команд), являются
запрещенными в качестве команд. Поступление запрещенной
кодовой комбинации в качестве команды приводит к особой
’Ошибке Выборки Команды’ во время выполнения программы
и к останову работы гипотетической ЭВМ.
5
Гипотетическая ЭВМ может выполнять 46 команд, каждая
из которых имеет мнемоническое обозначение. Мнемонические
обозначения команд имеют длину от двух до четырех символов.
Все команды гипотетической ЭВМ приведены в табл. 1, где:
A – аккумулятор (сумматор);
X – регистр X;
Y – регистр Y;
PC – программный счетчик;
SP – указатель стека;
<adr> – содержимое ячейки памяти по адресу <adr>;
[Reg] – содержимое ячейки памяти по адресу, хранящемуся
в регистре Reg.
Таблица 1
Команды гипотетической ЭВМ
6
№
Мнем.
обозн.
КОП
Расш.
КОП
Описание команды
1
ADD
0x5
0x0
A = A+<adr> (сложение с памятью)
2
ADX
–0xA
0xА
A = A+X (сложение с рег. X)
3
CALL
–0x3
0x0
Переход на подпр. по адресу <adr>
4
DEC
–0xA
0x3
A = A–1 (вычитание с памятью)
5
DIV
0x8
0x0
A = A/<adr> (деление с памятью)
6
DVX
–0xA
0xD
A = A/X (деление с рег. X)
7
IN
–0xC
0x1
Y = <port> (ввод с устр. ввода)
8
INC
–0xA
0x2
A = A+1 (инкремент рег. A)
9
JC
0xC
0x0
IF flag C PC = adr
10
JE
–0x1
0x0
E PC = adr
11
JS
0xE
0x0
S PC = adr
Z PC = adr
12
JZ
0xA
0x0
13
JMP
0x9
0x0
14
JNC
0xD
0x0
15
JNE
–0x2
0x0
ü
ï
ï
ï
ï
ï
ï
ï
условные
ï
ï
ý
ï
ï
переходы
ï
ï
ï
ï
ï
ï
ï
ï
þ
PC = adr > (безусл. переход)
IF NOT (flag C) PC = adr
E PC = adr
ü
ï
ï
ï
ï
ï
ï
ï
ï
ï
ý
ï
ï
ï
ï
ï
ï
ï
ï
ï
ï
þ
условные
16
JNS
0xF
0x0
S PC = adr
17
JNZ
0xB
0x0
Z PC = adr
18
LDA
0x1
0x0
A = <adr> (загрузка рег. A из памяти)
19
LDX
0x2
0x0
X = <adr> (загрузка рег. X из памяти)
переходы
Окончание табл. 1
№
Мнем.
обозн.
КОП
Расш.
КОП
Описание команды
20
LDY
–0x4
0x0
Y = <adr> (загрузка рег. Y из памяти)
21
LDAX –0xD
0x1
A = [X] (косв. загр. рг. A через рг. X)
22
LOOP
–0x6
0x0
X = X–1 (if(X>0){ PC = adr } (цикл))
23
MAX
–0xB
0x3
A = X (пересылка рг. X в рг. A)
24
MAY
–0xB
0x5
A = Y (пересылка рг. Y в рг. A)
25
MLX
–0xA
0xC
A = A*X (умножение с рег. X)
26
MUL
0x7
0x0
A = A*<adr> (умножение с памятью)
27
MXA
–0xB
0x4
X = A (пересылка рг. A в рг. X)
28
MXY
–0xB
0x7
X = Y (пересылка рг. Y в рг. X)
29
MYA
–0xB
0x6
Y = A (пересылка рг. A в рг. Y)
30
MYX
–0xB
0x8
Y = X (пересылка рг. X в рг. Y)
31
MASP –0xB
0x9
A = SP (пересылка рг. SP в рг. A)
32
MSPA –0xB
0xA
SP = A (пересылка рг. A в рг. SP)
33
NEG
–0xA
0x8
A = A*–1 (изменение знака)
34
NOP
0x0
0x0
Нет операции
35
OUT
–0xC
0x2
port> = Y (запись в порт содерж. Y)
POP
–0xB
0x2
A = [SP], SP = SP–1 (взять со стека)
PUSH –0xB
0x1
[SP] = A, SP = SP+1 (положить на стек)
36
37
38
RET
–0xC
0x4
Возврат из подпрограммы
39
SBX
–0xA
0xB
A = A–X (вычитьнание с рг. Х)
40
STA
0x3
0x0
<adr> = A (выгрузка рг. A в память)
41
STX
0x4
0x0
<adr> = X (выгрузка рг. Х в память)
42
STY
0x5
0x0
<adr> = Y (выгрузка рг. Y в память)
43
STAX
–0xD
0x2
[X] = A (косв. выгр. рг. A в память)
44
STOP
–0xC
0x3
Остановка ЭВМ
45
SUB
0x6
0x0
A = A–<adr> (вычитание)
46
ZERO
–0xA
0x1
A = 0 (обнуление рг. A)
1.2 Язык ассемблера простой ЭВМ
При программировании непосредственно на машинном языке, или в машинных кодах, необходимо явно указывать коды команд и адреса операндов. Программирование в кодах оказывает7
ся неудобным, малопроизводительным, делает тексты программ
трудными для человеческого восприятия и очень затрудняет изменение программы во время отладки. При программировании
на языке ассемблера также приходится в явном виде записывать
все команды и данные, но в отличие от программирования на
машинном языке имеется возможность комментировать программы и использовать символическую запись кодов операций
и адресов памяти.
АССЕМБЛЕРОМ называется программа, которая выполняет
перевод программы, написанной на языке ассемблера, на машинный язык. Программа, написанная на языке ассемблера,
называется исходной, а ее эквивалент на машинном языке – объектной. Ассемблер, таким образом, выполняет преобразование
исходной программы в объектную. Такое преобразование называется трансляцией или ассемблированием.
Формат записи предложений на языке ассемблера и правила
этого языка в значительной степени определяются системой команд и структурой ЭВМ, для которой этот язык разработан. Вместе с тем, языки ассемблера различных ЭВМ, в том числе и язык
ассемблера простой ЭВМ, имеют много общего.
Язык ассемблера простой ЭВМ несложен и построен в соответствии с правилами, типичными для многих настоящих языков
ассемблера.
Основные правила языка ассемблера гипотетической ЭВМ
1. Каждое предложение языка ассемблера занимает одну
строку.
2. Если в первой позиции стоит символ ’*’, то эта строка является комментарием. В строке комментария допускаются любые символы.
3. Операторы языка ассемблера состоят из четырех полей и
имеют следующий формат:
МЕТКА КОД_ОПЕРАЦИИ ОПЕРАНД; КОММЕНТАРИЙ
Поля отделяются друг от друга одним или несколькими пробелами, а внутри полей пробелы не допускаются. Поля метки,
операнда и комментария могут быть пустыми.
Метка должна начинаться с первой позиции строки, а если
в первой позиции стоит пробел, то полагается, что метка отсутствует и следующие за пробелом символы образуют код операции
8
(КОП). В качестве метки может использоваться любая последовательность букв, цифр и символа ’_’ (подчеркивание), длиной
не более восьми символов. Метка не может начинаться с шестнадцатеричной цифры (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, С, D, E, F).
Все метки, использованные в программе, должны быть различными.
В качестве кода операции могут использоваться мнемонические коды команд (приведенные в табл. 1) и псевдокоманды ассемблера (BSS, CON, END, EQU, ORG).
Операндом может быть конструкция одного из перечисленных типов:
1. ‘*’
2. ‘КОНСТАНТА БЕЗ ЗНАКА’
3. ‘ = КОНСТАНТА’
4. ‘ИМЯ’
5. ‘* + КОНСТАНТА БЕЗ ЗНАКА’ или ‘* – КОНСТАНТА
БЕЗ ЗНАКА’
6. ‘* + ИМЯ ‘ или ‘* – ИМЯ’
7. ‘ИМЯ+КОНСТАНТА БЕЗ ЗНАКА’ или ‘ИМЯ КОНСТАНТА БЕЗ ЗНАКА’
8. ‘ИМЯ + ИМЯ’ ‘ИМЯ – ИМЯ’
9. ‘КОНСТАНТА’
где:
• ‘ИМЯ’ – последовательность букв, цифр и символов ‘_’,
совпадающая с одной из меток программы;
• ‘КОНСТАНТА БЕЗ ЗНАКА’ – последовательность шестнадцатеричных цифр, длина которой не превышает трех;
• ‘КОНСТАНТА’ – константа без знака, длиной не более четырех шестнадцатеричных цифр, которой может предшествовать знак;
• ‘*’ – означает адрес команды, в поле операнда которой она
написана;
• ‘ = КОНСТАНТА’ – ‘ Самоопределенная константа’ (или
‘Литерал’).
Литерал позволяет указывать константу непосредственно в
поле операнда команды. При трансляции команд, содержащих
литералы, ассемблер автоматически создает строки, в которые
помещает литералы, а в команды, ссылающиеся на литералы,
проставляет соответствующие адреса. Литералы могут использоваться только в командах: ADD, SUB, MUL, DIV, LDA, LDX,
LDY, OUT.
9
Псевдокоманды указывают ассемблеру, каким образом разместить программу в памяти, где поместить данные, с какого адреса
начать выполнение программы. В языке ассемблера простой ЭВМ
предусмотрено 5 псевдокоманд: BSS, CON, END, EQU, ORG.
Имена, на которые ссылаются в псевдокомандах, должны
быть определены до использования.
Операнд псевдокоманды ORG задает адрес, по которому должна быть размещена следующая команда. Если псевдокоманда
ORG в программе отсутствует (что допустимо, но нежелательно),
то ассемблер размещает команды и данные с нулевого адреса.
Псевдокоманда EQU объявляет эквивалентными значения
метки и выражения, стоящего в поле операнда. Данное выражение должно представлять собой адрес, то есть лежать в интервале
[000,FFF].
Псевдокоманда CON служит для описания числовой или
адресной константы. Ее операндом может быть константа или
адресное выражение.
Псевдокоманда BSS резервирует область для данных (например, с ее помощью можно определить стек программы). Ее операнд определяет количество слов, резервируемых ассемблером
для последующего хранения данных. Операндом псевдокоманды
BSS может быть только константа без знака.
Псевдокоманда END указывает на конец программы. Ее операнд определяет стартовый адрес (адрес, с которого начнется выполнение программы). По умолчанию, он берется равным адресу размещения программы. Псевдокоманда END обязательно
должна присутствовать в тексте программы, иначе ее отсутствие
приведет к ошибке трансляции.
Пример:
ORG 10
* ПРОГРАММА
START IN
STY _A
IN
STY _B
LDA _A
ADD _B
STA _C
MYA
OUT
10
РАЗМЕЩАЕТСЯ С АДРЕСА 10
;ВВОД ЧИСЛА
;ЗАПИСЬ В ЯЧЕЙКУ А
;ВВОД ЧИСЛА
;ЗАПИСЬ В ЯЧЕЙКУ В
;С = А + В
;ВЫВОД РЕЗУЛЬТАТА
STOP
_A BSS 1
_B BSS 1
_C BSS 1
END START
1.3 Порядок выполнения работы
1. После собеседования получить вариант задания.
2. Разработать комментированную программу, выполняющую поставленную задачу, а также контрольный пример к ней.
Язык программирования – язык ассемблера простой ЭВМ.
3. Провести тестирование и отладку разработанной программы.
4. Получить листинг отлаженной программы и результаты
выполнения контрольного примера.
5. Составить отчет по работе.
Отчет должен содержать:
a. развернутую постановку задачи;
b. включая необходимое математическое обоснование;
c. листинг трансляции исходной программы;
d. результаты выполнения контрольного примера.
1.4 Варианты заданий
1. Вычисление наибольшего общего делителя двух введенных
чисел.
2. Сортировка введенного массива.
3. Найти пересечение двух множеств чисел, представленных
двумя введенными массивами.
4. Найти объединение двух множеств чисел, представленных
двумя введенными массивами.
5. Вычисление числа элементов массива, делящихся нацело
на заданное число. Длина массива, массив и делитель вводятся.
6. Вычисление скалярного произведения двух N-мерных векторов. Длина N и векторы (массивы) вводятся.
7. Поменять местами элементы двух массивов, если элемент
первого массива больше соответствующего элемента второго массива. Массивы и их длина вводятся.
8. Вычисление произведения двух многочленов. Степени многочленов и их коэффициенты вводятся.
9. Вычисление значения полинома. Коэффициенты полинома
и значение аргумента вводятся.
10. Двоичный поиск в упорядоченном массиве. Массив и число вводятся. Результат – номер найденного элемента массива.
11
11. Подсчет числа элементов массива, находящихся в заданных границах. Длина массива, массив и границы вводятся.
12. Программа работы с простыми дробями (сложение, вычитание, умножение, деление).
13. Вычисление квадрата расстояния между двумя точками в
N-мерном пространстве. Размерность пространства и координаты вводятся.
14. Подсчет числа элементов массива, модуль которых превосходит заданное число. Длина массива, массив и число вводятся.
15. Перестановка элементов введенного массива в обратном
порядке.
1.5 Вопросы и упражнения
1. Укажите, какие из приведенных строк ассемблера гипотетической ЭВМ являются ошибочными:
А lda *
a1a sta xyz
16 goto 25
lda G(11)
.A equ *+3
1f lda 13.
2. Что означают команды jmp *–10, jmp *, jmp 10?
3. В чем разница между командами add = 25 и add 25?
4. Почему использование литералов в командах sta, stx, jmp
некорректно?
ЛАБОРАТОРНАЯ РАБОТА № 2
ПРОЕКТИРОВАНИЕ МОДУЛЯ АССЕМБЛЕРА
Цель работы: изучение структуры ассемблера и алгоритма
трансляции с языка программирования низкого уровня (языка
ассемблера); разработка, программирование и отладка программного модуля, выполняющего одну из задач ассемблирования.
1. МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ПОДГОТОВКЕ
К ЛАБОРАТОРНОЙ РАБОТЕ
2.1 Общие сведения
Ассемблером называется программа, которая обрабатывает
текст программы, написанной на языке ассемблера, и созда12
ет эквивалентную ей программу на машинном языке. Кроме
того, ассемблер формирует листинг, содержащий текст исходной программы, адреса, коды команд, и констант, сообщения
об ошибках и некоторые другие данные. Кроме программы на
машинном языке и листинга большинство реально существующих ассемблеров создают необходимую информацию для загрузчика. В настоящей лабораторной работе основное внимание
уделено процессу преобразования текста программы в последовательность машинных кодов. Однако следует помнить, что во
всех схемах ассемблирования, за исключением самых простых,
ассемблер должен формировать необходимые данные для загрузчика.
Если ассемблер выполняется не на той машине, для которой
написана транслируемая программа, то такой ассемблер называется кросс-ассемблером. Кросс-ассемблеры широко применяются, например, для разработки программного обеспечения
микропроцессорных систем. В этом случае кросс-ассемблер выполняется на персональной или малой ЭВМ, называемой инструментальной машиной, а система, на которой впоследствии будет
выполняться транслируемая программа, называется целевой
или объектной машиной. Аналогичный подход используется и в
том случае, когда разработка программного обеспечения ведется
для вновь проектируемой ЭВМ параллельно с разработкой аппаратной части.
Содержанием настоящей работы является разработка подпрограмм, работающих в составе кросс-ассемблера простой ЭВМ.
Инструментальной машиной в данном случае служит персональная ЭВМ, а целевой – гипотетическая ЭВМ.
2.2 Структуры данных ассемблера и алгоритм его работы
Трансляция программ с языка ассемблера в последовательность машинных кодов выполняется в общем случае за два просмотра исходного текста. Цель первого просмотра состоит в определении значений меток и адресов литералов. На втором просмотре формируется последовательность команд и констант в виде
машинных кодов.
Во время первого просмотра выполняются:
a. проверка правильности записи операторов языка;
b. определение значений меток;
c. обработка некоторых псевдокоманд;
d. запоминание литералов.
13
Для работы ассемблера на первом просмотре необходимы:
a. текст исходной программы;
b. счетчик адреса (LC);
c. таблица машинных команд (MOT);
d. таблица псевдокоманд (POT);
e. таблица символов, или меток (ST);
f. таблица литералов (LT).
Все перечисленные структуры данных, кроме исходной программы, являются внутренними переменными и таблицами ассемблера. Таблица машинных команд и таблица псевдокоманд
являются постоянными таблицами ассемблера; их содержимое
не изменяется во время обработки исходной программы. Таблицы меток и литералов – это таблицы, содержимое которых изменяется во время трансляции программы.
Перечисленные таблицы имеют следующий формат:
Таблица машинных команд (MOT)
Мнемоника
Код
…..
Таблица псевдокоманд (POT)
Мнемоника
Тип
ORG
CON
BSS
END
EQU
1
2
3
4
5
Таблица (символов) меток (ST)
Метка
Адрес
…..
Таблица литералов (LT)
Литерал
…..
14
Адрес
Во время первого просмотра заполняются таблицы меток и литералов. Они в дальнейшем будут использованы на втором просмотре исходного текста. Укрупненная схема алгоритма первого
просмотра ассемблера показана на рис. 2.
¦¹Ð¹ÄÇ
§ºÇÀƹоÆÁØ
-$ -$sÀƹоÆÁ¾ÊоËÐÁùÃÇŹƽ
-sÈÉÁɹҾÆÁ¾ÊоËÐÁù¹½É¾Ê¹
7"-sÀƹоÆÁ¾ÇȾɹƽ¹
£§¨sÃǽÇȾɹÏÁÁ
105s˹ºÄÁϹÈʾ»½ÇÇȾɹÏÁÂ
.05s˹ºÄÁϹŹÑÁÆÆÔÎÇȾɹÏÁÂ
-
°Á˹ËÕ
ÊËÉÇÃÌ
›Ô½¾ÄÁËÕ
žËÃÌ
£§¨
ÇȾɹƽ
¨ÇÁÊÃ
£§¨ÈÇ
˹ºÄÁϾ
©§«
ƹ½¾Æ
$0/
›ÔÐÁÊÄÁËÕ
ÀƹоÆÁ¾
ÇȾɹƽ¹
¨ÇÁÊÃ
£§¨
¥§«
- ¥¾Ëù
¾ÊËÕ
¤Á˾ɹÄ
¾ÊËÕ
#44
- 7"-
&26
›ÔÐÁÊÄÁËÕ
ÀƹоÆÁ¾
ÇȾɹƽ¹
03(
&/%
›ÔÐÁÊÄÁËÕ
ÀƹоÆÁ¾
ÇȾɹƽ¹
-$ 7"-
½¹
¹Æ¾ÊËÁ
žËÃÌ»
45
¹Æ¾ÊËÁ
¹½É¾Ê¹»
-5
½¹
¹Æ¾ÊËÁ
ÄÁ˾ɹÄ
»-5
£Ç»ËÇÉÇÅÌ
ÈÉÇÎǽÌ
¹Êʾźľɹ
-$-$-
Рис. 2. Укрупненный алгоритм первого прохода ассемблера
15
В результате первого просмотра исходного текста становятся
известными значения меток и адресов литералов, использованных в программе. Значения меток и адреса литералов во время
первого просмотра записываются в таблицу меток и таблицу литералов и сохраняются до второго просмотра. Цель второго просмотра текста программы состоит в создании программы на машинном языке, то есть в генерации последовательности машинных
кодов. Коды команд и константы записываются в определенной
форме для последующей обработки загрузчиком. Кроме того, на
втором просмотре формируется листинг, содержащий текст исходной программы, эквивалентные ему машинные коды, а также некоторые другие данные, например, перечень всех меток и
соответствующих им адресов. Листинг также содержит сообщения об обнаруженных ошибках.
Для работы ассемблера на втором просмотре требуются:
a. текст исходной программы;
b. счетчик адреса (LC);
c. таблица машинных команд (MOT);
d. таблица псевдокоманд (POT);
e. таблица символов, или меток (ST), заполненная во время
первого просмотра;
f. таблица литералов (LT), заполненная во время первого просмотра.
В процессе второго просмотра текста программы ассемблер
формирует:
a. строки объектной программы;
b. строки листинга.
Объектная программа и листинг обычно выводятся в соответствующие файлы. Кроме того, листинг может выводиться и на
экран. Укрупненная схема алгоритма второго просмотра ассемблера показана на рис. 3.
При выполнении этой лабораторной работы могут оказаться
полезными следующие функции стандартной библиотеки языка
С:
a. Обработка строк (прототипы описаны в файле string.h)
strcat, strncat (сцепление строк); strcmp, strncmp (сравнение
строк); strcpy, strncpy (копирование строк) и другие.
b. Проверка символов (прототипы описаны в файле ctype.h)
isalpha, isdigit, isxdigit, isupper, islower, isspace, isascii и другие.
16
¦¹Ð¹ÄÇ
§ºÇÀƹоÆÁØ
-$
-$sÀƹоÆÁ¾ÊоËÐÁùÃÇŹƽ
-sÈÉÁɹҾÆÁ¾ÊоËÐÁù¹½É¾Ê¹
7"-sÀƹоÆÁ¾ÇȾɹƽ¹
£§¨sÃǽÇȾɹÏÁÁ
105s˹ºÄÁϹÈʾ»½ÇÇȾɹÏÁÂ
.05s˹ºÄÁϹŹÑÁÆÆÔÎÇȾɹÏÁÂ
-
°Á˹ËÕ
ÊËÉÇÃÌ
›Ô½¾ÄÁËÕ
žËÃÌ
£§¨
ÇȾɹƽ
¨ÇÁÊÃ
£§¨ÈÇ
˹ºÄÁϾ
©§«
¨ÇÁÊÃ
£§¨
¥§«
ƹ½¾Æ
$0/
&26
#44
›ÔÐÁÊÄÁËÕ
ÀƹоÆÁ¾
ÇȾɹƽ¹
›ÔÐÁÊÄÁËÕ
ÀƹоÆÁ¾
ÇȾɹƽ¹ ªÍÇÉÅÁÉÇ»¹ËÕ
ÃÇÆÊ˹ÆËÌ
ªÇºÉ¹ËÕ
ÃÇŹƽÌÁÀ
£§¨Á7"-
-
›Ô»Ç½
ÃÇŹƽԻ
§ºÅǽÌÄÕ
03(
&/%
›ÔÐÁÊÄÁËÕ
ÀƹоÆÁ¾
ÇȾɹƽ¹
-$ 7"›Ô»Ç½
ÃÇŹƽԻ
§º
ÅǽÌÄÕ
- 7"£ÇƾÏ
-$ -$-
Рис. 3. Укрупненный алгоритм второго прохода ассемблера
17
Подробное описание этих и других библиотечных функций,
их параметров и возвращаемых значений можно найти в любом
руководстве по программированию на языке С или с помощью
контекстно-зависимой подсказки в интегрированной системе
программирования на языке С.
2. Порядок выполнения работы
1. После собеседования получить вариант задания.
2. Ознакомиться с текстом файлов easm.c и easm.h.
3. В соответствии с заданными спецификациями разработать
функцию на языке С. Разработать программу, вызывающую разработанную функцию и проверяющую ее работоспособность на
контрольных примерах.
4. Провести тестирование и отладку разработанной функции.
5. Построить вариант ассемблера простой ЭВМ, в котором используется разработанная функция. Для этого нужно:
a. Создать проект в среде VC 6.0 или VC 5.0 типа Win32 Console
Application.
b. Включить в проект исходный файл easm.c, который содержит текст функции main() и все глобальные переменные и таблицы; включить в проект файл с текстом разработанной вами
функции; включить в проект файл, содержащий библиотеку
объектных модулей нужных для построения ассемблера простой
ЭВМ – asmlib.lib.
c. В опциях Linker поставить галочку Force file output.
d. Построить программу в соответствии с проектом; имя построенной программы будет совпадать с именем проекта с расширением «.exe».
6. Проверить работу построенного ассемблера. В качестве тестового примера использовать программу на языке ассемблера
простой ЭВМ, разработанную при выполнении лабораторной работы № 1.
7. Составить отчет по pаботе. Отчет должен содержать:
a. Развернутую постановку задачи с описанием входных и выходных данных.
b. Схему алгоритмов первого и второго просмотра ассемблера
с указанием места, в котором выполняется разработанная функция.
c. Текст разработанных функций.
d. Результат выполнения контрольного примера.
18
3. ВАРИАНТЫ ЗАДАНИЙ
1. Разработать функцию вычисления значения операнда long
Calculate_Val(char * Str_Val, int LC, int V_Type). Интерфейс
функции и структуры данных описаны в файле «EASM.H».
2. Разработать функцию paзбора строки на метку, код операции, операнд и комментарий void String_Decomposition (char
*String, LPDECOMPOSEDSTRING DecStr). Интерфейс функции и структуры данных описаны в файле «EASM.H».
3. Paзработать функцию поиска кода операции в таблице машинных операций. Реализовать алгоритм двоичного поиска в
упорядоченной таблице long Find_MOT(char *key). Интерфейс
функции и структуры данных описаны в файле «EASM.H».
4. Разработать функцию, реализующую первый проход ассемблера int asm1(FILE *InputFile, FILE *ListFile). Интерфейс
функции и структуры данных описаны в файле «EASM.H».
5. Разработать функцию, реализующую первый проход
ассемблера int asm2(FILE *InputFile, FILE *ListFile, FILE
*OutputFile). Интерфейс функции и структуры данных описаны
в файле «EASM.H».
6. Разработать функции обработки таблицы символов LPVOID
ST_Init (int ST_Size);int ST_Append (char *Label, int Adr)long
Find_ST(char *Labe), реализующие упорядоченную таблицу
символов. Интерфейс функций и структуры данных описаны в
файле «EASM.H».
7. Разработать функцию определения типа операнда int Val_
Type (char *Str_Val). Интерфейс функции и структуры данных
описаны в файле «EASM.H».
8. Разработать функции обработки таблицы символов LPVOID
ST_Init (int ST_Size); int ST_Append(char *Label, int Adr)long
Find_ST(char *Label), реализующие хэш-таблицу символов с
линейным рехешированием. Интерфейс функций и структуры
данных описаны в файле «EASM.H».
9. Разработать функции обработки таблицы символов LPVOID
ST_Init (int ST_Size); int ST_Append(char *Label, int Adr)long
Find_ST(char *Label), реализующие хэш-таблицу символов со
случайным рехешированием. Интерфейс функций и структуры
данных описаны в файле «EASM.H».
10. Разработать функции обработки таблицы символов
LPVOID ST_Init (int ST_Size); int ST_Append(char *Label, int
Adr) long Find_ST(char *Label), реализующие хэш-таблицу
19
символов с рехешированием сложением. Интерфейс функций и
структуры данных описаны в файле «EASM.H».
11. Разработать функции обработки таблицы символов
LPVOID ST_Init (int ST_Size); int ST_Append(char *Label, int
Adr)long Find_ST(char *Label), реализующие таблицу символов
в виде бинарного дерева. Интерфейс функций и структуры данных описаны в файле «EASM.H».
12. Разработать функции обработки таблицы символов
LPVOID ST_Init (int ST_Size); int ST_Append(char *Label, int
Adr)long Find_ST(char *Label), реализующие таблицу символов
в виде двоичного сбалансированного дерева. Интерфейс функций
и структуры данных описаны в файле «EASM.H.»
4. Вопросы для самопроверки
1. Какие особенности языка ассемблера приводят к необходимости построения двухпросмотрового ассемблера?
2. Почему при трансляции программы, написанной на языке
ассемблера, достаточно двух просмотров исходного текста программы?
3. Каким ограничениям должен удовлетворять текст программы, чтобы его можно было транслировать за один просмотр
текста?
4. Почему адреса литералов становятся известными только к
началу второго просмотра?
5. Чем ограничена длина таблицы символов (меток)?
ЛАБОРАТОРНАЯ РАБОТА № 3
ПРОГРАММИРОВАНИЕ НА МАКРОЯЗЫКЕ
Цель работы: изучение макроязыка и макропроцессора (макрогенератора), изучение методов разработки, программирования
и отладки программ на макроязыке на примере гипотетической
ЭВМ.
1. МЕТОДИЧЕСКИЕ УКАЗАНИЯ ПО ПОДГОТОВКЕ
К ЛАБОРАТОРНОЙ РАБОТЕ
Макроязык представляет собой расширение языка программирования. Наиболее часто, хотя и не всегда, расширяемым языком программирования является язык ассемблера. В ряде язы20
ков программирования высокого уровня, например в C, также
имеются средства макропрограммирования.
В настоящей работе рассматривается макроязык, представляющий собой расширение языка ассемблера простой ЭВМ.
Определим основные термины и понятия, относящиеся к макроязыку и макрообработке.
Макроопределение – представляет собой набор строк расширяемого языка (языка ассемблера) с присвоенным именем. Макроопределение может иметь формальные параметры.
Макрокоманды, называемые также макро, являются однострочными сокращениями для группы команд. Макрокоманда
представляет собой использование макроопределения. Макрокоманда может иметь фактические параметры.
Макрорасширение – результат подстановки макроопределения вместо макрокоманды; при этой подстановке формальные
параметры заменяются на фактические. Процесс порождения
макрорасширений называется макрогенерацией. В результате
макрогенерации формируется текст на языке ассемблера.
Программа, выполняющая макрогенерацию, называется макропроцессором или макрогенератором. Исходными данными для
макрогенератора является текст, программы на макроязыке, результатом – текст, программы на языке ассемблера.
Макроопределения записываются в соответствии с некоторыми формальными правилами. В рассматриваемом случае формат
макроопределения имеет следующий вид:
ИМЯ macro СПИСОК ПАРАМЕТРОВ
Тело
макроопределения
mend
Имя макроопределения записывается в поле метки, имеет длину не более восьми символов и может содержать буквы, цифры
и символ подчеркивания (_). После того как макроопределение
определено в тексте программы, его имя может использоваться в
поле кода операции как макрокоманда.
В списке параметров перечисляются формальные параметры
макроопределения, которые при макровызовах будут заменять21
ся фактическими параметрами. Каждый формальный параметр
начинается со специального символа (&), который служит только для идентификации формальных параметров.
Список параметров имеет вид
&par1,&par2,...,&parN,
где N< = 15, пробелы между параметрами не допускаются. Имена формальных параметров должны начинаться с символа ‘&’
и должны иметь длину не более восьми символов. В теле макроопределения формальные параметры могут фигурировать в поле
метки, кода операции или аргумента. В качестве фактических
параметров разрешается использовать выражения, представляющие собой метку, код операции или операнд.
Макроопределение обязательно должно заканчиваться словом ’mend’ в поле кода операции.
3.1. Пpимеpы использования макроязыка.
Обсуждение
Рассмотрим несколько простых примеров.
Пример 1. (Макроопределение для вычисления суммы двух
слагаемых.)
PLUS macro &result, &arg1, &arg2
lda &arg1; поместить первое слагаемое в А
add &arg2; прибавить второе слагаемое
sta &result; сохранить результат
mend
Пример 2. (Фрагмент программы на макроязыке, использующей макроопределение 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
22
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
23
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
Как видно из рассмотренных примеров, макроязык позволяет вводить новые операции, которые отсутствуют в исходном
языке ассемблера. Макроопределения имеют определенное
сходство с подпрограммами, но в то же время существенно отличаются от них. Сходство состоит в том, что с использованием
и макрокоманд и подпрограмм можно «расширить» исходный
язык, написав соответствующие подпрограммы или макроопределения для определения новых операций. Различие заключается в использовании подпрограмм и макрокоманд. При
использовании подпрограммы ее вызов состоит в переходе на
первую команду этой подпрограммы и выполняется во время выполнения программы. Код подпрограммы существует в
одном экземпляре. При использовании макрокоманд происходит их замена на текст соответствующих макроопределений.
Эта замена выполняется во время макрогенерации, т. е. до выполнения самой программы. При этом если одна макрокоманда
была использована несколько раз, то происходит размножение
текста соответствующего ей макроопределения. При использовании подпрограмм достигается экономия памяти за счет того
что код подпрограммы не повторяется при каждом обращении
к ней. При использовании макрокоманд экономится время выполнения за счет исключения дополнительных команд, связанных с передачей параметров подпрограмме и перехода на нее.
Обычно использование макрокоманд на практике оказывается
оправданным в случаях, когда требуется ускорить критический
участок программы за счет тщательно написанных небольших
макроопределений.
24
2. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ
1. После вступительного коллоквиума получить задание.
2. Разработать алгоритм решения задачи.
3. Написать макроопределения и тщательно отладить их.
4. Написать программу, использующую макроопределения, и
отладить ее.
5. Составить отчет по работе. Отчет должен содержать:
a. Развернутую постановку задачи, включая необходимое математическое обоснование.
b. Исходный текст программы на макроязыке.
c. Листинг трансляции исходной программы.
d. Результаты выполнения контрольного примера.
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
...
25
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,
&ImRe
...
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
26
и программа вычисления выражения (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 (использование других команд запрещено!)
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
27
...
mend
и программа поиска и вывода элемента массива, максимального по абсолютной величине.
11. Макроопределения перестановки массивов
COPY macro &dst, &src, &len
...
mend
и макроопределение отыскания максимума в массиве
MAXITEM macro &array, &length
...
mend
и программа сортировки введенной квадратной матрицы (хранение по строкам) по убыванию значений максимальных элементов в строке.
4. Вопросы и задания для самопроверки
1. Какие действия выполняются с использованием следующих макроопределений?
а) SWAP macro &a,&b
push
lda &a
push
lda &b
sta &a
pop
sta &b
pop
mend
б) EXCHANGE macro &a,&b
sta *+2
jmp *+2
nop
lda &a
sta *+2
jmp *+2
nop
lda &b
sta &a
lda *-7
28
sta &b
lda *-9
mend
2. Имеется два макроопределения, предназначенных для вычисления суммы трех слагаемых («а» и «б»). В чем разница между ними? В каких случаях предпочтительно использование каждого из них? К каким возможным ошибкам может приводить их
использование?
а) SUM3 macro &a, &b, &c, &result
lda &a
add &b
add &c
sta &result
mend
б) SUM3_1 macro &a, &b, &c, &result
push
lda &a
add &b
add &c
sta &result
pop
mend
3. Как будет выглядеть текст, построенный макрогенератором, при обработке этой программы на макроязыке? Какое значение будет иметь последний адрес этой программы после ассемблирования?
OPER macro &oper, &arg1, &arg2, &res
lda &arg1
&oper &arg2
sta &res
mend
*................
START equ 100
org START
U bss 1
V bss 1
X bss 10
*
F in
sty U
in
29
sty V
OPER add, U, V, V
OPER sub, U, = 30, U
OPER mul, U, = -2, X
end F
ЛИТЕРАТУРА
1. Донован Дж. Системное программирование: Пер. с англ.
Л. Д. Райкова; С. Н. Флоренцева / Под ред. и с предисл. Л. Д. Райкова. М.: Мир, 1975. 540 с.
2. Кэмпбэл-Келли М. Введение в макросы: Пер. с англ.
Д. А. Корягиной, И. Л. Любимской / Под ред. Э. З. Любимского.
М.: Сов. радио, 1978. 148 с.
3. Трой Д. Программирование на языке Си для персонального
компьютера IBM PC: Пер. с англ. Б. А. Кузьмина / Под ред. И. В.
Емелина. М.: Радио и связь, 1991.
30
Содержание
Введение......................................................................... 3
Лабораторная работа №1. Программирование на языке ассемблера.............................................................................. 3
1. Методические указания по подготовке к лабораторной
работе............................................................................. 3
1.1 Структура гипотетической эвм.................................... 3
1.2 Язык ассемблера простой эвм...................................... 7
1.3 Порядок выполнения работы........................................ 11
1.4 Варианты заданий....................................................... 11
1.5 Вопросы и упражнения................................................ 12
Лабораторная работа № 2. Проектирование модуля
ассемблера...................................................................... 12
1. Методические указания по подготовке к лабораторной
работе............................................................................. 12
2.1 Общие сведения.......................................................... 12
2.2 Структуры данных ассемблера и алгоритм его работы...... 13
2. Порядок выполнения работы.......................................... 18
3. Варианты заданий........................................................ 19
4. Вопросы для самопроверки............................................ 20
Лабораторная работа № 3. Программирование
на макроязыке................................................................. 20
1. Методические указания по подготовке к лабораторной
работе............................................................................. 20
3.1. Пpимеpы использования макроязыка. Обсуждение........ 22
2. Порядок выполнения работы.......................................... 25
3. Варианты заданий........................................................ 25
4. Вопросы и задания для самопроверки.............................. 28
Литература..................................................................... 30
31
Документ
Категория
Без категории
Просмотров
0
Размер файла
523 Кб
Теги
troftroyan
1/--страниц
Пожаловаться на содержимое документа