Подпрограммы часто возвращают значения в вызывающую програм-му. В программах на Ассемблере, которые предполагается вызывать из программы на языке высокого уровня, для возврата значений вы должны следовать соглашениям данного языка. Например, функции, вызываемые в языке Си, должны возвращать 8- или 16-битовые значе-ния (значения символьного, целого типа и ближние указатели) в ре-гистре AX, а 32-битовые значения (длинные целые и дальние указа-тели) — в паре регистров DX:AX. В главах 6 — 9 данного руководст-ва дается подробное описание соглашений по возвращаемым значениям языка Турбо Си, Турбо Паскаля, Турбо Бейсика и Турбо Пролога.
В программах, где используется только язык Ассемблера, в от-ношении возвращаемых значений допускается полная свобода: вы по-жете помещать их в тот регистр, какой захотите. Фактически, в ре-гистре флагов подпрограммы могут даже возвращать информацию о состоянии (в виде установки флага переноса или флага нуля). Одна-ко, лучше установить некоторые соглашения и их придерживаться. Полезным соглашением может служить возврат 8-битовых значений в регистре AL и 16-битовых значений в регистре AX.
Основная проблема при использовании в Ассемблере возвращае-мых подпрограммами значений состоит в том, что при возврате информации подпрограммы могут разрушить важную для вызывающей программы информацию. В Ассемблере легче писать обращение к подпрограмме, не помня о том, что подпрограмма возвращает значение, скажем в SI (или что данная подпрограмма просто изменяет SI), но при этом вы получите программу, в которой трудно будет выявлять ошибки.
По этой причине лучше сводить к минимуму число значений, возвращаемых в регистрах (лучше всего до одного) и возвращать до-полнительные значения, сохраняя их в ячейках памяти, на которые ссылаются передаваемые указатели (как это делается в Паскале и Си).
