Предыдущий раздел ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА Следующий раздел

1.5.4. Операторы процедур

Ранее в п.7 рассматривались машинные команды, выполняющие вызов процедуры и возврат из нее. В языке ассемблера этим командам соответствуют операторы call и ret. Основное отличие оператора call от соответствующей машинной команды заключается в том, что в качестве операнда записывается не адрес первой команды процедуры, а его заменитель – имя (метка) процедуры. Пример:

call    Read_hex    ,

где   Read_hex – имя процедуры.

Что касается задания имени процедуры, то оно выполняется также просто, как и задание обыкновенной метки перехода, например:

Read_hex:

        .  .  .  .  .  .  .  .  .  .  .  .   ;  Операторы процедуры

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

 

Если процедура может вызываться и из других сегментов, то ей присваивается тип far (дальняя). Вспомогательный псевдооператор far записывается между оператором call и именем процедуры. Пример:

call    far  Read_hex.

Это межсегментный прямой вызов процедуры. Для вызова процедуры из другого сегмента памяти можно использовать также косвенную адресацию. Пример:

.   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .

Old             dd     0                          ; Для логического адреса процедуры

.   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .

call   far     [Old]          ; Межсегментный вызов процедуры

 

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

 


Предыдущий раздел В начало Следующий раздел