Команды передачи управления
По принципу действия, команды микропроцессора, обеспечивающие организацию переходов в программе, можно разделить на три группы: 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 ноль.
Условные переходы по содержимому флагов
Пример 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 не изменять (то есть результат не запоминать).
Условные переходы после команд сравнения
Пример 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
Популярное: Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ... Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... Почему стероиды повышают давление?: Основных причин три... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (216)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |