Мегаобучалка Главная | О нас | Обратная связь


Команды передачи управления



2019-12-29 212 Обсуждений (0)
Команды передачи управления 0.00 из 5.00 0 оценок




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

1. Команды безусловной передачи управления:

- команда безусловного перехода; jmp

- вызова процедуры и возврата из процедуры; call, ret

- вызова программных прерываний и возврата из программных прерываний. Int, iret

2. Команды условной передачи управления:

- команды перехода по результату команды сравнения cmp;

- команды перехода по состоянию определенного флага;

- команды перехода по содержимому регистра ecx/cx.

3. Команды управления циклом:

- команда организации цикла со счетчиком ecx/cx;

- команда организации цикла со счетчиком ecx/cx с возможностью досрочного выхода из цикла по дополнительному условию.

jmp адрес_перехода - безусловный переход без сохранения информации о точке возврата. Аналог goto.

 

Условные переходы

Команды условного перехода имеют одинаковый синтаксис:

jcc метка_перехода

Мнемокод всех команд начинается с “j” — от слова jump (прыжок), cc — определяет конкретное условие, анализируемое командой. Что касается операнда метка_перехода, то эта метка может находится только в пределах текущего сегмента кода, межсегментная передача управления в условных переходах не допускается.

Для того чтобы принять решение о том, куда будет передано управление командой условного перехода, предварительно должно быть сформировано условие, на основании которого и будет приниматься решение о передаче управления. Источниками такого условия могут быть:

- любая команда, изменяющая состояние арифметических флагов;

- команда сравнения cmp, сравнивающая значения двух операндов;

- состояние регистра ecx/cx.

 

jcxz метка_перехода (Jump if cx is Zero) — переход, если cx ноль;

jecxz метка_перехода (Jump Equal ecx Zero) — переход, если ecx ноль.

 

Условные переходы по содержимому флагов

Название флага Номер бита в eflags/flag Команда условного перехода Значение флага для осуществления перехода
Флаг переноса cf 1 jc cf = 1
Флаг четности pf 2 jp pf = 1
Флаг нуля zf 6 jz zf = 1
Флаг знака sf 7 js sf = 1
Флаг переполнения of 11 jo of = 1
Флаг переноса cf 1 jnc cf = 0
Флаг четности pf 2 jnp pf = 0
Флаг нуля zf 6 jnz zf = 0
Флаг знака sf 7 jns sf = 0
Флаг переполнения of 11 jno of = 0

 

Пример 9. Определите, равны ли два числа вводимые пользователем с клавиатуры. Определить равенство чисел можно используя вычитание, если разность исследуемых чисел равна 0, то они равны.

Model    small

Stack    100h

Data

s1 db 'числа равны$'

s2 db 'числа не равны$'

.code

start:

mov ax,@data

mov ds,ax

mov ah,01h

int 21h ;ввели первое число

mov dl,al ;посылаем в dl первое число

int 21h ;ввели второе число

sub al,dl ;сравнили числа

jnz m1 ;если получили не 0 результат, то на метку m1

mov dx, offset s1 ;иначе выводим строку s1, о том что числа равны.

jmp m2

m1: mov dx, offset s2    ;числа не равны, выводим строку s2

m2: mov ah,09h

int 21h ;вывод информационную строку

Mov ax,4c00h

Int 21h

End start

 

Команда сравнения cmp

cmp операнд_1,операнд_2 - сравнивает два операнда и по результатам сравнения устанавливает флаги. Команда сравнения cmp имеет интересный принцип работы. Он абсолютно такой же, как и у команды вычитания sub. Единственное, чего она не делает — это запись результата вычитания на место первого операнда.

Алгоритм работы:

-выполнить вычитание (операнд1-операнд2);

-в зависимости от результата установить флаги, операнд1 и операнд2 не изменять (то есть результат не запоминать).

 

Условные переходы после команд сравнения

