Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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

 

Начало
Инициировать счетчик элементов, обнулить счетчик нулей и смещение первого эл-та

 


       нет

CYC1: Счетчик элементов = 0?

 


                                                                                                                                     да

Конец

 


Очередной элемент = 0?
                            нет

 


                                                                                                                 

                                                                    да

Увеличить счетчик нулей
М1: Нарастить смещение для перехода к следующему элементу

 

 


Увеличить счетчик элементов
                                                                      да

 

 

 


Все элементы просмотрены?
            нет                                                                                                                 да

 

 

 


Но, учитывая важность такого алгоритмического элемента, как цикл, разработчики предусмотрели специальные команды цикла

       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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...