Построение простой программы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Построение простой программы



В качестве "простой" рассмотрим вариант построения программы без использования механизма сегментов и соответствующих директив. Ниже приведен с пояснениями пример подобной программы.

Основная программа test.asm

extern x1,two

%include lib1.asm; включение библиотеки макрорасширений

z equ 5

t equ x1+3

k equ +7

i equ - 7

include init.asm; включение команд инициализации процессора

Begin MVI A,x1

UMN3

MVI B,z

MVI C,k+i

ADI t

SUI two

M1 T1 z,t,k,i

MOV D,A

PUSH B

MVI B,1

POP B

include stack.asm; резервирование памяти для стека

end

Программа не имеет какого либо содержательного смысла и носит чисто учебный характер для отражения различных возможностей ее построения. В программе используются объявленные директивой extern символы x1,two, значение которых будет определено при компоновке. В программе используются макрокоманды UMN3 и T1 z,t,k,i. Макроопределения этих команд записаны в библиотеке lib1.asm и включаются в основную программу командой препроцессора %include. Использованные макрокоманды описаны в подразделе “Средства макроассемблера”.

Файл 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.

В первой колонке листинга приводится:

· для команд ее относительный (относительно начала программы) перемещаемый адрес,

· для символов, определяемых директивой equ, их значение. Если символ является внешне-определенным (определенным директивой extern), он обозначается как X.

Во второй колонке записывается код команды. Если в команде присутствует перемещаемый адрес (например, в команде перехода), то код сопровождается знаком ' (C3 0040'). Если в команду входит неопределенное значение символа, то код сопровождается знаком *.

1 2 3 4 5 6 номера колонок листинга

1 extern x1,two

2 $SETLN(LIB1.ASM);%include lib1. asm

1 * тексты макроопределений

2;UMN3 %macro

3; MOV C,A

4; RLC

5; ADD C

6; %endm

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

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 INIT

0003' (0005) 2 ds 5

0008' C3 0054' 3 JMP 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 Z

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       Concat Defined

ZERO LENGTH SEGMENTS

SEGMENT START

DATA 0000

IOSPACE 0000

No Transfer Address.

В этом файле следует обратить внимание на величины START=000 STOP=0072 LENGTH=0073, которые в 16-ричной системе дают начальный, конечный адрес и длину программы.

Если в командном файле не определить символы x1 и two, появится следующее предупреждение:



Поделиться:


Последнее изменение этой страницы: 2017-01-25; просмотров: 164; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.238.135.30 (0.024 с.)