4.Процедуры. 5.Организация циклов. Программа подсчета количества нулевых элементов в одномерном массиве (векторе). TITLE prg_10_2
4. Процедуры Процедура (или подпрограмма) – это основная функциональная единица декомпозиции (разделения на несколько частей) некоторой задачи. Процедуры являются средством реализации модульного программирования. Синтаксис описания процедуры следующий: Имя_процедуры PROC [[модификатор_языка]язык] [расстояние] [ARG список_аргументов] [RETURNS список_аргументов] [LOCAL список_аргументов] [USES список_регистров] Команды, директивы Языка макроассемблера RET [имя_процедуры] ENDP Из этого описания видно, что обязательными являются небольшое количество параметров, Хочу обратить Ваше внимание на то, что хотя в конце процедуры имя не является обязательным, рекомендую его обязательно писать, т. к. это облегчает чтение программы и возможную ее модификацию. Разница описания процедуры на языке Ассемблера и на языках высокого уровня только в деталях, которые хорошо усваиваются только на практике. Принципиальных различий немного, среди которых: - атрибут расстояние. Он может принимать значения NEAR и FAR. 1-ый вариант – для обращения к процедуре, описанной в текущем сегменте кода, 2-ой вариант – для обращения к процедуре из другого сегмента кода (внешней по отношению к текущему сегменту кода). По умолчанию предполагается NEAR. В этой связи следует обратить внимание, что основная процедура программы на ассемблере должна всегда иметь атрибут расстояния FAR, т. к. для программы-загрузчика она является внешней; - процедуру можно помещать в любом месте программы, но таким образом, чтобы управление передавалось процедуре только в нужное время. Учитывая это, процедуру можно размещать в начале программы (до первой исполняемой команды) или в конце программы (после возвращения управления операционной системе) или в другом модуле. Если Вы все же решите поместить процедуру внутри другой процедуры или основной программы, то не забудьте предусмотреть обход процедуры, поставив перед началом процедуры команду JMP;
- Обращение к процедуре происходит по команде - CALL [модификатор] имя_процедуры - Модификатор принимает такие же значения, как и в команде JMP, за исключением SHORT PTR.
5. Организация циклов При организации циклов широко используются команды INC (инкремент) и DEC (декремент), что означает добавление или вычитание единицы из целого числа, помещенного в ячейку памяти, РОН или индексный регистр. Команды имеют формат: INC операнд или DEC операнд В листинге 10. 2 на стр. 223 (учебник Юрова “Ассемблер”) приведен пример программы, в которой цикл организован за счет использования команд декремента и условного и безусловного перехода. Программа подсчета количества нулевых элементов в одномерном массиве (векторе) TITLE prg_10_2 STACK SEGMENT PARA STACK ‘STACK’ DB 64 DUP(‘STACK’); Область стека STACK ENDS DSEG SEGMENT PARA PUBLIC ‘DATA’ Mas db 1, 0, 9, 8, 0, 7, 8, 0, 2, 0; это заданный одномерный массив байт Len_mas equ 10; количество элементов в массиве, это же количество ; можно получить как len_mas=$ - mas DSEG ENDS CSEG SEGMENT PARA PUBLIC ‘CODE’ ASSUME CS: CSEG, DS: DSEG, SS: STACK START: PUSH DS SUB AX, AX PUSH AX MOV AX, DSEG ; инициировать адрес сегмента данных MOV DS, AX MOV СX, LEN_MAS; в сх – счетчик элементов массива XOR AX, AX XOR SI, SI CYC1: JCXZ EXIT; проверка сх на 0, если 0, то выход CMP MAS[SI], 0; сравнить очередной элемент задан. массива с 0 JNE M1; если не равно 0, то на m1
INC AL; увеличение счетчика нулевых элементов M1: INC SI; перейти к следующему элементу DEC CX; уменьшить счетчик элементов на 1 JMP CYC1 EXIT: MOV AX, 4C00H INT 21H; возврат управления операционной системе END START
нет
да
да
Но, учитывая важность такого алгоритмического элемента, как цикл, разработчики предусмотрели специальные команды цикла LOOP метка_перехода, которая означает ’повторить цикл’. Выполнение команды заключается в следующем: - вычитании 1 из регистра СХ; - сравнении регистра СХ с нулем; - если СХ=0, то управление передается на следующую после LOOP команду, иначе перейти на метку_перехода. LOOPE/LOOPZ метка_перехода, которая означает “повторить цикл, пока СХ< > 0 или ZF=0”. Обе команды совершенно идентичны, поэтому используйте, при необходимости, любую по Вашему вкусу. Отличаются эти команды от предыдущей пунктом 3 или анализом окончания цикла: - если СХ> 0 и ZF=1, управление передается на метку перехода, иначе если СХ=0 или ZF=0, то выполняется следующая после команды LOOPE/LOOPZ операция. LOOPNE/LOOPNZ метка_перехода, которая означает, “повторить цикл, пока СХ< > 0 или ZF=1”. Обе команды совершенно идентичны, поэтому используйте, при необходимости, любую по Вашему вкусу. В ней пункт 3 выполняется по следующему правилу:
- если СХ> 0 и ZF=0, управление передается на метку перехода, иначе если СХ=0 или ZF=1, то выполняется следующая после команды LOOPNE/LOOPNZ операция. Общая особенность команд цикла в том, что они используют РОН СХ как счетчик числа циклов, поэтому при их использовании не забудьте до метки_перехода послать в этот регистр нужное число! Недостаток всех команд цикла в том, что они реализуют только короткие переходы, Для работы с длинными циклами используются команды условного перехода и безусловного перехода. Вот когда у Вас цикл чуть-чуть больше существующих ограничений, есть смысл пересмотреть команды в цикле с целью минимизации их длины! Для изучения команд цикла на 3-ей лабораторной работе Вам нужно будет разработать программы, близкие к тем, что приведены в листингах 10. 3-10. 5 (учебник Юрова “Ассемблер)”. Листинг 10. 5 показывает, как используются команды засылки счетчика циклов в стек PUSH и восстановления из стека POP для организации вложенных циклов.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|