Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

M_Asm2009LS

.pdf
Скачиваний:
12
Добавлен:
23.02.2016
Размер:
2.34 Mб
Скачать

10) кожне входження слова "get" на слово "foot".

61

Лабораторна робота № 5 Логічні команди та команди зсувів

Мета: вивчення логічних команд та команд зсувів. Розв’язування задач обробки бітової інформації.

План заняття .

1.Логічні операції та операції зсувів.

2.Команди логічних операцій (AND, OR, XOR, TEST, NOT).

3.Команди логічних та арифметичних зсувів.

4.Циклічні зсуви.

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

1. Логічні операції та операції зсувів

Крім арифметичних операцій обробки цілих чисел, процесори типу Intel мають потужний набір логічних операцій та операцій зсувів для обробки даних. Важливість вміння працювати з логічними операціями та операціями зсувів продиктовано такими напрямками сучасних комп’ютерних технологій: комп’ютерна графіка, криптографія та ін.

 

 

 

 

 

 

 

 

Таблиця 1.

кон’юнкція(AND) : a AND b

диз’юнкція (OR):

a OR b

a

b false(0)

true(1)

a

b

false(0)

true(1)

false(0)

 

false(0)

false(0)

false(0)

 

false(0)

true(1)

true(1)

 

false(0)

true(1)

true(1)

 

true(1)

true(1)

Виняткове або (XOR) : a XOR b

заперечення (інверсія, NOT)

a

b

false(0)

true(1)

a

 

NOT a

 

false(0)

 

false(0)

true(1)

false(0)

 

true(1)

 

true(1)

 

true(1)

false(0)

true(1)

 

false(0)

 

Теоретичною основою логічних операцій є булева алгебра. Основними операціями булевої алгебри є: NOT – заперечення (інверсія), AND – кон’юнкція (логічне множення, і), OR – диз’юнкція (логічне додавання, або) та XOR – виняткове або (додавання за модулем 2). Значення вказаних операцій булевої алгебри наведені в таблиці 1.

2. Команди логічних операцій (AND, TEST, OR, XOR, NOT).

Команди AND, TEST, OR, XOR та NOT є логічними командами мови асемблера. Логічні команди використовуються для встановлення

62

значень певних бітів, виділення бітів, для роботи з прапорцями, в програмах символьної обробки даних тощо. Логічні команди мови асемблера є порозрядними (побітовими) операціями.

Команда логічного множення – AND

Загальний вигляд команди

AND dst,src; dst=(dst) and (src).

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

Алгоритм роботи:

виконати операцію логічного множення над бітами операндів, при цьому кожен біт результату дорівнює 1, якщо відповідні біти операндів дорівнюють 1, в інших випадках біт результату дорівнює 0;

записати результат операції в dst, операнд src без зміни;

за результатом в dst змінити значення прапорців sf, zf, pf і встановити of=0, cf=0.

Типове використання команди – виділити певні біти першого операнда. Для цього відповідні біти другого операнда повинні дорівнювати одиниці.

Команда TEST виконує логічне множення, як і команда AND, не змінює значень операндів, за результатом в dst змінює прапорці sf, zf, pf і встановлює of=0, cf=0.

Команда логічного додавання – OR

Загальний вигляд команди

OR dst,src; dst= (dst) or (src).

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

Алгоритм роботи:

виконати операцію логічного додавання над бітами операндів, при цьому біт результату дорівнює 0, якщо відповідні біти операндів дорівнюють 0, у противному випадку біт дорівнює

1;

записати результат операції в dst, операнд src без зміни;

за результатом в dst змінити значення прапорців sf, zf, pf і встановити of=0, cf=0.

Типове використання команди – певні біти першого операнда встановити такими, що дорівнюють одиниці.

Команда логічного додавання за модулем два – XOR

Загальний вигляд команди

XOR dst,src; dst= (dst) xor (src).

63

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

Алгоритм роботи:

виконати операцію логічного додавання за модулем два над бітами операндів, причому біт результату дорівнює 1, якщо значення відповідних бітів операндів різні, в інших випадках – біт результату дорівнює 0;

записати результат в dst;

за результатом в dst змінити значення прапорців sf, zf, pf і встановити of=0, cf=0.

