Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


 оманды управлени€ циклом




— помощью команд перехода можно реализовать любые разветвлени€ и циклы. »зучите таблицу 4, в которой представлены способы реализации ветвлений и циклов в €зыках Pascal и ассемблер.

“аблица 4.4

–еализаци€ ветвлений и циклов в €зыках Pascal и ассемблер.

“ип цикла язык Pascal язык јссемблер
¬етвление If X > 0 then begin Ѕлок S1 end else begin Ѕлок S2 end; CMP X, 0 JLE L2 Ѕлок S1 JMP Fin L2: Ѕлок S1 Final:
÷икл со счетчиком For X:=1 to N do begin Ѕлок S end; MOV CX, N L: Ѕлок S DEC CMP CX, 0 JNE L Final:
÷икл с передусловием While X > 0 do begin Ѕлок S end; Begin: CMP X, 0 JLE Fin Ѕлок S JMP Begin Final:
÷икл с постусловием Repeat Ѕлок S until X > 0 Begin: Ѕлок S CMP X, 0 JG Begin

ƒл€ организации циклов с заранее известным числом повторений, в систему команд микропроцессора Intel 8086 включены специальные команды управлени€ циклом: LOOP, LOOPE/LOOPZ и LOOPNE/LOOPNZ. —осто€ние флагов после выполнени€ команды этих команд не мен€етс€.

4.4.1. ”правление циклом по счетчику: LOOP <метка>

— помощью команды LOOP цикл может быть записан следующим образом:

  MOV CX, N ; N>0
L: Е    
  Е    
  Е    
  LOOP L  

ќсобенности команды LOOP.

ü ¬ качестве счетчика цикла об€зательно использовалс€ регистр —’, при другом регистре команду примен€ть нельз€.

ü Ќачальное значение дл€ —’ должно быть присвоено до цикла, причем этому регистру надо присваивать ровно столько, сколько раз должен повтор€тьс€ цикл.

ü “ак как команда LOOP ставитс€ в конце цикла, тело цикла хот€ бы раз об€зательно выполнитс€. ѕоэтому дл€ случа€ —’ = 0 така€ схема цикла не подходит. ≈сли возможен вариант, что число повторений может быть и нулевым, то при —’ = 0 надо сделать обход цикла с помощью команды условного перехода JCXZ:

  MOV CX, N ; N>0
  JCXZ L1 ; CX = 0 а L1
L: Е    
  Е    
  Е    
  LOOP L  
L1: Е    

 оманда LOOP реализует только короткий переход, поэтому рассто€ние от нее до начала цикла (метки L) не должно превышать 127-128 байтов (примерно 30-40 команд). ≈сли цикл содержит больше команд, тогда команду LOOP использовать нельз€ и надо реализовывать цикл по-иному.

4.4.2. ÷икл по счетчику и пока равно (пока ноль):

LOOPE <метка> или LOOPZ <метка>

Ёта команда совмещает в себе изменение счетчика цикла (регистра —’) и условный переход (короткий), когда счетчик еще не нулевой и когда предыдуща€ команда выработала флаг нул€, равный 1. ќна используетс€ дл€ организации цикла с известным числом повторений, из которого возможен досрочный выход. ƒо начала цикла в регистр —’ записываетс€ число повторений.

ѕо какой причине произошел выход из цикла (по ZF=0 или —’=0), надо провер€ть после цикла. ѕроверить необходимо флаг ZF (по команде JE/JZ или JNE/JNZ), а не регистр —’, т. к. условие ZF = 0 (Ђне равної) может по€витьс€ как раз на последнем шаге цикла, когда и регистр —’ стал нулевым.

„аще всего команда LOOPE используетс€ дл€ поиска первого элемента некоторой последовательности, отличного от заданной величины.

4.4.3. ÷икл по счетчику и пока не равно:

LOOPNE <метка> или LOOPNZ <метка>

Ёта команда аналогична команде LOOPE/LOOPZ, но выход из цикла осуществл€ет при —’ = 0 или ZF = 1.  оманда LOOPNE обычно используетс€ дл€ поиска в некоторой последовательности первого элемента, имеющего заданную величину.

Examle 4.3. ‘рагмент программы организации цикла, вывод€щий сообщение N раз.

; описание данных

.data

mes1 db СЎаг цикла выполненТ, 10, 13, С$Т

mes2 db С÷икл завершенТ, 10, 13, С$Т

N EQU 5

; фрагмент кода программы

