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

Организация цикла с помощью команд DEC и JNZ (Третий способ)




С помощь этих операторов можно создавать циклы, которые будут работать быстрее оператора Loop. Комбинированная работа команд DEC и JNZ уменьшает содержимое регистра CX на 1 и выполняет переход на метку, если в CX не равен нулю.

Команда DEC, кроме того, устанавливает флаг нуля во флаговом регистре в состояние 0 или 1. Команда JNZ затем проверяет эту установку.

Аналогично командам JMP и LOOP операнд в команде JNZ содержит значение расстояния между концом команды JNZ и адресом перехода (Label1), которое прибавляется к командному указателю. Это расстояние должно быть в пределах от - 128 до +127 байт.


 

. model tiny ; модель памяти, в которой сегменты кода, данных и стека объединены.
. code ; сегмент кода, который содержит данные.
org 100h ; начало СОМ-файла
begin: ; метка начала кода программы
mov cx,10 ; загружаем в (регистр-счетчик) CX количество повторов (отсчет будет идти от 10 до 0)
Label1: ; создаем метку (Label - метка).
mov ah,9 ; помещаем номер функции DOS "вывод строки (9)" в регистр АН.
mov dx,offset String помещает в регистр DX смещение метки String относительно начала сегмента данных
int 21h ; функция DOS "вывод строки"
dec cx ; оператор DEC уменьшает на единицу CX и, если он не равен нулю, переходит на метку Label1
jnz Label1 ; условный переход на строку с меткой Label1
ret ; функция DOS "завершить программу"
string db 'priver ',13,10, '$' ; строка, содержащая выводимые данные
end begin ; метка окончания кода программы

 

Программа для практики

Напишем программу, выводящую на экран все ASCII-символы (16 строк по 16 символов в строке).

. model tiny ; модель памяти в которой сегменты кода, данных и стека объединены.
. code ; сегмент кода, который содержит данные.
org 100h ; начало СОМ-файла
begin: ; метка начала кода программы
mov cx,256 ; задаем значение счетчика (256 символов)
mov dl,0 ; первый символ - с кодом 00
mov ah,2 ; номер функции DOS "вывод символа"
cloop: int 21h ; вызов DOS
inc dl ; увеличение DL на 1 - следующий символ
test dl,0Fh ; если DL не кратен 16
jnz continue_loop; ; продолжить цикл,
push dx ; иначе: сохранить текущий символ
mov dl,0Dh ; вывести CR
int 21h ; вызов DOS
mov dl,0Ah ; вывести LF
int 21h ; вызов DOS
pop dx ; восстановить текущий символ
continue_loop: ; метка
loop cloop ; продолжить цикл
ret ; завершение СОМ-файла
end begin ; метка окончания кода программы

 

Здесь с помощью команды LOOP оформляется цикл, выполняющийся 256 раз (значение регистра СХ в начале цикла). Регистр DL содержит код символа, который равен нулю в начале цикла и увеличивается каждый раз на 1 командой INC DL. Если значение DL сразу после увеличения на 1 кратно 16, оно временно сохраняется в стеке и на экран выводятся символы CR и LF, выполняющие переход на начало новой строки. Проверка выполняется командой TEST DL,0Fh - результат операции AND над DL и 0Fh будет нулем, только если младшие четыре бита DL равны нулю, что и соответствует кратности шестнадцати.

Содержание отчета

3.1 Титульный лист.

3.2 Индивидуальный вариант задания.

3.3 Тестовые наборы данных и предполагаемые результаты.

3.4 Текст программы до отладки.

3.5 Список ошибок, обнаруженных при отладке.

3.6. Результаты выполнения тестов.

3.7. Распечатка листинга компиляции отлаженной программы с указанием работы каждой строки.

Поделиться:





Читайте также:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...