M_Asm2009LS
.pdf10) кожне входження слова "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 |
|
|
|
|
|
|