В отличие от языков высокого уровня, в языке ассемблера нет отдельных понятий для процедуры и функции. Организация возврата результата из процедуры пол- ностью ложится на программиста. Если исходить из того, что получение результа- та — частный случай передачи аргументов, то программисту доступны три вариан- та возврата значений из процедуры. is С использованием регистров. Ограничения здесь те же, что и при передаче дан- ных, — это небольшое количество доступных регистров и их фиксированный размер. Функции DOS используют именно этот способ. Из рассматриваемых здесь трех вариантов данный способ является наиболее быстрым, поэтому его есть смысл задействовать для организации критичных по времени вызова про- цедур с малым количеством аргументов. Ш С использованием общей области памяти. Этот способ удобен при возврате большого количества данных, но требует внимательности в определении обла- стей данных и подробного документирования, чтобы устранить неоднозначность при трактовке содержимого общих участков памяти. * С использованием стека. Здесь, подобно передаче аргументов через стек, также требуется регистр В Р. При этом возможны следующие варианты: ? использование для возвращаемых аргументов тех же ячеек в стеке, которые применялись для передачи аргументов в процедуру, то есть предполагается замещение ставших ненужными входных аргументов выходными данными; D предварительное помещение в стек наряду с передаваемыми аргументами фиктивных аргументов с целью резервирования места для возвращаемого значения (в этом варианте процедура, конечно же, не должна пытаться очи- стить стек командой RET, эту операцию придется делать в вызывающей про- грамме, например, командой POP). В ходе приведенного обсуждения мы выяснили, что ассемблер не накладывает никаких ограничений на организацию процесса передачи данных и возврата зна- чений между двумя процедурами, а в более общем случае — и между модулями, представляющими отдельные файлы. Наиболее быстрый способ такого обмена — использование регистров. Но часто требуется связывать между собой не только программы, написанные на ассемблере, но и программы на разных языках. В этом случае универсальным является обмен данными через стек. Далее мы рассмотрим, как решается проблема связи программных модулей, написанных на языке ассем- блера и языках высокого уровня.