Предыдущий раздел | ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА | Следующий раздел |
Ранее в п.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] ; Межсегментный вызов процедуры
Обратите внимание, что при межсегментном косвенном вызове процедуры не используется имя вызываемой процедуры. Поэтому так можно вызывать процедуры, принадлежащие чужим машинным программам. Имена процедур нужны лишь транслятору и редактору связей при получении конкретной машинной программы, а при межмашинном взаимодействии эти имена использоваться не могут. Естественно, что для межсегментного косвенного вызова процедуры необходимо знать ее стартовый логический адрес (сегмент плюс смещение).
Предыдущий раздел | В начало | Следующий раздел |