- •Теоретичні відомості
- •1. Структура простої програми мовою асемблера. Формат кодування програми.
- •2. Основні директиви : segment , end, ends, proc, endp, assume.
- •3. Основні вимоги при створенні програми. Приклади простих програм мовою асемблера.
- •4. Трансляція програми. Опції компіляції та загальна характеристика.
- •6. Застосування програми налагодження для пошуку помилок.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи
- •Теоретичні відомості
- •1. Директиви визначення даних.
- •2. Директива повторення dup.
- •3. Сталі.
- •5. Представлення в пам’яті цілих чисел.
- •6. Команда пересилки даних mov.
- •7. Команди двійкового додавання та віднімання.
- •Команда зміни знаку операнда neg
- •8. Обчислення цілих арифметичних виразів.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Теоретичні відомості
- •1. Команда безумовного переходу jmp. Типи адресів переходу short,near та far.
- •2. Команди організації циклів ( loop,loopn,loopnz). Команда loop. Керування циклом за ecx/cx.
- •Керування циклом за ecx/cx із врахуванням ознаки zf
- •3. Команди умовних переходів.
- •5. Команда lea
- •Команда роботи зі стеком push та pop
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Логічні операції та операції зсувів.
- •2. Команди логічних операцій (and, test, or, xor, not).
- •3. Команди зсувів та циклічних зсувів.
- •Команди зсувів (sal, sar, shl,shr)
- •Команда зсуву логічного операнда вправо – shr
- •3.2 Команди циклічних зсувів (rol, ror ,rcl, rcr). Циклічний зсув операнда вліво - rol
- •Циклічний зсув операнда вправо ror
- •Циклічний зсув операнда вліво через ознаку переносу - rcl
- •Циклічний зсув операнда вправо через ознаку переносу – rcr
- •Бітові маски.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи
- •1. Множення цілих чисел
- •2. Ділення цілих чисел
- •3. Перетворення в регістрах
- •Алгоритм введення–виведення цілих чисел
- •Виведення цілих чисел.
- •Введення цілих чисел.
- •Розв’язування задач за тематикою заняття
- •Завдання для самостійної роботи.
- •Теоретичні відомості
- •Особливості команд обробки рядків.
- •Ознака df. Команди зміни ознаки ( cld, std ).
- •Префікси повторення( rep, repe, repz, repne, repze ).
- •Команди обробки символьних рядків
Циклічний зсув операнда вліво через ознаку переносу - rcl
Схема команди: RCL операнд , кількість зсувів
Призначення: операція циклічного зсув операнда вліво через ознаку переносу CF.
Алгоритм роботи:
зсув всіх бітів операнда вліво на один розряд, при цьому старший біт операнда стає значенням ознаки переносу CF;
одночасно старе значення ознаки переносу CF засовується в операнд праворуч і стає значенням молодшого біта операнда;
зазначені вище дві дії повторюються задану кількість раз, яка значена у другому операнді.
Циклічний зсув операнда вправо через ознаку переносу – rcr
Схема команди: RCR операнд , кількість зсувів
Призначення: операція циклічного зсув операнда вправо через ознаку переносу CF.
Алгоритм роботи:
зсув всіх бітів операнда вправо на один розряд; при цьому молодший біт операнда стає значенням ознаки переносу CF;
одночасно старе значення ознаки переносу — в операнд ліворуч і стає значенням старшого біта операнда;
зазначені вище дві дії повторюються задану кількість раз, яка значена у другому операнді.
Стан ознак після виконання команд циклічних зсувів : CF – значення залежить від результату роботи команди, OF – зміст ознаки має зміст при зсуві на один біт, в цьому випадку залежить від результату роботи команди.
Бітові маски.
Бітова маска – представляє собою двійкову сталу в якої деякі з двійкових розрядів встановлені в 1. Наприклад,
00011100b
000000001111000b
1111000000000001111000b
Бітові маски застосовуються в логічних операціях для виділення окремих бітів, встановлення значень у окремі біти, тощо. Також можуть застосовуватися в арифметичних операціях та операції порівняння.
Розв’язування задач за тематикою заняття
Задача 1. Задано вміст регістрів AL (01110001b) , BL (11010101b) і DL (01010111b) . Знайти вміст регістрів після виконання групи команд :
or BL,AL
and AL,DL
not AL
xor DL,BL
text AL,DL .
Розв’язування. Значення регістрів після кожної команди :
Команди Вміст регістрів
or BL,AL ; al (1111 0101 ) bl (1101 0101 ) dl( 0101 0111 )
and AL,DL ; al (0101 0101 ) bl (1111 0101 ) dl( 0101 0111 )
not AL ; al (1010 1010 ) bl (1111 0101 ) dl( 0101 0111 )
xor DL,BL ; al (1010 1010 ) bl (1111 0101 ) dl( 1010 0010 )
text AL,DL ; al (1010 1010 ) bl (1111 0101 ) dl( 1010 0010 ).
Задача 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
;.................... Основна програма.....................................
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
mov DX,d ; Записати в регістр DX число d.
dec DX ; Зменшити вміст регістра DX на 1.
add AX,CX ; Додати до вмісту регістра AX
add AX,DX ; вміст регістрів CX і DX.
shl AX,2 ;
add AX,5 ; Додати 5 до вміст регістра AX.
mov BX,b ;
shr BX,4
sub AX,BX ; Відняти BX від вмісту регістра AX.
mov a,AX ; Записати вміст регістру AX в а.
ret ; Повернення з процедури.
Calc Endp ; Директива кінця процедури.
Code Ends 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
Застосовуючи побудовані маски, логічні команди та команди зсувів отримуємо розв’язок задачі.
title Date.asm
m_year EQU 1111 1110 0000 0000b
m_mounth EQU 0000 0001 1110 0000b
m_day EQU 0000 0000 0001 1111b
Data Segment
dat dw ?
year db ?
mounth db ?
day db ?
Data
Code Segment Public
;** * фрагмент коду*****……..
ReCodeData proc mov BX,dat
mov AX,BX
and AX,m_year
shr AX,9
mov year,AL
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
Задача 4. Написати процедуру підрахунку кількість одиничних бітів у машинному слові.
Розв’язування. Нехай вхідний параметр машинне слово знаходиться у регістрі AX, а результат записується у регістрі DX, тоді процедура має вигляд:
CountBit Proc Near ; Підпрограма знаходження одиничних
; бітів за допомогою команд зсувів.
sub DX,DX ; Встановити лічильник бітів в 0.
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 ; Директива кінця процедури.