Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаба 3-6.923.DOC
Скачиваний:
6
Добавлен:
21.02.2016
Размер:
175.1 Кб
Скачать

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

Написання і виконання програми, яка містить розгалуження і цикл

Мета роботи. Вивчити команди мови асемблер, що дозволяють створювати програми, які містять у собі елементи циклу і розгалуження.

1. Порядок виконання роботи

    1. Ознайомитися з основними командами мови асемблер, що дозволяють створювати програми, які містять у собі елементи циклу і розгалуження.

    2. Розробити алгоритм і написати програму відповідно до варіанта.

    3. Провести відладку програми.

    4. Виконати програму.

2. Зміст звіту

2.1. Тема, мета і порядок виконання роботи.

2.2. Короткий опис основних команд мови асемблер, які використовувалися в даній лабораторній роботі.

2.3. Алгоритм розв’язання задачі.

2.4. Листинг програми (написаний від руки або надрукований).

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

2.6. Висновок.

3. Індивідуальні завдання

3.1. Створити програму, яка містить у собі елементи циклу і розгалуження. Варіанти завдань наведені в табл. 3.

Таблиця 3

Варі

ант

Завдання: в масиві з n=10 елементів знайти

Варі

ант

Завдання: в двомірному масиві 4х4 знайти

1

суму всіх додатних чисел

16

найбільше число

2

різницю всіх додатних чисел

17

найменше число

3

найбільше число

18

суму діагональних елементів

4

найменше число

19

суму найменших елементів в рядках

5

номер найменшого додатного числа

20

суму найбільших елементів в стовпцях

6

номер найбільшого додатного числа

21

суму найменших елементів в стовпцях

7

добуток чисел, які більш a=5

22

суму діагональних елементів

8

добуток чисел, які менше a=7

23

суму найбільших елементів в рядках

9

добуток елементів від 3 до 8

24

добуток діагональних елементів

10

добуток найбільшого на найменший

25

відсортувати за зростанням в стовпцях

11

суму елементів від 2 до 7

26

добуток найбільших чисел в рядках

12

ділення найменшого на a=2

27

ділення найбільшого на a=3

13

ділення найменшого на a=2

28

ділення найбільшого на a=3

14

відсортувати за убуванням

29

відсортувати за убуванням в стовпцях

15

відсортувати за зростанням

30

добуток найбільших чисел в стовпцях

4. Короткі теоретичні відомості

Послідовність виконання команд програми процесором визначається вмістом регістрів CS і IP. Регістр CS містить базову адресу поточного сегмента коду, тобто 64-кілобайтної області пам'яті, із якої вибираються команди. Вміст регістра IP використовується як зміщення від початку сегмента коду, а комбінація регістрів CS і IP указує на позицію пам'яті, із якої повинна бути обрана чергова команда. Є чотири групи команд передачі керування: команди безумовної й умовної передачі керування, ітерації і переривання. Тільки остання група впливає на стан “флагів”процесора. Однак, виконання багатьох команд передачі керування залежить від значень“флагів”.

4.1. Безумовний перехід.

Команди цього типу забезпечують безумовний перехід і можуть передавати керування як усередині поточного сегмента коду (внутрішньосегментна передача керування), так і за його межі (міжсегментна передача керування). Тип передачі керування може бути заданий асемблеру ключовим словом, яке задається перед адресою переходу, NEAR (внутрішньосегментна) або FAR (міжсегментна).

CALL ім’я-процедури ВИКЛИК ПРОЦЕДУРИ

Команда CALL активізує зазначену процедуру, зберігаючи в стеку адресу наступної за CALL команди. Асемблер генерує команду CALL різних типів у залежності від того, із яким ключовим словом оголошено ім’я-процедури: NEAR або FAR. Для коректного повернення з процедури тип команди CALL повинен відповідати типу команди RET, що виконує це повернення.

4.1.1. JMP Безумовний перехід

Команда: JMP target .

Умова переходу: перехід здійснюється завжди.

Команда JMP завжди передає керування в місце, обумовлене операндом target. На відміну від команди CALL, JMP не запам'ятовує значення IP, тому що поява команди повернення RET не очікується. Перехід усередині сегмента може бути заданий як операндом типу пам'ять, так і через 16-біт. регістр. Перехід у зовнішній сегмент може бути заданий тільки через операнд типу пам'ять.

Операнди

Приклад

Операнди

Приклад

short_label

JMP ROPE_NEAR

пам’ять-покажчик 16

JMP SAME_SEG

near_label

JMP SAME_SEGMENT

регістр-покажчик 16

JMP BX

far_label

JMP FAR_LABEL

пам’ять-покажчик 32

JMP NEXT_SEG

Якщо асемблер може визначити, що у випадку переходу усередині сегмента мета переходу знаходиться в межах 127 байтів від місця розташування поточної команди, то асемблер автоматично генерує двобайтову команду (короткий перехід); у протилежному випадку генеруєтся трибайтовий NEAR JMP.

4.2. Умовний перехід

Команди умовного переходу організують передачу керування команді, що задається, при виконанні специфічних для кожної команди цього типу умов. Ці умови визначаються поточними станами “флагів” процесора. Якщо умова виконується, відбувається перехід за зазначеною адресою; у протилежному випадку керування передається на наступну команду програми.

4.2.1. JA Перехід, якщо вище

Команда: JA short_label .

Умова переходу: Jump if CF = 0 and ZF = 0 .

