Язык ассамблера

Автор работы: Пользователь скрыл имя, 20 Октября 2011 в 18:01, реферат

Описание

Основные общие особенности языка ассемблера (чаще не совсем точно называемого просто ассемблером; строго ассемблером называется программа, которая является транслятором. Эта программа переводит последовательность команд с языка ассемблера на язык машинных кодов процессора) микропроцессоров совпадают с особенностями всех языков подобного типа. Отметим их основные особенности

Работа состоит из  1 файл

ЯЗЫК АССЕМБЛЕРА.docx

— 85.75 Кб (Скачать документ)

Механизм секций поддерживается современными языками  ассемблера в связи с использованием в процессорах памяти с достаточно разветвленной (и иногда сложной) структурой памяти, состоящей из блоков различного назначения и с различными характеристиками. Программу, состоящую из нескольких секций, можно загружать в разные блоки и места памяти, распределяя  различные секции программы в  зависимости от назначения. Например, часть программы, представляющую команды  инициализации процессора, которые  выполняются один раз при включении  системы и время выполнения которых  не критично, можно разместить в  медленной внешней памяти, а критичные  с точки зрения времени выполнения фрагменты - в быстрой внутренней памяти процессора.

Отдельный программный  модуль не связан с определенным количеством  секций - модуль может содержать  одну или несколько секций, в свою очередь секция может быть расположена  в нескольких программных модулях.

Каждая секция может являться отдельным функциональным элементом программы. При этом секция может быть независимо настроена на размещение в определенном месте (в соответствии с требуемыми типом и адресом памяти) используемого пространства памяти. Эта настройка на конкретные адреса, так же как и размещение секций в определенном порядке, осуществляется компоновщиком

Секции (сегменты) программы прежде всего разделяются по назначению. Как правило, во всех языках используются (иногда этим и ограничиваются) секции трех видов: секции кодов программы, секции инициализируемых данных программы (т.е. данных, которые загружаются в память) и секции не инициализируемых данных (т.е. данных появляющихся в процессе выполнения программы). Секции могут иметь имя, задаваемое программистом (пользователем).

В языке AVSIM механизм сегментов поддерживается специальными директивами.

Организация сегментов

Для организации  сегментов используются несколько  директив.

Директива defseg

Формат директивы

defseg     <имя сегмента>[, атрибуты сегмента]

Директива определяет используемый в программе сегмент. Обязательным элементом является имя  сегмента. Атрибуты сегмента (о них  чуть ниже) являются необязательным элементом.

Директива seg

Формат директивы

seg     <имя сегмента>

Данная директива  открывает сегмент. Директива определения  сегмента должна предшествовать директиве  открытия. Она может стоять в начале программы.

Сегмент закрывается  либо директивой открытия другого сегмента, либо директивой конца программы  end.

Примером программы, организованной с использованием сегментов, может служить следующая программа test1.asm:

      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, приведенной выше. В ней использованы сегменты INTERRUPTINITSEG вместо вставляемой программы init.asm, сегмент MAIN, повторяющий собственно программу test.asm и сегмент STACKSEG вместо вставляемой программы stack.asm. Так как при компоновке, как будет видно ниже, можно независимо размещать в памяти различные сегменты, в программе test1 отсутствуют директивы ds, с помощью которой резервировалось необходимое "пустое" место между сегментами.

Сегменты программы  могут записываться фрагментарно, т.е. отдельные фрагменты разных сегментов  могут перемешиваться. В этом случае фрагменты одного сегмента будут  объединены при компоновке в порядке  их записи в исходном тексте. Отдельные  части сегмента могут размещаться  и в различных программных  модулях.

Примером может  служить следующая программа test2.asm, в которой сегмент MAIN разбит на две части. Вторая часть сегмента, так же как первая, начинается с директивы seg MAIN:

      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,STACKSEG)

В этом файле  добавились две новые опции. Опция 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 по заказанным начальным адресам 0h40h100h соответственно, а сегментMAIN расположился сразу после сегмента INITSEG. При этом необходимо, чтобы указания опций PS и OR не противоречили друг другу. Если же это имеет место, то предпочтение отдается опции PS.

Командный файл компоновки двух программ test3 и test4 будет отличаться от приведенного только первой строкой, в которой указываются собираемые объектные модули:

test1=test3.obj,test4.obj

Назад Содержание Вперед

Информация о работе Язык ассамблера