Автор работы: Пользователь скрыл имя, 20 Октября 2011 в 18:01, реферат
Основные общие особенности языка ассемблера (чаще не совсем точно называемого просто ассемблером; строго ассемблером называется программа, которая является транслятором. Эта программа переводит последовательность команд с языка ассемблера на язык машинных кодов процессора) микропроцессоров совпадают с особенностями всех языков подобного типа. Отметим их основные особенности
Механизм секций поддерживается современными языками ассемблера в связи с использованием в процессорах памяти с достаточно разветвленной (и иногда сложной) структурой памяти, состоящей из блоков различного назначения и с различными характеристиками. Программу, состоящую из нескольких секций, можно загружать в разные блоки и места памяти, распределяя различные секции программы в зависимости от назначения. Например, часть программы, представляющую команды инициализации процессора, которые выполняются один раз при включении системы и время выполнения которых не критично, можно разместить в медленной внешней памяти, а критичные с точки зрения времени выполнения фрагменты - в быстрой внутренней памяти процессора.
Отдельный программный модуль не связан с определенным количеством секций - модуль может содержать одну или несколько секций, в свою очередь секция может быть расположена в нескольких программных модулях.
Каждая секция может являться отдельным функциональным элементом программы. При этом секция может быть независимо настроена на размещение в определенном месте (в соответствии с требуемыми типом и адресом памяти) используемого пространства памяти. Эта настройка на конкретные адреса, так же как и размещение секций в определенном порядке, осуществляется компоновщиком
Секции (сегменты) программы прежде всего разделяются по назначению. Как правило, во всех языках используются (иногда этим и ограничиваются) секции трех видов: секции кодов программы, секции инициализируемых данных программы (т.е. данных, которые загружаются в память) и секции не инициализируемых данных (т.е. данных появляющихся в процессе выполнения программы). Секции могут иметь имя, задаваемое программистом (пользователем).
В языке AVSIM механизм сегментов поддерживается специальными директивами.
Организация сегментов
Для организации сегментов используются несколько директив.
Директива defseg
Формат директивы
defseg <имя сегмента>[, атрибуты сегмента]
Директива определяет используемый в программе сегмент. Обязательным элементом является имя сегмента. Атрибуты сегмента (о них чуть ниже) являются необязательным элементом.
Директива seg
Формат директивы
seg <имя сегмента>
Данная директива открывает сегмент. Директива определения сегмента должна предшествовать директиве открытия. Она может стоять в начале программы.
Сегмент закрывается либо директивой открытия другого сегмента, либо директивой конца программы end.
Примером программы,
организованной с использованием сегментов,
может служить следующая
extern | x1,two | ||
%include | lib1.asm | ||
z | equ | 5 | |
t | equ | x1+3 | |
k | equ | +7 | |
I | equ | -7 | |
defseg INTERRUPT | |||
seg | INTERRUPT | ||
JMP | INIT | ||
ds | 5 | ||
JMP | M1 | ||
defseg INITSEG | |||
seg | INITSEG | ||
INIT | LXI | SP,Stack | |
EI | |||
JMP | BEGIN | ||
defseg MAIN | |||
seg | MAIN | ||
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 | ||
defseg STACKSEG | |||
seg | STACKSEG | ||
stack | ; top | ||
end |
Программа test1.asm является
другой формой записи программы test.asm,
приведенной выше. В ней использованы
сегменты INTERRUPT, INITSEG вм
Сегменты программы могут записываться фрагментарно, т.е. отдельные фрагменты разных сегментов могут перемешиваться. В этом случае фрагменты одного сегмента будут объединены при компоновке в порядке их записи в исходном тексте. Отдельные части сегмента могут размещаться и в различных программных модулях.
Примером может
служить следующая программа te
extern | x1,two | ||
%include | lib1.asm | ||
z | equ | 5 | |
t | equ | x1+3 | |
k | equ | +7 | |
I | equ | -7 | |
defseg INTERRUPT, class=code | |||
seg | INTERRUPT | ||
JMP | INIT | ||
ds | 5 | ||
JMP | M1 | ||
defseg INITSEG, class=code | |||
seg | INITSEG | ||
INIT | LXI | SP,Stack | |
EI | |||
JMP | BEGIN | ||
defseg MAIN, class=code | |||
seg | MAIN | ||
Begin | MVI | A,x1 | |
UMN3 | |||
MVI | B,z | ||
defseg STACKSEG, class=data | |||
seg | STACKSEG | ||
stack | ; top | ||
seg | MAIN | ||
MVI | C,k+i | ||
ADI | t | ||
SUI | two | ||
M1 | T1 | z,t,k,i | |
MOV | D,A | ||
PUSH | B | ||
MVI | B,1 | ||
POP | B | ||
end |
Для сегментов могут быть использованы различные атрибуты, в том числе и определяющие размещение сегмента в памяти. Здесь отметим только один – class, который определяет тип сегмента и может принимать значение code, data, iospase. В программе test2.asm этот атрибут использован.
Механизм сегментов удобно использовать для включения в программу типовых действий. Например, сегменты INTERRUPT, INITSEG, STACKSEG носят общий для многих задач характер. Из них можно организовать отдельный файл test3.asm, который можно подключать к основной программе на этапе компоновки, а основная программа test4.asm будет включать только сегмент MAIN.
Программа test3.asm:
extern | M1,Begin | ||
defseg INTERRUPT, class=code | |||
seg | INTERRUPT | ||
JMP | INIT | ||
ds | 5 | ||
JMP | M1 | ||
defseg INITSEG, class=code | |||
seg | INITSEG | ||
INIT | LXI | SP,Stack | |
EI | |||
JMP | BEGIN | ||
defseg STACKSEG, class=data | |||
seg | STACKSEG | ||
stack | ; top | ||
end |
Программа test4.asm:
extern | x1,two | ||
public M1,Begin | |||
%include | lib1.asm | ||
z | equ | 5 | |
t | equ | x1+3 | |
k | equ | +7 | |
I | equ | -7 | |
defseg MAIN, class=code | |||
seg | MAIN | ||
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 | ||
end |
Обратите внимание на взаимодействие в этих файлах директив extern-public с метками M1, BEGIN.
Компоновка программы, состоящей из сегментов
При компоновке программы, состоящей из сегментов, командный файл имеет ту же структуру, но возможно использование дополнительных опций. Например, для компоновки программы test1 можно использовать следующий командный файл:
test1=test1.obj
-SYMBOLS
-START(M,0H)
-PS(initseg,40h)
-PS(stackseg,100h)
-DS(x1,5)
-DS(two,6)
-OR(INTERRUPT,INITSEG,MAIN,
В этом файле добавились две новые опции. Опция PS определяет начальный адрес размещения конкретного сегмента, опция OR порядок следования сегментов. После компоновки в соответствии с приведенным командным файлом получится следующее размещение секций (фрагмент файла test1.map):
SEGMENT NAME | START | STOP LENGTH | ovl/cat def/undef |
INTERRUPT | 0000 | 000a 000b | Concat Defined |
INITSEG | 0040 | 0046 0007 | Concat Defined |
MAIN | 0047 | 005e 0018 | Concat Defined |
ZERO LENGTH SEGMENTS
SEGMENT START
STACKSEG 0100
Таким образом,
получилось размещение сегментов INTERRUPT,
INITSEG, STACKSEG по заказанным начальным адресам 0h, 40h, 100h соответс
Командный файл компоновки двух программ test3 и test4 будет отличаться от приведенного только первой строкой, в которой указываются собираемые объектные модули:
test1=test3.obj,test4.obj
Назад | Содержание | Вперед |