- •Теоретичні відомості
- •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 ).
- •Команди обробки символьних рядків
3. Перетворення в регістрах
Призначення: розширення операнда зі знаком.
Схема команди: CBW ; байта в слово
CWDE ; слово в подвійне слово, для і386 і вище
CWD ; слово в подвійне слово
CDQ ; подвійне слово в чотири слова, для і386 і вище
Алгоритм роботи:
CBW — при роботі команда використовує тільки регістри AL і AX:
аналіз знакового біта регістра AL:
якщо знаковий біт AL=0, то AH=00h;
якщо знаковий біт AL=1, то AH=0ffh.
CWDE — при роботі команда використовує тільки регістри AX і EAX:
аналіз знакового біта регістра AX:
якщо знаковий біт AX=0, то установити старше слово EAX=0000h;
якщо знаковий біт AX=1, то установити старше слово EAX=0ffffh.
CWD — при роботі команда використовує тільки регістри AX і DX:
аналіз знакового біта регістра AX:
якщо знаковий біт AX=0, то DX=0000h;
якщо знаковий біт AX=1, то DX=0ffffh.
CDQ — при роботі команда використовує тільки регістри EAX і EDX:
аналіз знакового біта регістра EAX:
якщо знаковий біт EAX=0, то EDX=00000000h;
якщо знаковий біт EAX=1, то EDX=0ffffffffh.
Стан ознак після виконання команди: виконання команди не впливає на ознаки.
Дані команди використовуються для приведення операндів до потрібної розмірності з урахуванням знака. Така необхідність може, зокрема, виникнути при програмуванні арифметичних операцій. Зокрема, можна використовувати для підготовки до операції ділення, для якої розмір діленого повинен бути в два рази більше розміру дільника, або для приведення операндів до однієї розмірності в командах множення, додавання, вирахування.
Алгоритм введення–виведення цілих чисел
В системі переривання DOS 21h та BIOS 10h не передбачені функції введення–виведення цілих чисел, функції переривань дозволяють працювати тільки з символами та рядками. Для роботи з цілими при програмування мовою асемблера користувачеві необхідно створити власні процедури введення – виведення. Типові алгоритми та реалізації таких розглянемо у цьому параграфі.
Виведення цілих чисел.
Виведення цілих чисел складається з етапів:
перетворення внутрішнього представлення числа у рядок символів(код ASCII);
виведення отриманого рядка.
На першому етапі здійснюється перетворення внутрішнього представлення числа у рядок, який складається із символьного представлення цифр цього числа. Причому перетворення можемо здійснювати у будь–яку систему числення. Для прикладу розглянемо алгоритм перетворення цілого (16-розрядного, машинне слово) числа зі знаком з діапазону –32768 до 32767.
Для перетворення у сегменті даних необхідно зарезервувати буфер із 7 байтів, та комірку розміром в 1 байт для збереження інформації про знак.
Алгоритм
Розмістити вихідне ціле число регістр АХ.
Очистити буфер(наприклад заповнити пробілами), у сьому позицію записати символ долар(‘$’). Встановлюємо активною шосту позицію буфера.
Перевірити знак числа. Якщо число від’ємне відмічаємо у комірці знаку та перетворюємо його у додатне число.
Виконуємо без знакове цілочислове на 10.
Остачу від ділення перетворюємо у символ ( до остачі додаємо код символу ‘0’).
Заносимо символьне представлення остачі у активну позицію буфера. Активною позицією робимо позицію буфера з індексом на одиницю менше.
Перевіряємо частку. Якщо вона не рівна нулю повертаємося на пункт 4.
Якщо число було від’ємне, то у буфер заносимо символ мінус ('-').
Кінець.
На другому етапі виводимо вміст буфера за допомогою переривання DOS 21h або BIOS 10h.
Реалізація алгоритму.
Data segment
;
signed db 1 ; 1 – signed, 0 unsigned
decimal dw -4567
outdecimal db 6 dup(' '),'$'
;
Data ends
Code segment
ASSUME CS : Code, DS : Data
;
outinteger proc
push SI
push DX
push CX
push BX
mov AX,decimal ; 1)
mov DL,’ ‘ ; 2)
mov SI,0 ; …
mov CX,6
cls_buf: mov outdecimal[SI],DL
inc SI
loop cls_buf ; 2)
mov SI,5 ; 2)
mov BX,0ah ;
mov DL,0 ;
test AX,8000h ;3)
je ns ;
mov DL,1 ;
neg AX ;
ns: mov signed, DL ;3)
n1: cwd ; AX -> (DX,AX)
div BX ;4) -> AX=div DX=mod
add DL,'0' ;5)
mov outdecimal[SI],DL ; 6)
dec SI ;6)
cmp AX,0 ; 7)
jnz n1 ;7)
mov DL,signed ;8)
cmp DL,1h ;8)
jne n2
mov outdecimal[SI],'-' ;8)
n2: mov AH,9 ;
lea DX,outdecimal
int 21h
pop BX
pop CX
pop DX
pop SI
ret
outinteger endp