Возврат значения функцией

Рассмотрим пример, изображенный на слайде. Процедура Print должна получить строку символов и вывести ее на экран при помощи некоторой процедуры PrintSym. Вверху слайда расположен фрагмент кода основной программы: сразу после вызова процедуры следует строка, оканчивающаяся нулем, которая должна быть выведена на экран. Поскольку в стеке при вызове процедуры сохраняется адрес возврата (в данном случае это смещение в сегменте CS), можно адресовать данные, расположенные в потоке кода сразу после вызова процедуры, при помощи этого адреса. В данном примере адрес возврата будет совпадать с адресом строки, которую мы хотим передать процедуре в виде параметра.

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

MOV 2[BP],BX.

После этого команда RETпередаст управление команде, следующей за строкой.

Передача параметров в блоке параметров.

Передачу параметров можно осуществить в специальной области памяти, которая получила название блок параметров. Для этого все параметры нужно записать друг за другом в той последовательности, о которой знает процедура, и передать процедуре указатель на этот блок параметров. В данном примере указатель на блок параметров передается в паре регистров ES:BX, однако    его    можно    передать   и   любым   другим

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

Возврат значения функцией.

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

Наилучшее место для возврата результата – это регистр; большинство языков высокого уровня возвращают значение именно таким образом. Еще один способ – возврат значения в стеке. Для этого, как правило, вызывающая программа резервирует в стеке специальную ячейку. Также процедура может поместить результат на место какого-либо параметра. Наконец, третий способ – возврат значения в ячейке памяти, например, в глобальной переменной.

Ссылка на основную публикацию
Adblock detector