Типове використання команди – встановити значення загального регістра такими, що дорівнюють нулю.

Стан прапорців після виконання команд AND, TEST, OR та XOR: прапорці of та cf установлюються 0, значення sf, zf та pf залежать від результату в dst, значення прапорця af не визначено.

Команда логічного заперечення – NOT

Загальний вигляд команди

NOT src; src= not (src).

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

Алгоритм роботи: всі біти операнда src, які дорівнюють 0, установити рівними 1, а всі біти, які дорівнюють 1, встановити рівними 0. Виконання команди не впливає на стан прапорців.

3. Команди зсувів та циклічних зсувів

Команди зсувів та циклічних зсувів мають такі властивості:

-можуть обробляти операнди розміром або байт, або слово, або подвійне слово;

-операнд може бути в регістрі або пам’яті;

-зсувати операнди вліво або вправо;

-розрізняють зсуви логічні, арифметичні, циклічні та циклічні

через перенесення.

В командах зсуву другий операнд використовується як лічильник. Значення лічильника визначає, на скільки бітів відбувається зсув. Лічильник може задаватися сталою величиною довжиною вісім бітів (imm8) або як вміст регістра CL. В останньому випадку перед виконанням команди зсуву потрібно в регістр СL записати число, яке визначає кількість зсувів вліво або вправо.

Команди зсуву впливають на значення прапорців, які модифікуються так:

64

стан прапорця af не визначено;

прапорець cf завжди містить значення останнього біта, який вийшов за межі розрядної сітки (або байт, або слово, або подвійне слово);

в зсувах на один біт прапорець of = 1, якщо операція змінила значення знакового біта; при зсуві на декілька бітів стан прапорця of не визначено;

циклічні зсуви впливають тільки на прапорці of і cf;

у звичайних зсувах прапорці sf, zf і pf модифікуються у

відповідності з одержаним результатом.

Команда арифметичного зсуву вліво – SAL

Загальний вигляд команди

SAL dst ,count ; арифметичний зсув dst на count бітів вліво.

Алгоритм роботи:

зсув всіх бітів вмісту dst вліво на count розрядів. У біти, які вивільнилися справа, записуються нулі, а біти, які вийшли за межі розрядної сітки (байт, слово, подвійне слово), втрачаються, крім останнього, значення якого записується в прапорець cf;

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

Команда логічного зсуву вліво – SHL

Загальний вигляд команди

SHL dst ,count; логічний зсув dst на count бітів вліво.

Команда забезпечує логічний зсув (dst) вліво.

Алгоритм роботи цієї команди збігається з алгоритмом роботи

команди SAL.

Команда арифметичного зсуву вправо – SAR

Загальний вигляд команди

SAR dst ,count; арифметичний зсув dst на count бітів вправо.

Алгоритм роботи:

зсув всіх бітів вмісту dst вправо на count розрядів. При цьому значення знакового біта копіюється в усі вивільнені зліва біти (не змінюється знак числа). Біти, які вийшли за межі розрядної сітки (байт, слово, подвійне слово), втрачаються, крім останнього, значення якого записується в прапорець cf;

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

Команда логічного зсуву вправо – SHR

Загальний вигляд команди

SHR dst ,count; логічний зсув dst на count бітів вправо.

Алгоритм роботи:

65

зсув всіх бітів вмісту dst вправо на count розрядів. При цьому в усі вивільнені зліва біти записуються нулі. Біти, які вийшли за межі розрядної сітки (байт, слово, подвійне слово), втрачаються, крім останнього, значення якого записується в прапорець cf;

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

4.Циклічні зсуви

Команда циклічного зсуву вліво – ROL

Загальний вигляд команди

ROL dst,count ; циклічний зсув (dst) на count бітів вліво.

Алгоритм роботи:

зсув всіх бітів вмісту dst вліво на count бітів так, що кожний біт, який виходить за межі розрядної сітки, записується в крайній правий (наймолодший) біт та одночасно замінює значення прапорця cf;

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

Команда циклічного зсуву вправо – ROR

Загальний вигляд команди

ROR dst,count ; циклічний зсув (dst) на count бітів вправо.

Алгоритм роботи:

