Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 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; просмотров: 70; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.223.106.100 (0.029 с.) |