Программа подсчета количества нулевых элементов в одномерном массиве (векторе) 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Программа подсчета количества нулевых элементов в одномерном массиве (векторе)



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 для организации вложенных циклов.

 

TITLE prg_10_3

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; количество элементов в массиве

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

                   JCXZ EXIT; проверка сх на 0, если 0, то выход

CYC1:                   CMP MAS[SI],0;сравнить очередной элемент задан. массива с 0

                   JNE M1; если не равно 0, то на m1

                   INC AL; увеличение счетчика нулевых элементов

M1:            INC SI; перейти к следующему элементу

LOOP CYC1

EXIT:        MOV AX, 4C00H

                   INT 21H; возврат управления операционной системе

END          START

TITLE prg_10_4

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; количество элементов в массиве

                              MESS1      DB ‘в массиве нет нулевых элементов, $’

                              MESS2      DB ‘найден первый нулевой элемент в позиции, $’

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

                   JCXZ EXIT; проверка сх на 0, если 0, то выход

                   MOV SI, -1; готовим SI к адресации элементов MAS

CYC1:                   INC SI

CMP MAS[SI],0;сравнить очередной элемент задан. массива с 0

                   LOOPNZ  CYC1; цикл перебора элементов массива

                   JZ   EXIT; на эту команду попадем, если весь массив просмотрен

и нулевой элемент не обнаружен, либо, если нулевой элемент найден

.....здесь поместить команды выдачи сообщения MESS1

                   INC SI; определить номер первого нулевого элемента

EXIT:            

......здесь поместить команды выдачи сообщения MESS2 и номера первого нулевого элемента

MOV AX, 4C00H

                   INT 21H; возврат управления операционной системе

END                  START

TITLE prg_10_5

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; это заданный двумерный массив байт

                              db 1,0,9,8,6,7,8,0,5.4 

                              db 0,1,9,8,0,7,8,0,2,0 

                              db 1,2,9,8,0,7,8,0,2,3 

                              db 10,0,0,9,8,0,0,8,0,2

                              Len_mas equ 10; количество элементов в строке

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

                   XOR AX,AX

                   MOV CX, 5; в счетчик – число строк массива

                   LEA BX, MAS;смещение начала массива занести в ВХ

CYC1:                   PUSH CX;сохранить в стеке текущее значение счетчика строк

                   XOR SI, SI; начать обработку очередной строки

                   MOV СX, LEN_MAS; в сх – счетчик элементов строки

CYC2:                   CMP BYTE PTR [BX+SI],0; очередной элемент 0?

                   JNE NO-ZERO; если не 0, перейти на метку

                   MOV BYTE PTR [BX+SI],0FFH;заменить нулевой элемент

заданным значением

NO_ZERO:   

                   INC SI; перейти к следующему элементу строки

LOOP CYC2

POP CX; восстановить счетчик внешнего цикла (номера строки)

ADD BX, LEN_MAS; перейти к следующей строке

LOOP CYC1

EXIT:        MOV AX, 4C00H

                   INT 21H; возврат управления операционной системе

END             START

 



Поделиться:


Последнее изменение этой страницы: 2021-02-07; просмотров: 70; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.223.106.100 (0.029 с.)