зсув всіх бітів вмісту dst вправо на count бітів так, що кожний біт, який виходить за межі розрядної сітки, записується в крайній лівий (найстарший) біт та одночасно замінює значення прапорця cf;

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

Команда циклічного зсуву вліво через перенесення – RCL

Загальний вигляд команди

RCL dst,count ; циклічний зсув (dst) з перенесенням на count

;бітів вліво.

Вланцюжок зсуву добавляється прапорець перенесення cf, який стає найстаршим бітом цього ланцюжка.

Алгоритм роботи:

– зсув усіх бітів одержаного ланцюжка вліво на count бітів так, що кожний біт, який виходить за межі розрядної сітки dst, записується в cf, а значення cf – у крайній правий (наймолодший) біт ланцюжка;

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

Команда циклічного зсуву вправо через перенесення – RCR

Загальний вигляд команди

RCR dst,count ; циклічний зсув (dst) з перенесенням на count

66

;бітів вправо.

Вланцюжок зсуву добавляється прапорець перенесення cf, який стає наймолодшим бітом цього ланцюжка.

Алгоритм роботи:

зсув всіх бітів одержаного ланцюжка вправо на count бітів так, що кожний біт, який виходить за межі розрядної сітки dst, записується в cf, а значення cf – у крайній лівий (найстарший) біт ланцюжка;

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

Розвязування задач за тематикою заняття

Задача 1. Задано вміст регістрів AL=01110001b, BL=11010101b і DL=01010111b . Знайти вміст регістрів після виконання групи команд:

or BL,AL and AL,DL not AL

xor DL,BL test AL,DL .

Розв’язування. Після крапки з комою вказано значення регістрів після виконання кожної команди:

Команди

 

Вміст регістрів

or

BL,AL

;

AL=01110001b, BL=11110101b, DL=01010111b

and

AL,DL

;

AL=01010001b, BL=11110101b, DL=01010111b

not

AL

;

AL=10101110b, BL=11110101b, DL=01010111b

xor

DL,BL

;

AL=10101110b, BL=11110101b, DL=10100010b

test

AL,DL

;

AL=10101110b, BL=11110101b, DL=10100010b

Задача 2. Розробити процедуру для обчислення виразу без використання операцій множення та ділення:

a = ((a*2+1)/4+(c*2-d)/8+(d-1))/4+5-b*16, де a= 657, b=265, c=738, d= 273.

Розв’язування.

Data

Segment

para 'code'

a

dw

657

b

dw

265

c

dw

738

d

dw

273

Data

Ends

 

Code

Segment

para 'code'

Main Proc far

67

Assume cs:Code,ds:Data,es:Data

;.................... Основна програма.....................................

Main Endp

 

 

Calc

Proc near

; Процедура обчислення виразу.

 

mov AX,a

; Записати в регістр AX число а.

 

shl

AX,1

; AX*2

 

inc

AX

; AX+1.

 

shr

AX,2

; AX/4

 

mov CX,c

; Записати в регістр CX число с.

 

shl

CX,1

; CX*2

 

sub CX,d

; Відняти d від вмісту регістра CX

 

shr CX,3

; CX/8

 

mov DX,d

; Записати в регістр DX число d.

 

dec DX

; Зменшити вміст регістра DX на 1.

 

add AX,CX

; Додати до вмісту регістра AX

 

add AX,DX

; вміст регістрів CX і DX.

 

shl

AX,2

; AX/2

 

add AX,5

; Додати 5 до вміст регістра AX.

 

mov BX,b

; Записати в регістр BX число b.

 

shr

BX,4

; BX/4

 

sub AX,BX

; Відняти BX від вмісту регістра AX.

 

mov a,AX

; Записати вміст регістру AX в а.

 

ret

 

; Повернення з процедури.

Calc

Endp

; Директива кінця процедури.

Code

Ends

 

 

End Main

 

Задача 3. Дата зберігається в без знаковій змінній dat розміром у слово так:

 

 

 

Рік

 

 

 

 

Місяць

 

 

 

День

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

15

14

13

12

11

10

9

8

7

6

5

4

3

 

2

1

0

