Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Программа подсчета количества нулевых элементов в одномерном массиве (векторе)Содержание книги
Поиск на нашем сайте
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 для организации вложенных циклов.
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; просмотров: 125; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.137 (0.009 с.) |