Дослідження роботи команд переходів. Програмування задач з використанням алгоритмів розгалуження

Автор: Пользователь скрыл имя, 28 Мая 2013 в 14:23, лабораторная работа

Описание работы

Мета роботи: Освоїти використання команд порівняння, умовного та безумовного переходів. Набути вміння використовувати арифметичні команди над знаковими даними та команди логічних операцій.
Дана команда додає значення вказане в операнді до значення в регістрі IP, який містить адресу команди, що розташована після JMP. Відповідно, якщо здійснюється перехід назад, то значення операнду буде від’ємне, якщо вперед – додатне.

Работа содержит 1 файл

Лабораторна робота №5.docx

— 124.22 Кб (Скачать)

Міністерство освіти і  науки України

Національний університет  “Львівська політехніка”

Кафедра «Електронні обчислювальні  машини»


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

“Дослідження роботи команд переходів. Програмування задач з використанням алгоритмів розгалуження.”

з дисципліни:

“ Засоби системного програмування”

 

 

 

 

 

 

 

 

 

Виконав:

студент групи КІ-25

Газдаг Р.О.

 

Прийняв:

Грица Р.В

 

 

 

 

 

 

Львів - 2013

Мета  роботи:

Освоїти використання команд порівняння, умовного та безумовного  переходів. Набути вміння використовувати  арифметичні команди над знаковими  даними та команди логічних операцій.

 

Теоретичні  відомості:

 

Команди керування  програмою.

Команда безумовного  переходу JMP.

Дана команда додає  значення вказане в операнді до значення в регістрі IP, який містить адресу команди, що розташована після JMP. Відповідно, якщо здійснюється перехід назад, то значення операнду буде від’ємне, якщо вперед – додатне.

Команди умовних  переходів.

Працюють аналогічно до JMP та LOOP, за винятком того, що довжина  переходу повинна бути в межах  від -128 до +128 байт.

Переходи для беззнакових даних.

Мнемоніка

Опис

Прапорці, що перевіряються

JE/JZ

Перехід, якщо рівно/нуль

ZF

JNE/JNZ

Перехід, якщо не рівно/не нуль

ZF

JA/JNBE

Перехід, якщо вище/не нижче або  рівно

ZF,CF

JAE/JNB

Перехід, якщо вище або рівно/ не нижче

CF

JB/JNAE

Перехід, якщо нижче/не вище або рівно

CF

JBE/JNA

Перехід, якщо нижче або рівно/не вище

CF,AF


Будь яку перевірку  можна закодувати двома мнемо  кодами. Наприклад JB та JNAE генерують  однаковий об’єктний код, хоча позитивну  перевірку JB легше зрозуміти аніж заперечну JNAE.

 

Переходи для знакових даних.

Мнемоніка

Опис

Прапорці, що перевіряються

JE/JZ

Перехід, якщо рівно/нуль

ZF

JNE/JNZ

Перехід, якщо не рівно/не нуль

ZF

JG/JNLE

Перехід, якщо більше/не менше або  рівно

ZF,SF,OF

JGE/JNL

Перехід, якщо більше або рівно/ не менше

SF,OF

JL/JNE

Перехід, якщо менше/не більше або  рівно

SF,OF

JLE/JNG

Перехід, якщо менше або рівно/не більше

ZF,SF,OF


Команди переходу для умови  рівно або нуль (JE/JZ) та не рівно  або не нуль (JNE/JNZ) існують як для  знакових так і для без знакових даних. Стан рівно/нуль наступає незалежно  від знаку.

 

Спеціальні арифметичні перевірки.

Мнемоніка

Опис

Прапорці, що перевіряються

JS

Перехід, якщо є знак(від’ємне)

SF

JNS

Перехід, якщо немає знаку(додатнє)

SF

JC

Перехід, якщо є перенос (аналогічно JB)

CF

JNC

Перехід, якщо немає переносу

CF

JO

Перехід, якщо є переповнення

OF

JNO

Перехід, якщо немає переповнення

OF

JP/JPE

Перехід, якщо паритет парний

PF

JNP/JP

Перехід, якщо паритет непарний

PF


 

JCXZ - ще одна команда умовного переходу перевіряє чи рівний вміст регістра CX нулю. Ця команда повинна знаходитися безпосередньо після арифметичної команди чи команди порівняння. Одним з можливих місць застосування команди JCXZ може бути початок циклу, де вона перевіряє чи не містить регістр CX нульового значення.

Оператор  циклу LOOP.

Передає керування на мітку, вказану як операнд, поки значення в  регістрі CX не стане рівне нулю.

mov  cx, 5

Lab:

mov  ax, bx

inc ax

loop Lab

тобто оператори (mov  ax, bx) та (inc ax) повторяться 5 разів.

Існують додатково також  різновиди цієї команди:

        1. LOOPE(або LOOPZ) – передає керування за адресою, вказаною в операнді якщо CX містить нульове значення і встановлений прапорець нуля, тобто ZF=1.
        2. LOOPNE(або LOOPNZ) передає керування за адресою, вказаною в операнді якщо CX містить нульове значення і прапорець нуля скинуто, тобто ZF=0.

 

Команди порівняння

CMP - Порівняння двох полів даних.

Команда виконує віднімання другого  операнду від першого, але значення операндів не змінює. Операнди повинні  бути однакової довжини: байт або  слово. Команда може мати наступний  формат: 

CMP регістр-регістр;

CMP пам'ять-регістр;

CMP безпосереднє значення -регістр;

CMP регістр-пам’ять;

CMP безпосереднє значення –пам’ять

Ця команда впливає на прапорці AF,CF,OF, PF,SF,ZF

 