Написати процедуру мовою асемблера, яка забезпечує розміщення значення року, місяця та дня зі змінної dat відповідно у змінні year, mounth та day типу байт.

Розвязування. Побудуємо бітові маски, в яких встановимо в 1 розряди, які відповідають одному з полів, та в 0 – розряди інших

полів.

 

 

m_year

EQU

1111 1110 0000 0000b

m_mounth EQU

0000 0001 1110 0000b

m_day

EQU

0000 0000 0001 1111b

68

 

 

Застосовуючи вказані маски, логічні команди та команди зсувів, розробимо алгоритм розв’язання задачі як набір команд асемблера.

title Date.asm

 

 

m_year

EQU

1111111000000000b

m_mounth EQU

0000000111100000b

m_day

EQU

0000000000011111b

Data

Segment

 

 

dat

 

dw 1249h

 

year

 

db ?

 

 

mounth

db ?

 

 

day

 

db ?

 

 

Data Ends

 

 

Code

Segment Public

Assume

cs:Code,ds:Data,es:Data

;** * фрагмент коду*****……..

ReCodeData proc

 

 

mov BX,dat

;Запис значення дати в ВХ.

 

mov AX,BX

; Копіювання дати.

 

and AX,m_year ; Виділення бітів.

 

shr AX,9

; Зсув виділених бітів.

 

mov year,AL

; Збереження значення року в – year.

 

mov AX,BX

 

and AX,m_mounth shr AX,5

mov mounth,AL mov AX,BX and AX,m_day mov day,AL

ReCodeData endp

; **************************

Code Ends End

Задача 4. Розробити процедуру обчислення кількості бітів зі значенням 1 у полі, довжиною слово.

Розвязування. Нехай вхідний параметр – поле довжиною слово знаходиться в регістрі AX, а результат записується в регістр DX. Тоді процедура має вигляд:

CountBit Proc Near

; Підпрограма знаходження бітів зі значенням 1

 

;

за допомогою команд зсувів.

sub DX,DX

;

Встановити лічильник бітів в 0.

 

 

69

 

mov CX,16

; Лічильник циклу СХ =кількості бітів у слові

m1:

mov BX,AX

; Збереження AX для наступних ітерацій.

 

and AX,0001h

; Виділення наймолодшого розряду.

 

add DX,AX

; Підрахунок одиничних бітів.

 

mov AX,BX

; Відновлення вмісту регістра AX.

 

shr AX,1

;

Зсув наступного біта в нульовий розряд.

 

loop m1

; Цикл

 

ret

;

Повернення з процедури.

CountBit Endp

;

Директива кінця процедури.

 

 

 

Завдання для самостійної роботи

1. Задано вміст регістрів AL , BL і DL . Знайти вміст регістрів після

виконання групи команд :

 

 

 

 

 

 

xor AL,BL

 

 

 

 

 

 

and BL,DL

 

 

 

 

 

 

test AL,DL

 

 

 

 

 

 

not AL

 

 

 

 

 

 

or DL,AL.

 

 

 

де

 

 

 

 

 

 

 

AL

BL

DL

 

 

1

00110011b

10010111b

11010110b

 

 

2

10110011b

11010111b

11010110b

 

 

3

10110011b

10010111b

11010110b

 

 

 

4

10101011b

10010111b

11010110b

 

 

5

10111000b

01010101b

01010110b

 

 

 

6

01110011b

10110111b

11010110b

 

 

7

10110011b

10000111b

11010000b

 

 

 

8

00110011b

10010111b

01010110b

 

 

9

10110010b

10010101b

11110100b

 

 

 

10

01110111b

10010110b

10010110b

 

 

11

00111011b

10011011b

11110110b

 

 

 

12

10110101b

11011110b

11011110b

 

 

13

10110111b

10011111b

11011110b

 

 

 

14

10101111b

10010111b

11011010b

 

 

15

10111100b

01011101b

01010110b

 

 

 

16

01110111b

10110111b

11011010b

 

 

17

10110110b

10010111b

11010100b

 

 

 

18

00111001b

10110111b

01010110b

 

 

19

10110110b

10110101b

01110101b

 

 

20

01110111b

10110110b

10010111b

 

70

 

 

 

 

 

 

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

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