.code;

Е

MOV CX, N; количество итерации равен п€ти

cycl:

MOV DX, OFFSET mes1; вывод сообщени€

MOV AH, 09h;

INT 21h;

LOOP cycl; CX = CX Ц 1, если CX > 0, то переход на метку, иначе к следующей команде.

MOV DX, OFFSET mes2; сообщение, что цикл завершен

MOV AH, 09h;

INT 21h;

MOV AH, 4Ch;

INT 21h;

Е;

Examle 4.4. ‘рагмент программы организации цикла, дл€ поиска числа в массиве.

; описание данных

.data

mes1 db С„исло найденоТ, 10, 13, С$Т

mes2 db С„исло не найденоТ, 10, 13, С$Т

array db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

; фрагмент кода программы

.code;

MAIN:

Е

MOV CX, 10; количество итерации равен п€ти

MOV SI, OFFSET array; инициализаци€ начало массива

MOV BL, 3; искомое число

DEC SI; ƒекремент адреса в регистре SI

cycl:

INC SI; »нкремент адреса в регистре SI, установка на начало массива

CMP [SI], BL

LOOPNE cycl; CX = CX Ц 1, если CX > 0 и ZF = 0, то переход на метку, иначе к следующей команде.

JE ravno

JNE neravno

JMP exit

ravno:

MOV DX, OFFSET mes3;

MOV AH, 09h;

INT 21h

JMP exit;

neravno:

MOV DX, OFFSET mes4;

MOV AH, 09h;

INT 21h

exit:

Examle 4.5. ƒан массив из дес€ти слов, содержащих целые числа. Ќайти максимальное значение элементов массива.

‘рагмент программы.

MAX DW ?  
MASS DW 10h, 20h, 30h, 5h, 40h, 15h, 20h, 70h, 35h, 34h
  Е    
  LEA BX, MASS  
  MOV CX, 10 ; установить счетчик
  MOV AX, [BX] ;первый элемент массива в аккумул€тор
BEG: CMP [BX], AX ;сравнить текущий элемент массива с максимальным
  JL NO ;он меньше
  MOV AX,[BX] ;он больше
NO: ADD BX, 2 ;следующий элемент массива
  LOOP BEG ;
  MOV MAX,AX ;
  Е    
         

Examle 4.6. ѕусть N - байтова€ переменна€ со значением от 0 до 8. ¬ регистр ј’ записать факториал этого числа. (8! = 40320 < 2 16).

ƒл€ решени€ этой задачи надо вначале положить ј’:= 1, а затем N раз выполнить умножение AX:= AX*i, мен€€ i от 1 до 8. ѕри этом следует учитывать, что при N = 0 цикл не должен выполн€тьс€.

  MOV AX,1 ; AX:=0!
  MOV CL, N  
  MOV —Ќ, 0 ; CX:= N как слово (счетчик цикла)
  JCXZ Fl ; при N = 0 обойти цикл
  MOV SI, 1 ; i:= l
F: MUL SI ; (DX, AX):= AX*i (DX = 0) *
  INC SI  
  LOOP F  
F1: Е    

Examle 4.7. «аписать в регистр BL наименьшее число из отрезка [2,  ], на которое не делитс€ число N (  и N - байтовые переменные, 2 <= K < N), или записать 0, если такого числа нет.

ƒл€ решени€ будем последовательно делить N на числа 2, 3,...,   и сравнивать остатки от делени€ с 0 - до тех пор, пока не найдетс€ ненулевой остаток либо не будут исчерпаны все числа отрезка.

  MOV DL, N ; AX:=0!
  MOV DH, 0 ; DX:= N как слово
  MOV CL, K  
  MOV CH, 0  
  DEC CX ; CX:= K-1 (счетчик цикла)
  MOV BL, 1  
DV: INC BL ; очередное число из [2, ]
  MOV AX, DX  
  DIV BL ; AH:=N mod BL
  CMP AH, 0 ; mod = 0?
  LOOPE DV ; цикл —’ раз и пока mod = 0
  JNE DV1 ; mod <> 0 а DV1
  MOV BL, 0 ; нет искомого числа
DVl: Е    





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2015-10-01; ћы поможем в написании ваших работ!; просмотров: 631 | Ќарушение авторских прав


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

Ћучшие изречени€:

„то разум человека может постигнуть и во что он может поверить, того он способен достичь © Ќаполеон ’илл
==> читать все изречени€...

1366 - | 1241 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.011 с.