Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод вказів лаборат роб Опер сист.doc
Скачиваний:
11
Добавлен:
08.02.2016
Размер:
1.41 Mб
Скачать
    1. Лабораторна робота n5. Організація циклічних процесів

Мета роботи: ознайомитися з механізмом організації циклічних процесів і командами Ассемблера, які використовуються для цієї мети.

КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ

При створенні Вашої програми може виникнути необходимость повторити деяку послідовність команд задана кількість разів. Такий процес називається ЦИКЛІЧНИМ процессом.

Для організації циклічних процесів в Ассемблере существует команда LOOP. Крім того, цикли можна створювати, використовуючи команди умовних переходів. У лабораторній роботі N6 при описі команди JMP був наведений приклад нескінченного циклічного процесу. Реально нескінченні цикли не искористаються. При використанні команди LOOP кількість циклів (кількість повторень ділянки Вашої програми) задається в регістрі CX. У кожнім циклі команда LOOP автоматично зменшує вміст CX на 1. Поки значення CX не дорівнює нулю, керування передається за адресою, зазначеному в операнде команди LOOP. Коли CX стане рівним нулю, керування передається на наступну за LOOP команду.

Приклад 1.

1 0000 CODESG SEGMENT PARA 'Code'

2 ASSUME CS:CODESG,SS:CODESG,DS:CODESG

3 ORG 100H

4 0100 BEGІ PROC NEAR

5 0100 B8 0001 MOV AX, 1

6 0103 BB 0001 MOV BX, 1

7 0106 B9 000A MOV CX, 10

8 0109 A20:

9 0109 40 ІNC AX ; AX+1

10 010A 03 D8 ADD BX, AX

11 010C E2 FB LOOP A20

12 010E C3 RET

13 010F BEGІ ENDP

14 010F CODESG ENDS

15 END BEGІ

Програма, приведена в прикладі, виконує ділянка програми, що знаходиться між міткою A20 і командою LOOP 10 разів (число 10 задане ДО початку першого циклу в регістрі CX).

Відстань від команди LOOP до мітки, заданої в качестве її опреанда, не повинно перевищувати -128 - +127 байт (періхід типу SHORT).

Додатково існують два різновиди команди LOOP - LOOPE(LOOPZ) і LOPNE(LOOPNZ). Обидві команди також зменшують значення CX на 1. Команда LOOPE (LOOPZ) передає керування за адресою операнда, якщо регістр має ненульове значення і прапор нуля встановлений (ZF=1). Команда LOONP(LOOPNZ) передає керування за адресою операнда, якщо регістр CX має ненульові значення і прапор нуля скинутий (ZF=0).

У прикладі 2 показано як організувати циклічний процесс за допомогою команди умовного переходу.

Приклад 2.

1 0000 CODESG SEGMENT PARA 'Code'

2 ASSUME CS:CODESG,SS:CODESG,DS:CODESG

3 ORG 100H

4 0100 BEGІ PROC NEAR

5 0100 B8 0001 MOV AX, 1

6 0103 BB 0001 MOV BX, 1

7 0106 BA 000A MOV DX, 10

8 0109 A20:

9 0109 40 ІNC AX

10 010A 03 D8 ADD BX, AX

11 010C 4A DEC DX ; AX - 1

12 010D 75 FA JNZ A20

13 010F C3 RET

14 0110 BEGІ ENDP

15 0110 CODESG ENDS

16 END BEGІ

Для реалізації завдання N 4 Вам необхідно навчитися множити і поділяти константу на ступінь числа 2. Виконувати такие операції дометано за допомогою команд зсув.

ЗСУВ І ЦИКЛІЧНИЙ ЗСУВ РОЗРЯДІВ

Ассемблер має команди для зсув і циклічного зсув розрядів у чи байті слові. Розряди можуть зрушуватися вправо (убік молодших розрядів) чи влво (убік старших разрядів). Значення висунутого за кінець операнда розряду попадає в прапор переносу.

Команди зсув і циклічного зсув розпадаються на двох груп. Логічні команди зрушують операнд, не зважаючи на його знак; вони використовуються для дій над числами без знака чи над нечисловими значеннями. Арифметичні команди зберігають старший знаковий біт операнда, вони використовуються для дій над числами зі знаком.

На наступному малюнку показана дія 8 команд зсув і циклічного зсув для 8-розрядних операндов.

SHL (логічне беззнакове зсув вліво)

7 0

-і-і-і -і-і-і-і-і-і-і-і-і-і-і-і-

| CF |<-і-|<-|<-|<-|<-|<-|<-|<-|<-|- 0

-і-і-і -і-і-і-і-і-і-і-і-і-і-і-і-

SHR (логічне беззнакове зсув вправо)

7 0

-і-і-і-і-і-і-і-і-і-і-і-і- -і-і-і

0 -і->|->|->|->|->|->|->|->|->|--і>| CF |

-і-і-і-і-і-і-і-і-і-і-і-і- -і-і-і

