Четверг, 28.11.2024, 19:44
Приветствую Вас, Гость |
Меню сайта
Наш опрос
Нужен ли форум на этом сайте?
Всего ответов: 1313
Статистика

Онлайн всего: 4
Гостей: 4
Пользователей: 0

Процедуры на языке Ассемблер

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

Описание процедур  осуществляется в сегменте (или сегментах) кода.

Имя_процедуры PROC [[модификатор языка] язык] [расстояние]
[ARG список_передаваемых_параметров]
[RETURNS список_возвращаемых_значений]
[LOCAL список_локальных_объявлений]
[USES список_используемых_регистров]
        …
        Команды и директивы
        языка Ассемблер
        …
        RET
[Имя_процедуры] ENDP


Единственным обязательным значением, которое необходимо указывать при описании процедуры является ее имя.

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

Управление характером возможного вызова процедуры осуществляется с помощью необязательного параметра в описании [расстояние]. Этот параметр может принимать одно из двух значении:
    near – ближний вызов (используется по умолчанию),
    far – дальний вызов.

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

Таким образом возможны три варианта описания процедуры:
    в начале сегмента кода,
    в конце сегмента кода,
    в середине сегмента кода.


В начале сегмента кода


Code SEGMENT use16
        ASSUME cs: Code
MyProc    PROC
        …
        ret
MyProc    ENDP
start:
        …
        call    MyProc
        …
Code ENDS
end start


В конце сегмента кода


Code SEGMENT use16
        ASSUME cs: Code
start:
        …
        call    MyProc
        …
        mov    ax, 4c00h
        int    21h
MyProc    PROC
        …
        ret
MyProc    ENDP
Code ENDS
end start




В середине сегмента кода


Code SEGMENT use16
        ASSUME cs: Code
start:
        …
        call    MyProc
        …
        jmp    next
MyProc    PROC
        …
        ret
MyProc    ENDP
next:    …
        mov    ax, 4c00h
        int    21h
Code ENDS
end start

Форма входа
Поиск
Мы в сети
Реклама
Для того чтобы не видеть рекламу в правом верхнем углу сайта пройдите простую процедуру регистрации
ФОРУМ
У нас наконецто появился форум! Добро пожаловать! Будьте первыми, задайте направление форуму! =)
--- Не стесняемся - заходим на форум! ---