Структура программы на языке Ассемблера




Исходный файл на ЯА состоит из сегментов. В простейшем случае это – один сегмент, который содержит обязательные элементы.

{мет. сегм.} SEGMENT ’code’

ASSUME CS:{ мет. сегм.}, DS:{ мет. сегм.}

{мет. начала} MOV AX, { мет. сегм.};

MOV DS,AX;

MOV AX,{код функции};

INT 21h

… DW …

… DB …

{ мет. сегм.} ENDS

END { мет. начала}

 

Рассмотрим директивы оформления программы:

1) директива SEGMENT для ассемблеров MASM и TASM имеет одинаковую структуру

{мет. сегм.} SEGMENT [{счетн.}] [{комб.}] [‘{класс}’]

где {мет. сегм.} - это имя сегмента, которое трактуется как метка, т.к. используется для передачи управления.

Атрибуты необязательны, но, если они есть, то очередность должна сохраняться.

2) директива ASSUME нужна для выполнения команд программы, которые неявно ссылаются на сегментные регистры МП (т.е. в примере – DS и CS). Она обеспечивает передачу адресов сегментов с соответствующими именами в сегментные регистры.

Общий вид

ASSUME CS:{ мет.}[, {сег. рег.}:{ мет.}]

В приведенном примере эта директива означает, что DS и CS указывают на один и тот же сегмент, причем в CS адрес начала сегмента загружается автоматически, а в DS для этого требуются обычно две команды в самом начале сегмента.

Заметим, что директива ASSUME может быть расположена до начала первого сегмента. В многосегментных программах ASSUME может описывать следующие сегменты

 

Сег.рег. Сегмент Загрузка адреса
CS Рг сегмента команд автоматическая
DS Рг сегмента данных в программе
ES Рг доп. сегмента данных в программе
SS Рг сегмента стека автоматическая

 

3) Директива ENDS указывает на конец текста сегмента. Общий вид

{ мет. сегм.} ENDS

4) Директива END указывает на конец текста исходного модуля (ИМ). Общий вид

END { мет. начала}

где { мет. начала} – пусковой адрес, т.е. метка первой выполняемой строки ИМ, которой передается управление после компоновки.

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

1) сегмент данных,

2) дополнительный сегмент данных,

3) сегмент команд,

4) сегмент стека, т.к. он может быть описан без расхода памяти.

Например,

Stack SEGMENT stack,‘stack’

DW 128 dup(?)

Stack ENDS

Объем стека обычно указывается в словах и не должен превышать 64КБ.

Здесь имя сегмента совпадает с атрибутами, что не запрещено; далее stack – комбинаторный атрибут, который позволяет компоновщику объединить стековые сегменты из разный ИМ в один стековый сегмент. Кроме того, при загрузке программы выполняется автоматическая инициализация регистров SS и SP.

Часто в больших программах используются подпрограммы для реализации типовых участков. В ЯА подпрограммы оформляются в виде процедур.

Описание процедур

{имя проц.} PROC {параметр}

{тело проц.}

[RET]

{имя проц.} ENDP

где {имя проц.} – должно повторяться дважды и используется для обращения к процедуре;

{параметр} может принимать одно из двух значений - <NEAR> (по умолчанию) или <FAR>.

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

Имена и метки, описанные в процедуре, не локализуются внутри нее, поэтому должны быть уникальными в программе.

Хотя в АЯ можно описать одну процедуру внутри другой, никакой выгоды это не дает и обычно не используется.

Вызов процедур

Если из процедуры возможен возврат в DOS, то ее можно вызвать командой перехода на имя процедуры

JMP {имя проц.}

Если нужен возврат в вызывающую программу, то проще всего использовать команду обращения

CALL {имя проц.}

Тогда в теле процедуры должна быть команда возврата

RET

 

 

Задание

 

1. Ознакомиться с образцами программ, приведенными в файлах task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm.

2. Ознакомиться с образцами программ, приведенными в файлах task2_1.asm, task5_m.asm, task6_1.asm.

3. Разработать ассемблер-программу реализации линейного процесса в соответствии с вариантом задания.

Результат выводить в 16-ричной системе счисления.

 

Вариант Расчетная формула Аргументы, Байт
a b c d
    -30    
        -14
  -16      
    -6 -20  
        -35
      -28  
      -24  
    -14    
    -30    
        -14
  -16      
    -6   -17
        -25
      -28  

 

Лабораторная работа № 4

 

Задание

 

1. Разработать программу в Турбо-ассемблере для реализации циклического процесса в соответствии с вариантом задания, выполненным на занятии 2.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: