Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Команды организации циклов




Для организации циклов имеются три команды LOOP (от англ. LOOP – описывать петлю), LOOPZ (от англ. LOOP while Zero – цикл пока ноль) и LOOPNZ (от англ. Loop while Not Zero – цикл пока не ноль), использующие в качестве счетчика цикла регистр CX. Формат команд приведен на рис.9.6.

 

Рис. 9.6. Формат команды организации цикла

 

Команда LOOP производит уменьшение значения в регистре CX на единицу и сравнение значения этого регистра с нулем:

– если СХ > 0, то управление передается на метку перехода;

– если CX = 0, то управление передается на следующую после LOOP команду.

Команда LOOPZ производит уменьшение значения в регистре CX на единицу, сравнение значения этого регистра с нулем и анализ флага нуля ZF:

– если СХ > 0 и ZF = 1, то управление передается на метку перехода;

– если CX = 0 или ZF = 0, то управление передается на следующую после LOOPZ команду.

Команда LOOPNZ производит уменьшение значения в регистре CX на единицу, сравнение значения этого регистра с нулем и анализ флага нуля ZF:

– если СХ > 0 и ZF = 0, то управление передается на метку перехода;

– если CX = 0 или ZF = 1, то управление передается на следующую после LOOPNZ команду.

Например, цикл в десять итераций:

 

MOV CX,10;Десять итераций цикла

m1: MOV AX,12

LOOP m1;Возврат на начало цикла

 

Необходимо отметить, что команды LOOP, LOOPZ и LOOPPNZ позволяют реализовывать только короткие циклы (в пределах –128…+127 байт).

При необходимости программировать вложенные циклы (цикл в цикле), значение одного из счетчиков можно сохранять в стеке:

 

MOV CX,30;Тридцать итераций главного цикла

cykl_1:

PUSH CX

MOV CX,5;Пять итераций вложенного цикла

cykl_2:

LOOP cykl_2

POP CX

LOOP cykl_1

 

Рассмотрим COM-программу, которая в заданном массиве букв латинского алфавита заменяет все строчные (малые) буквы на прописные (большие). Коды ASCII для английских символов приведены в табл.4.2. Строчным буквам соответствует диапазон кодов 61H…7AH, а прописным – 41H…5AH. Следовательно, если взятый из массива символ имеет код, не входящий в диапазон 61H…7AH, то он уже является прописной буквой и замену производить не нужно.

Для самого преобразования рассмотрим, что представляют собой ASCII коды символов в двоичном виде:

A = 41H = 01000001B,

a = 61H = 01100001B,

Z = 5AH =01011010B,

z = 7AH = 01111010B.

Как видим, отличие заключается лишь в пятом бите, который у строчных букв равен единице, а у прописных – нулю. Для преобразования строчных букв в прописные этот бит необходимо сбросить, например, командой AND.

Текст программы приведен на рис.9.7.

 

 

codesg SEGMENT PARA 'Code'

ASSUME CS:codesg,DS:codesg,SS:codesg,ES:nothing

ORG 100H

begin: JMP main

;-----------------------------------------------------

pole DB 'Hsd1fAbcVVxX4'

len=$-pole;Длина массива

;-----------------------------------------------------

main PROC NEAR

 

MOV CX,len;Число итераций

LEA BX,pole;Адрес массива в регистр BX

 

m1: MOV AL,byte ptr [BX];Чтение из массива

CMP AL,61H

JB next

CMP AL,7AH

JA next

AND AL,11011111B;Замена строчных на прописные

MOV byte ptr [BX],AL;Запись обратно в массив

next: INC BX;Следующий элемент массива

LOOP m1

 

MOV AX,4C00H;Можно использовать команду RET

INT 21H

 

main ENDP

codesg ENDS

END begin

Рис. 9.7. Программа замены в массиве строчных букв на прописные

 

Вопросы для самопроверки

1. Будет ли в данном фрагменте программы выполняться переход на метку m1?

MOV AL,35H

CMP AL,10110011B

JA m1

2. Будет ли в данном фрагменте программы выполняться переход на метку m1?

MOV AL,-35D

CMP AL,10111001B

JL m1

3. Будет ли в данном фрагменте программы выполняться переход на метку m1?

MOV AL,FEH

AND AL,00H

JZ m1

4. Сколько итераций будет у цикла при выполнении данного фрагмента программы?

MOV AX,5

MOV CX,4

m1: ADD AX,2

INC CX

LOOP m1

5. Чему будет равно значение регистра BL после выполнения данного фрагмента программы?

MOV BL,0

MOV CX,10

m2: INC BL

INC BL

m1: INC BL

LOOP m1

LOOP m2

6. Написать на языке ассемблера COM-программу, которая в заданном символьном массиве произвольной длины заменяет прописные (большие) латинские буквы на строчные (малые).

7. Написать на языке ассемблера программу типа COM, которая в заданном символьном массиве произвольной длины определяет количество прописных латинских букв и цифр.

 





Поделиться с друзьями:


Дата добавления: 2015-10-01; Мы поможем в написании ваших работ!; просмотров: 1034 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Своим успехом я обязана тому, что никогда не оправдывалась и не принимала оправданий от других. © Флоренс Найтингейл
==> читать все изречения...

2396 - | 2210 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.011 с.