CMPS, CMPSB, CMPSW Порівняння рядків довільної довжини. CMPSB – порівнює по байту, CMPSW – порівнює по словах. Перший операнд цих команд адресується регістровою парою DS:SI, а другий – ES:DI. Якщо прапорець DF=0, то порівняння відбувається зліва направо і регістри SI та DI збільшуються після кожного порівняння, інакше – навпаки і регістри SI та DI  зменшуються. Як правило, використовуються з префіксами повтору. Впливають на прапорці  AF,CF,OF,PF,SF,ZF.

 

Логічні команди

Логічні команди відіграють важливу  роль в організації програм і  використовуються для скиду і  встановлення біт та для арифметичних операцій. Всі вони обробляють один байти або одне слово в регістрі чи в пам’яті і встановлюють прапорці  CF, OF, PF, SF, ZF

Перший операнд в логічних командах вказує на один байт чи слово в регістрі чи пам’яті і є єдиним значенням, яке може змінюватися після виконання  команд..

AND  Логічне «І».Порозрядна кон’юнкція бітів операндів. Якщо відповідні біти операндів рівні 1, то у першому(лівому) операнді встановлюється біт=1, в інших випадках результат =0.

OR логічне «АБО». Порозрядна диз’юнкція бітів операндів. Якщо хоча б один з порівнюваних бітів рівний 1, то результат рівний 1, якщо порівнювані біти рівні 0, то результат - 0 .

XOR логічне «виключне АБО». Якщо один з порівнюваних бітів рівний 0, а інший 1, то результат рівний 1, якщо порівнювані біти однакові, то результат -0.

NOT логічне «НЕ». Порозрядна інверсія бітів операнду. Встановлює протилежне значення бітів у байті чи слові в регісті чи в пам’яті. Прапорці при цьому не змінюються.

TEST – Логічне «І» - встановлюються прапорці, проте біти не змінюються.

 

Приклади використання.

Нехай AL=1100 0101b; BH=0101 1100b.

1.     AND  AL,BH    ; Встановлює  в AL 0100 0100

2.     OR   BH,AL      ; Встановлює в BH 1101 1101

3.     XOR  AL,AL     ; Встановлює  в AL 0000 0000

4.     AND  AL,00      ; Встановлює в AL 0000 0000

5.     AND  AL,0FH   ; Встановлює  в AL 0000 0101

6.     OR   CL,CL       ; Встановлює прапорці SF и ZF

В прикладах 3 та 4 демонструється спосіб очистки регістру. В прикладі 5 встановлюються в нуль  ліві чотири біти регістру AL.

Приклад використання команди TEST.

1.     TEST BL,11110000B     ; будь який з лівих бітів  в BL

          JNZ  ...                          ; рівний одиниці ?

2.     TEST AL,00000001B    ; регістр  AL містить

         JNZ  ...                           ; непарне значення?

3.     TEST DX,OFFH            ; регістр  DX містить

         JZ   ...                            ; нульове значення?

 

 

 

 

Завдання:

 

  1. Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу.

Вхідні дані слід вважати цілими числами зі знаком, розміром один байт.

Результат обчислення виразу повинен  записуватися у пам’ять.

Уникнути випадку некоректних  обчислень при діленні на нуль та при переповненні розрядної сітки (вивести відповідне текстове повідомлення).

  1. За допомогою Debug, відслідкувати правильність виконання програми (продемонструвати результати проміжних та кінцевих обчислень) та проаналізувати отримані результати для різних вхідних даних.
  2. Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї.
  3. Дати відповідь на контрольні запитання.

 

А, В - знакові  операнди, розміром один байт.

 

4


 

Код програми:

 

DOSSEG

.MODEL SMALL

.STACK 100h

.DATA

A db -25

B db 5

X dw 0

 

Task db 13,10,'  X=3*a/b+10    if a<b',13,10,'  X=-51      if a==b',13,10,'  X=(b-4)/a  if a>b',13,10,'$'

A_B    db 13,10, '   a==b  ====>   X=-51',13,10,'$'

Error_A db 13,10,'  a>b and a==0 ---->  divide by zero',13,10,'$'

Error_B db 13,10,'  a<b and b==0 ---->  divide by zero',13,10,'$'

 

.CODE

start:

mov ax,@data

mov ds,ax

mov ah,09

mov dx,offset Task

int 21h

 

mov al,A

cmp al,B

jne A_n_B

mov X,-51

mov ah,09

mov dx,offset A_B

int 21h

jmp exit

 

A_n_b:  jg A_g_B

cmp B,0

je exit_B

mov al,3

      imul A

      idiv B

add al,10

      cbw

mov X,ax

jmp exit

 

exit_B: mov ah,09

mov dx,offset Error_B

int 21h

jmp exit

 

A_g_B:  cmp A,0

je exit_A

mov al,B 

sub al,4

      cbw

idiv A

cbw

mov X,ax

jmp exit

 

exit_A: mov ah,09

mov dx,offset Error_A

int 21h

 

exit: mov ah,4Ch

int 21h

 

end start

end

 

 

 

 

 

 

 

 

 

 

Результати  виконання програми:

 

А = 0  B = -20

 

A = -5   B = 0

 

A = B = -20

 

A = -25   B = 5

 

 

 

 

A = 20   B = -36

 

 

Висновок:

У цій лабораторній роботі я освоїв використання команд порівняння, умовного та безумовного переходів. Набув вміння використовувати арифметичні команди над знаковими даними та команди логічних операцій.


Информация о работе Дослідження роботи команд переходів. Програмування задач з використанням алгоритмів розгалуження