SAL (арифметичне зсув вліво)

7 0

-і-і-і -і-і-і-і-і-і-і-і-і-і-і-і-

| CF |<-і-|<-|<-|<-|<-|<-|<-|<-|<-|- 0

-і-і-і -і-і-і-і-і-і-і-і-і-і-і-і-

SAR (арифметичне зсув вправо)

7 0

-і-і-і-і-і-і-і-і-і-і-і-і- -і-і-і

-і->|->|->|->|->|->|->|->|->|--і>| CF |

| -і-і-і-і-і-і-і-і-і-і-і-і- -і-і-і

| |

-і-і-і

ROL (циклічне зсув вліво)

-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-

| 7 0 |

-і-і-і | -і-і-і-і-і-і-і-і-і-і-і-і- |

| CF |<-і-|<-|<-|<-|<-|<-|<-|<-|<-|<-і|

-і-і-і -і-і-і-і-і-і-і-і-і-і-і-і-

ROR (циклічне зсув вправо)

-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-

| 7 0 |

| -і-і-і-і-і-і-і-і-і-і-і-і- | -і-і-і

-і->|->|->|->|->|->|->|->|->|--і>| CF |

-і-і-і-і-і-і-і-і-і-і-і-і- -і-і-і

RCL (циклічне зсув вліво через прапор CF чи з переносом)

7 0

-і-і-і -і-і-і-і-і-і-і-і-і-і-і-і-

| CF |<-і-|<-|<-|<-|<-|<-|<-|<-|<-|<-і-

-і-і-і -і-і-і-і-і-і-і-і-і-і-і-і- |

| |

-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-

RCR (циклічне зсув вправо через прапор CF чи з переносом)

7 0

-і-і-і-і-і-і-і-і-і-і-і-і- -і-і-і

-і->|->|->|->|->|->|->|->|->|--і>| CF |

| -і-і-і-і-і-і-і-і-і-і-і-і- -і-і-і

| |

-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-і-

Команди SHL і SHR абсолютно однакові.

В операнде-приемнике команд зсув знаходиться значення, підмет зрушенню. Після виконання команди в ньому ж буде знаходитися результат. В операнде-источнике повинне знаходитися число, на яке потрібно зрушити розряди. Дане число може бути задане як безпосереднє значення "1" чи як содержимое регістра CL.

Команда SAR зберігає знак операнда, репродукуючи його при виконанні зсув. Команда SAL не зберігає знак, але заносить "1" у прапор переповнення OF у випадку зміни знака операнда.

Нехай AL містить 0B4h, а CF=1, AL=1011 0100b

SAL AL,1 ; AL=0110 1000 CF=1

SAR AL,1 ; AL=1101 1010 CF=0

SHL AL,1 ; AL=0110 1000 CF=1

SHR AL,1 ; AL=0101 1010 CF=0

ROL AL,1 ; AL=0110 1001 CF=1

ROR AL,1 ; AL=0101 1010 CF=0

RCL AL,1 ; AL=0110 1001 CF=1

RCR AL,1 ; AL=1101 1010 CF=0

Зсув вправо на 1 еквівалентний розподілу на 2, зсув вправо на 1 - множенню на 2. Дана особливість може бути использована для множення і розподілу на часто зустрічаються константи, наприклад, на 2**n. При подвійному зрушенні вліво происходить множення на 4, при потрійному - на 8 і т.д.

SHR використовується для розподілу беззнакових чисел, SAR -для знакових. Множення за допомогою зсув є однаковим для знакових і беззнакових чисел, тому можна використовувати як SAL, так і SHL.

MOV CL,2

SHL AX,CL ;помножити число без знака на 4

SAL AX,CL ;помножити число зі знаком на 4

SHR AX,CL ;розділити число без знака на 4

SAR AX,CL ;розділити число зі знаком на 4

Кожна з цих команд з урахуванням завантаження CL виконується в 6-8 разів швидше відповідної команди чи множення розподіли.

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

Наприклад:

SHL AX,1 ;32-розрядне число в регістрах AX і DX

RCL DX,1 ;множимо на 2

ПІДГОТОВКА ДО РОБОТИ

1. Вивчити короткі теоретичні відомості і рекомендованну літературу.

2. Написати текст програми, що відповідає вашому варіанту завдання.

РОБОЧЕ ЗАВДАННЯ

Набити підготовлену програму, странслировать її, відладити.

ВИМОГА ДО ЗВІТУ

У звіті зафіксувати листинг файлу з налагодженої программой.

КОНТРОЛЬНІ ПИТАННЯ

1. Який тип переходу допускає команда LOOP.

2. Як можна організувати вкладені цикли.

3. При використанні для організації циклів команд умовного переходу де буде знаходитися лічильник циклів умовного переходу, де буде знаходитися лічильник циклів.

ВАРІАНТИ ЗАВДАНЬ

Обчислити наступні вирази.

Обчислення пpоводити з пеpевіpкою пеpеповнення pозpядної сітки.