Автор работы: Пользователь скрыл имя, 20 Октября 2011 в 18:01, реферат
Основные общие особенности языка ассемблера (чаще не совсем точно называемого просто ассемблером; строго ассемблером называется программа, которая является транслятором. Эта программа переводит последовательность команд с языка ассемблера на язык машинных кодов процессора) микропроцессоров совпадают с особенностями всех языков подобного типа. Отметим их основные особенности
Программа не имеет
какого либо содержательного смысла и
носит чисто учебный характер для отражения
различных возможностей ее построения.
В программе используются объявленные
директивой extern символы x1,
Файл lib1.asm
* тексты макроопределений | |||
UMN3 | %macro | ||
MOV C,A | |||
RLC | |||
ADD C | |||
%endm | |||
T1 | %macro | p1,p2,p3,p4 | |
%local | s | ||
s | equ | p1 | |
MVI | A,p2+s | ||
MVI B,p3+s | |||
MVI C,p4+s | |||
%endm |
В начале программы обычно записываются команды инициализации процессора; они могут задавать различные режимы, а также в первую очередь они должны определять таблицу векторов прерываний, организацию стека и разрешение прерываний (если прерывания и стек используются в программе). Соответствующие команды можно писать прямо в тексте программы. Поскольку эти действия носят типовой характер и могут повторяться в других программах, они могут быть вынесены в отдельный файл и включены в основную программу директивой include. В приводимом примере команды инициализации процессора записаны в файле init.asm. Таблица векторов прерывания обычно занимает 64 ячейки, и основная программа начинается с 64 (40h). Для выполнения этого условия в приводимом файле с помощью директив ds пропускаются пустые ячейки.
Файл init.asm
JMP | INIT | ; таблица векторов прерывания | |
ds | 5 | ||
JMP | M1 | ||
ds | 53 | ||
INIT | LXI | SP,stack |
|
; запись в указатель символического адреса | |||
; вершины стека | |||
EI |
| ||
JMP | BEGIN |
|
Стек размещается
в основной памяти процессора. Его
обычно размещают в памяти после
основной программы. Так как заполнение
стека идет вниз (в сторону уменьшения
адресов), после конца программы
директивой ds резервируется 20 ячеек
для стека. Символический адрес вершины
стека stack будет соответствовать концу
зарезервированной области памяти.
Файл stack.asm
ds | 20 | ||
stack | ;вершина стека |
Трансляция программы
Трансляция производится программой - транслятором avmac85.exe. Формат команды вызова транслятора:
avmac85 <имя транслируемого файла> [xref] [sm] [si]
где <имя транслируемого файла> - обязательный элемент;
[xref] - необязательная опция, задающая формирование таблицы перекрестных ссылок на символы, используемые в программе, в таблице указываются номера строк, в которых используются символы;
[sm] - необязательная опция, которая определяет наличие в листинге трансляции макрорасширений, подставляемых вместо макровызовов;
[si] - необязательная опция, которая определяет наличие в листинге трансляции команд из файла, включаемого директивой include.
В результате трансляции формируется объектный файл с расширением obj, листинг трансляции - файл с раcширением prn, и файл с перекрестными ссылками (при использовании опции xref) - файл с расширением xrf. Имена всех этих файлов соответствуют имени транслируемого файла.
Сообщения об ошибках, обнаруженных при трансляции, выводятся на монитор и включаются в листинг. Некоторые ошибки не позволяют сформировать листинг трансляции.
Форма листинга
Ниже приведен текст листинга трансляции программы, рассмотренной в качестве примера в подразделе “Построение простой программы”. Листинг получен при трансляции с использованием опций si, sm.
В первой колонке листинга приводится:
Во второй колонке записывается код команды. Если в команде присутствует перемещаемый адрес (например, в команде перехода), то код сопровождается знаком ' (C3 0040'). Если в команду входит неопределенное значение символа, то код сопровождается знаком *.
1 | 2 | 3 | 4 | 5 | 6 номера колонок листинга |
1 | extern | x1,two | |||
2 | $SETLN(LIB1.ASM) |
| |||
1 | * тексты макроопределений | ||||
2 | ;UMN3 | %macro | |||
3 | ; | MOV | C,A | ||
4 | ; | RLC | |||
5 | ; | ADD | C | ||
6 | ; | %endm | |||
7 | |||||
8 | ;T1 | %macro | p1,p2,p3,p4 | ||
9 | ; | %local | s | ||
10 | ;S | equ | P1 | ||
11 | ; | MVI | A,P2+S | ||
12 | ; | MVI | B,P3+S | ||
13 | ; | MVI | C,P4+S | ||
14 | ; | %endm | |||
15 | |||||
16 | |||||
17 | ;RESETLN | ||||
=0005 | 3 | z | equ | 5 | |
=…X | 4 | t | equ | Z+3 | |
=0007 | 5 | k | equ | +7 | |
=FFF9 | 6 | equ | -7 | ||
7 | include | init.asm | |||
0000' | C3 0040' | 1 | JMP I | NIT | |
0003' | (0005) | 2 | ds | 5 | |
0008' | C3 0054' | 3 | MP | M1 | |
000B' | (0035) | 4 | ds | 53 | |
0040' | 31 006F' | 5 | INIT | LXI | SP?Stack |
0043' | FB | 6 | EI | ||
0044' | C3 0047' | 7 | JMP | BEGIN | |
0047' | 3E 00* | 8 | Begin | MVI | A,x1 |
9 | ;UMN3 | ||||
0049' | 4F | 9 | MOV | C,A | |
004A' | 07 | 9 | RLC | ||
004B' | 81 | 9 | ADD | C | |
004C' | 06 05 | 10 | MVI | B,z | |
004E' | 0E 00 | 11 | MVI | C,k+i | |
0050' | C6 ..X | 12 | ADI | t | |
0052' | D6 00* | 13 | SUI | two | |
14 | M1 | ;T1 | z,t,k,i | ||
=0005 | 14 | ??0000 | equ |
| |
0054' | 3E //X | 14 | MVI | A,T+??0000 | |
0056' | 06 0C | 14 | MVI | B,k+??0000 | |
0058' | 0E FE | 14 | MVI | C,i+??0000 | |
005A' | 57 | 15 | MOV | D,A | |
005B' | C5 | 16 | PUSH | B | |
005C' | 06 01 | 17 | MVI | B,1 | |
005E' | C1 | 18 | POP | B | |
19 | include | stack.asm | |||
005B' | (0014) | 1 | ds | 20 | |
2 | stack | ; вершина стека | |||
20 | end |
В третьей колонке помещается номер строки соответствующего исходного или вставляемого файла. Для вставляемых файлов используется своя нумерация строк.
В четвертой колонке и далее помещаются поля метки, мнемоники, операнда и комментария, причем для макрорасширений локальные значения сопровождаются знаком “??”.
Компоновка программы
Компоновку программы
можно производить разными
Avlink @<имя командного файла компоновки>
например, Avlink @1.lnk
Для компоновки программы test.asm можно использовать следующий командный файл:
test=test.OBJ | ; имя выходного файла (test) и имена компонуемых |
; объектных модулей (*.obj) | |
; опции: | |
– SYMBOLS | ; сохранение в выходном файле символов программы |
; для удобства отладки | |
– START(M,0H) | ; задание начального адреса размещения программы |
; в памяти | |
– DS(x1,5) | ; задание значений символов, не определенных в |
– DS(two,6) | ; исходном файле |
Приведенный пример
командного файла содержит все необходимые
опции при компоновке простой
программы (без использования сегментов).
В этом случае программа представляет
собой одну общую последовательность
кодов, для которой задается начальный
адрес размещения ее в памяти. При
необходимости опциями DS задаю
Можно соединить
последовательно две (или больше)
простые программы при
test=test.OBJ,vstavka.obj
коды файла vstavka.obj будут в выходном файле следовать за кодами файла test.OBJ.
Результатом компоновки являются выходные файлы со следующими расширениями: *.hex, *.sym и *.map. Файл *.hex содержит исполняемые коды в 16-ричной системе, файл *.sym содержит символьную информацию, необходимую для отладки. Весьма важным файлом, который обязательно необходимо проверить после компоновки, является файл *.map (карта компоновки), который содержит информацию о выполненном размещении программы в памяти. Полученное размещение может отличаться от "заказанного" без вывода каких-либо сообщений об ошибках.
Для программы test был получен следующий файл test.map
AVLINK --- LOAD MAP
For: Avocet 8085/Z80 Assembler v2.02, #01235
RELOCATED SEGMENTS - CLASS 'M'
SEGMENT NAME | START | STOP | LENGTH | ovl/cat def/undef |
CODE | 0000 | 0072 | 0073 | Concat Defined |
ZERO LENGTH SEGMENTS
SEGMENT START
DATA 0000
IOSPACE 0000
No Transfer Address.
В этом файле следует обратить внимание на величины START=000 STOP=0072 LENGTH=0073, которые в 16-ричной системе дают начальный, конечный адрес и длину программы.
Если в командном файле не определить символы x1 и two, появится следующее предупреждение:
WARNING: Symbol TWO undefined
WARNING: Symbol X1 undefined
Использование
программы,
состоящей из отдельных
сегментов
Обычно мало-мальски сложная прикладная программа представляет совокупность нескольких единиц – модулей. Это следует также из принципов структурного программирования. Физической единицей программы является программный модуль (файл). Логической единицей программы на ассемблере является секция или сегмент. Функциональный модуль программы (подпрограмма, процедура и т.д.) может совпадать с секцией или объединять несколько секций.
Использование нескольких программных модулей для получения общей программы обусловлено существованием больших и сложных программ, совместной работой нескольких программистов, удобством разработки программы.