Call PP ; обращение к ПП
6. Передача параметров отложенным вычислением. Как и в случае передачи параметров по имени, процедура получает адрес ПП, вычисляющей значение параметра. Этот механизм чаще используется в системах искусственного интеллекта и в ОС. Использование локальных параметров: Локальные параметры имеют смысл только для ПП. Если локальных параметров немного, то их размещают в регистрах, но если их много, то возможны различные варианты: им можно отвести место в сегменте данных, но тогда большую часть времени эта область памяти не будет использоваться. Лучший способ – разместить локальные параметры в стеке на время работы ПП, а перед выходом из ПП их удалить. Для этого после входных действий в процедуре нужно уменьшить значение указателя на вершину стека SP на количество байтов, необходимых для хранения локальных величин и затем записывать их в стек и извлекать их можно с помощью выражений вида: [BP – n], где n определяет смещение локального параметра относительно значения BP. Например, если предполагается, что ПП будет использовать 3 локальные параметра размером в слово, то стек графически можно представить так: При выходе из процедуры перед выполнением завершающих действий нужно возвратить регистру SP его значение. Если в стеке хранятся и фактические и локальные параметры, то начало процедуры и ее завершение должно выглядеть следующим образом: PP proc PushBP ; сохранить старое значение BP Mov BP, SP ; (SP) в BP SubSP, k1 ; отвести в стеке k1 байтов под лок пар - ы PushAX ; сохранить в стеке регистры, -------------- ; используемые в ПП <тело процедуры> ------------- ; восстановить регистры popAX ; MovSP, BP ; восстановить SP, т.е. освободить место ; в стеке от локальных параметров PopBP ; восстановить BP, равным до обращения к ПП Retk2 ; очистка стека от фактических ; параметров и возврат в вызывающую программу PP endp ; конец ПП Подсчет количества различных символов в заданной строке Строка задана как массив символов. Начальный адрес ее передадимв ПП через регистр BX, длину строки через CX, а результат - черезAX. Создадим процедуру, в которой выделяется 256-ыйлокальный массив L по количеству возможных символов. K-омуэлементу этого массива будем присваивать единицу, если символ,цифровой код которого равен K, в заданной строке существует.Затем подсчитаем количество единиц в этом массиве. Вначале весьмассив обнуляется. К первому элементу этого массива можнообратиться так: L1 = [BP – 256]к к-ому Lk = [BP – 256 + k]. Работая со строками, эту задачу можно решить проще. Count_sproc ; ; входныедействия Push BP Mov BP, SP Sub SP, 256 Push BX Push CX Push SI ;Обнуление локального массива movAX, CX; сохранение длины исходной строки movCX, 256; возможное количество символов movSI, 0; индекс элемента массива m1: mov byte ptr [BP – 256 + SI], 0 ; IncSI Loopm1 ;просмотр заданной строки и запись 1 в локальный массив movCX, AX; длину строки в CX MovAX, 0 m2: movAL, [BX]; код очередного символа в AL movSI, AX ;пересылаем его в SI movbyteptr [BP – 256 + SI], 1; пересылаем 1 в к –й элемент массива IncBX loopm2 ; ; подсчет количества 1 в локальном массиве MovAX, 0 ; результат будет в AX movCX, 256 ;количество повторений цикла movSI, 0 ;индекс массива в SI m3: cmp byte ptr [BP – 256 + SI], 1 Jne m4 Inc AX M4: inc SI Loopm3 ; выходные действия popSI; восстановление popCX; регистров popBX ; movSP, BP; освобождение стека от локальных параметров popBP; восстановить старое BP Ret Count_sendp Рекурсия в ассемблере: Основные трудности, возникающие при реализации рекурсии –это опасность «зацикливания » рекурсии и использованиепараметров. Зацикливания не произойдет, если в процедуре естьрекурсивная и не рекурсивная ветви и при выполнении некоторогоусловия вычислительный процесс пойдет по не рекурсивной ветви.Рекурсивное обращение ПП можно представить, еслипредположить, что при каждом обращении создается копия ПП иадреса возврата сохраняются в стеке. А структура стека позволяетизвлекать их в последовательности, обратной поступлению. Также решается и проблема с параметрами. В рекурсивнуюпроцедуру нельзя передавать параметры через ячейки памяти всегменте данных, а если такая необходимость возникает, то привходе в ПП их необходимо сохранять в стеке, а при выходе из неевосстанавливать. Это значит, что лучше сразу параметры передавать через стек.
Популярное: Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (421)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |