Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

Практическая  работа  5 ПОДПРОГРАММЫ

Цель работы 

Программирование с использованием подпрограмм – создание и использование процедур и макросов.

Подпрограммы-процедуры

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

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

5.2.2  Подпрограммы – процедуры описываются следующим образом:

<имя процедуры>  PROC  <параметры>

<тело процедуры>

ret                        ; возврат из процедуры

<имя процедуры>  ENDP

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

Вызов процедуры:         CALL  <имя процедуры>

По этой команде адрес следующей за процедурой команды (из регистра IP) записывается в стек  и управление передается процедуре.

Возврат из процедуры (return):        RET

По команде из вершины стека считывается адрес возврата (IP) и выполняет переход по нему.

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

НЕ нашли? Не то? Что вы ищете?

ПРИМЕР

Разработать программу суммирования чисел от 1 до 10 (тип переменных - слово) и продемонстрировать различные варианты расположения описания процедур.

model small

.stack 100h

.data

s  dw  ?        ; сумма

.code

; Процедура суммирования десяти чисел от 1 до 10

; Выход:        значение суммы в регистре АХ

SUM        PROC

mov ax, 0                         ; начальное значение суммы

mov bx, 1                         ; первое слагаемое

mov cx, 10                 ; загрузка счетчика

cycl:         add ax, bx                 ; суммирование

inc bx                         ; следующее число на 1 больше

loop  cycl                 

ret                 ; выход,  сумма - в ax

SUM ENDP                ; описание процедуры завершено

start:

       mov ax, @data

       mov ds, ax

       сall  abc                ; вызов процедуры abc  (описана позже)

сall  sum                ; вызов процедуры sum

mov s, ax                ; пересылка суммы из ax в s

mov aх, 4С00h

int 21h

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

ABC        PROC

ret

ABC ENDP                ; описание процедуры завершено

end start                        ; конец программы

Макросредства ассемблера

5.3.1  Макросредства ассемблера включают три составляющие.

1. Макроопределение (макрос) – набор команд, содержащий описание алгоритма.  Макрос имеет структуру:

<имя_макроса>  MACRO <[формальные_параметры]>

<тело макроопределения>

ENDM

Варианты расположения макросов:

    в начале программы до определения сегментов - работают в этой программе; в отдельном файле; для использования в других программах используют директиву:

include <имя_файла>;

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

2. Макрокоманда (вызов макроса):

<имя_макроса>  <[фактические параметры]>

3. Макрорасширение (макроподстановка) – вставка вместо макрокоманды макроса с заменой формальных параметров фактическими.

ПРИМЕР 

Разработать программу вывода  символов с использованием макроса.

model  small

; макрос vivod

; simv – выводимый символ (формальный параметр)

vivod  macro  simv

mov dl, simv

mov ah, 2h

int 21h

endm

               ; описание сегментов памяти

. stack 100h

.data

.code

vivod al                ; вызов макроса,  al – фактический параметр

Сравнение процедур  и макросов

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

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

Итог: большие фрагменты лучше описывать как процедуры, маленькие – как макросы.

Общие замечания

5.5.1  При использовании подпрограмм необходимо позаботиться о том, чтобы при их вызове не «портились» значения регистров и переменных, если они необходимы далее в программе. Для этого прежние значения регистров, задействованных в подпрограмме, в ее начале обычно сохраняют в стеке, а перед выходом из подпрограммы возвращают из стека.

ПРИМЕР 

Процедура  STROKA  выводит строку  на экран.

Вход: dx – начальный адрес строки.

В процедуре задействованы регистры:

    ah – для указания номера функции; al – изменяет свое значение при использовании int 21h.

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

stroka  proc

push ax                        ; сохранение ах (ah, al) в стеке

mov ah, 9         ; функция вывода строки c начальным адресом в dx

int 21h                        ; вызов DOS

pop ax                        ; восстановление ах из стека

ret

stroka  endp                ; описание процедуры завершено

5.5.2  В макросах часто используются метки. Если макрос вызывается в программе неоднократно, столько же раз в текст программы будет вставлен текст макроса, и повторяющееся имя метки вызывет синтаксическую ошибку. Для исключения этой проблемы используют директиву LOCAL, которая позволяет ассемблеру создавать уникальное имя метки при каждом вызове макроопределения.

ПРИМЕР

Макрос выводит заданный символ simv заданное число раз count.

vivod macro simv, count

local t

mov cx, count

t:        mov ah, 2

       mov dl, simv

       int 21h

       loop t

endm

ПОДПРОГРАММЫ        57

Цель работы        57

Подпрограммы-процедуры        57

Макросредства ассемблера        59

Сравнение процедур  и макросов        60

Общие замечания        60