Архитектура компьютера

Введение
Теоретическая часть
    1 Архитектура компьютера
     
Лабораторный практикум
  1 Создание программы на языке ассемблера
  2 Применение функций DOS и BIOS
  3 Линейные алгоритмы
  4 Десятичная арифметика
  5 Команды передачи управления
  6 Циклы с условием
  7 Циклы со счетчиком
  8 Работа с массивами
  9 Цепочечные команды
     
Приложения
  1 Таблица кодов символов ASCII
  2 Функции DOS и BIOS
     
Гостевая книга

Лабораторная работа №5

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

Вопросы для повторения:

  1. Какие операторы используются в языках высокого уровня на нелинейных участках программы?
  2. Что такое регистр флагов, флаги и для чего они используются?
  3. Запишите оператор выбора (case) в виде последовательности условных конструкций языка высокого уровня.

Для организации безусловного перехода используется команда jmp <метка> (от слова jump - прыжок)

m1: jmp m1 ;безусловный переход на метку m1
mov dl, '$' ;данная команда не будет выполнена
mov dh, 100 ;

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

Jxx <метка>, где xx определяется условием перехода.

В качестве источника условия может использоваться регистр cx, любая арифметическая или логическая команда или специальная команда сравнения cmp:

Команда сравнения cmp <оп1>,<оп2> работает почти также как и команда вычитания sub, разница состоит лишь в том, что команда cmp не записывает результат вычитания в первый операнд, результатом выполнения данной команды является установка флагов состояния (команды условного перехода анализируют эти флаги).

Таблица 1. Перечень команд условного перехода для команды cmp <операнд_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 

Таблица 2. Команды перехода по состоянию флагов

Команда Флаг Команда Флаг
jc
cf = 1
jnc
cf = 0
jp
pf = 1
jnp
pf = 0
jz 
zf = 1 
jnz 
zf = 0 
js 
sf = 1 
jns 
sf = 0 
jo 
jo = 1 
jno 
jo = 0 

Команда перехода по состоянию регистра cx:

jcxz <метка> ;прейти, если cx = 0

Пример: С клавиатуры вводятся два символа, вывести на экран сообщение 'одинаковые', если введены два одинаковых символа, иначе вывести 'разные'.

1     data segment ;
2           mes_e db 10, 13, 'Одинаковые$'  
3           mes_ne db 10, 13, 'Разные$'  
4   data ends  
5        
6   code segment  
7   start:  
8     assume cs:code, ds: data      
9     mov ax, data  
10     mov ds, ax  
11        
12     mov ah, 01 ;вводим первый символ и запоминаем его в bl
13     int 21h  
14     mov bl, al  
15        
16     int 21h ;вводим второй символ
17        
18     mov ah, 09  
19     lea dx, mes_ne ;пусть символы неравны
20     cmp bl, al ;сравниваем их
21     jne m_ne ;если они неравны, переходим на вывод сообщения
22     lea dx, mes_e ;иначе загружаем адрес другой строки
23   m_ne:  int 21h ;и выводим
24        
25     mov ax, 4c00h  
26     int 21h  
27   code ends  
28   end start  

 

Задания для выполнения

  1. Определить, ввел ли пользователь букву 'Y' или любую другую.
  2. Вывести два введенных с клавиатуры числа в порядке возрастания. (3 балла)
  3. Вывести максимальное из трёх введенных с клавиатуры чисел. (5 баллов)

Задания для самостоятельного выполнения

  1. С клавиатуры вводятся два числа задающие отрезок [a, b]. Определить, попадает ли третье число c в заданный отрезок. (8 баллов)
  2. Написать программу, которая по введенному номеру месяца выводит время года (15 баллов);

 

© Истомин А.С. ЗабГГПУ
Хостинг от uCoz