Команда JA використовується після команд CMP і SUB і передає керування за міткою short-label, якщо перший операнд (який повинен бути числом без знака) був більшим, ніж другий операнд (також без знаку). Мета переходу повинна лежати в межах від -128 до 127 байтів від наступної команди. Приклад: JA ABOVE .

Команду JA (перехід, якщо вище) варто використовувати при порівнянні чисел без знаку.

4.2.2. JB Перехід, якщо нижче

Команда: JB short_label.

Умова переходу: Jump if CF = 1 .

Команда JB використовується після команд CMP і SUB і передає керування за міткою short-label, якщо перший операнд був меншим, ніж другий. Обидва операнди розглядаються як числа без знаку. Мета переходу повинна лежати в межах від -128 до 127 байтів від наступної команди. Приклад: JB BELOW .

Команду JB (перехід, якщо нижче) варто використовувати при порівнянні чисел без знаку.

4.2.3. JC Перехід, якщо перенос

Команда: JC short_label .

Умова переходу: Jump if CF = 1 .

Команда JC передає керування за міткою short-label, якщо ознака переносу CF встановлена (тобто =1). Мета переходу повинна лежати в межах від -128 до 127 байтів від наступної команди. Приклад: JС CARRY_SET .

4.2.4. JCXZ Перехід, якщо CX = 0

Команда: JCXZ short_label .

Умова переходу: Jump if CX = 0 .

Команда JCXZ передає керування за міткою short-label, якщо регістр CX дорівнює 0. Мета переходу повинна лежати в межах від -128 до 127 байтів від наступної команди. Приклад: JСХZ COUNT_DOWN .

Ця команда звичайно застосовується на початку циклу, щоб пропустити тіло циклу, коли змінна лічильника (CX) дорівнює нулю.

4.2.5. JE Перехід, якщо дорівнює

Команда: JE short_label.

Умова переходу: Jump if ZF = 1 .

Команда JE використовується після команд CMP і SUB і передає керування за міткою short-label, якщо перший операнд дорівнює другому. Мета переходу повинна лежати в межах від -128 до 127 байтів від наступної команди. Приклад: JE ZERO .

4.2.6. JG Перехід, якщо більше

Команда: JG short_label .

Умова переходу: Jump if ZF = 0 and SF = OF .

Команда JG використовується після команд CMP або SUB і передає керування за міткою short-label, якщо перший операнд був більшим, ніж другий. Обидва операнди розглядаються як числа зі знаком. Мета переходу повинна лежати в межах від -128 до 127 байтів від наступної команди. Приклад: JG GREATER .

Команду JG (перехід, якщо більше) варто використовувати при порівнянні чисел із знаком.

4.2.7. JL Перехід, якщо менше

Команда: JL short_label .

Умова переходу: Jump if SF <> OF .

Команда JL використовується після команд CMP або SUB і передає керування за міткою short-label, якщо перший операнд був меншим, ніж другий. (Обидва операнди розглядаються як числа зі знаком.) Мета переходу повинна лежати в межах від -128 до 127 байтів від наступної команди. Приклад: JL LESS .

Команду JL (перехід, якщо менше) варто використовувати при порівнянні чисел із знаком.

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

Команда: JNC short_label .

Умова переходу: Jump if CF = 0 .

Команда JNC передає керування за міткою short-label, якщо ознака переносу CF відкинута (тобто =0). Мета переходу повинна лежати в межах від -128 до 127 байтів від наступної команди. Приклад: JNС CARRY_CLEAR .

4.2.9. JNE Перехід, якщо не дорівнює

Команда: JNE short_label .

Умова переходу: Jump if ZF = 0 .

Команда JNE використовується після команд CMP і SUB і передає керування за міткою short-label, якщо перший операнд не дорівнює другому. Мета переходу повинна лежати в межах від -128 до 127 байтів від наступної команди.

Приклад: JNE NOT_EQUAL .

4.3. Переривання

4.3.1. INT Переривання

Команда: INT interrupt_num .

Логіка : PUSHF ; завантаження регістра FLAGS у стек

TF = 0 ; відкидання розряду трасування

IF = 0 ; заборона переривання

CALL FAR (INT*4) ; виклик оброблювача переривань.

Команда INT завантажує регістр FLAGS у стек, відкидає ознаки трасування і дозволи переривання, завантажує CS і IP у стек, потім передає керування оброблювачу переривань, який визначається за значенням операнда interrupt-num. Якщо оброблювач переривань робить повернення по команді IRET, то початкове значення регістра FLAGS відновлюється.

Операнди

Приклад

Операнди

Приклад

безпосер.8 (тип=3)

INT 3

безпосер.8 (тип<>3)

INT 21

Регістр FLAGS зберігається в тому ж форматі, що використовується в команді PUSHF. Адреса вектора переривання визначається множенням операнда interrupt-num на 4. Перше слово, що знаходиться за отриманою адресою, завантажується в IP, а друге слово - у CS. Усі номери interrupt-num, крім типу 3, виробляють двобайтовий код операції; interrupt-num, який дорівнює 3, виробляє однобайтову команду, яка називається перериванням за контрольною точкою (Breakpoint interrupt).

4.3.2. IRET Повернення після обробки переривання

Команда: IRET .

Логіка : POP IP

POP CS

POPF ; пересилання слова зі стека в регістр FLAGS .

Команда IRET передає керування з підпрограми обробки переривань у місце виникнення переривання, відновлюючи зі стека значення регістрів IP, CS і FLAGS. Немає операндів. Приклад: IRET .

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]