Типы операндов Мнемокод команды условного перехода Критерий условного перехода Значения флагов для осществления перехода
Любые je операнд_1 = операнд_2 zf = 1
Любые jne операнд_1<>операнд_2 zf = 0
Со знаком jl/jnge операнд_1 < операнд_2 sf <> of
Со знаком jle/jng операнд_1 <= операнд_2 sf <> of or zf = 1
Со знаком jg/jnle операнд_1 > операнд_2 sf = of and zf = 0
Со знаком jge/jnl операнд_1 => операнд_2 sf = of
Без знака jb/jnae операнд_1 < операнд_2 cf = 1
Без знака jbe/jna операнд_1 <= операнд_2 cf = 1 or zf=1
Без знака ja/jnbe операнд_1 > операнд_2 cf = 0 and zf = 0
Без знака jae/jnb операнд_1 => операнд_2 cf = 0

 

Пример 10. Определите, равны ли два числа вводимые пользователем с клавиатуры.

Model    small

Stack    100h

Data

s1 db 'числа равны$'

s2 db 'числа не равны$'

.code

start:

mov ax,@data

mov ds,ax

mov ah,01h

int 21h ;ввели первое число

mov dl,al

mov ah,01h

int 21h ;ввели второе число

cmp al,dl ;сравнили числа

jne m1

mov dx, offset s1

jmp m2

m1: mov dx, offset s2

m2: mov ah,09h

int 21h ;вывод информационную строку

Mov ax,4c00h

Int 21h

end start

 

Пример 11. Даны три числа, найти среди них максимальное.

Model    small

Stack    100h

Data

s1 db 'максимальное число',10,13,'$'

x1 db 34

x2 db 56

x3 db 45

.code

start:

mov ax,@data

mov ds,ax

mov dx, offset s1

mov ah,09h

int 21h ;вывод информационную строку

;находим максимальное число

mov dl,x1 ;dl:=x1

cmp dl,x2 ;сравниваем х1 и х2

ja  m1 ;если х1>х2, то на m1

mov dl,x2 ;иначе dl:=x2

m1: cmp dl,x3 ;сравниваем dl и х2

ja  m2 ;если dl>х3 то на m2

mov dl,x3

;в dl находится самый максимальный элемент

m2: mov ah,02h       

int 21h ;выводим максимальный элемент

Mov ax,4c00h

Int 21h

End start

Организация циклов

loop метка_перехода (Loop) — повторить цикл

Работа команды заключается в выполнении следующих действий:

- декремента регистра ecx/cx;

- сравнения регистра ecx/cx с нулем:

- если (ecx/cx) > 0, то управление передается на метку перехода;

- если (ecx/cx) = 0, то управление передается на следующую после loop команду

Организация цикла:

mov cx, количество циклов

м1: тело цикла

 loop m1

loope/loopz метка_перехода (Loop till cx <> 0 or Zero Flag = 0) — повторить цикл, пока cx <> 0 или zf = 0.

loopne/loopnz метка_перехода (Loop till cx <> 0 or Not Zero flag=0) — повторить цикл пока cx <> 0 или zf = 1

Недостаток команд организации цикла loop, loope/loopz и loopne/loopnz в том, что они реализуют только короткие переходы (от –128 до +127 байт).

Организация вложенных циклов:

mov cх,n ; в сх заносим количество итераций внешнего цикла

m1:

push cx

mov cx,n1; в сх заносим количество итераций внутреннего цикла

                       m2:

тело внутреннего цикла

                       loop m2

                  …

                  pop cx

                       loop m1

Пример 12. Напишите программу подсчета у=1+2+3+…+n, n не более 10000.

 

model    small

.stack 100h

.data

yb dd ?

ym dw ?

s1 db 'введите n',10,13,'$'

.code

start:

mov ax,@data

mov ds,ax

mov dx, offset s1

mov ah,09h

int 21h

 

mov cx,3

m: shl bx,4

mov ah,01h

int 21h            вводим n в регистр bx

 sub ax,130h

add bx,ax

loop m

 

mov cx,bx

xor dx,dx

xor al,al

m1: add dx,cx     считаем у

jnc m2

mov al,1

m2: loop m1

 

cmp al,1

je  m3

mov ym,dx

m3: mov yb,edx

mov ax,4c00h

int 21h

End start

 



2019-12-29 212 Обсуждений (0)
Команды передачи управления 0.00 из 5.00 0 оценок









Обсуждение в статье: Команды передачи управления

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (212)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)