You are on page 1of 14

Архітектура комп’ютерів

Лабораторна робота №5
Структура програми на Асемблері.
Програмування простих арифметичних та логічних операцій

Мета: Ознайомитися з етапами отримання виконавчого файлу на мові Асемблера.


Дослідити етапи компіляції, компоновки та відлагодження програми;
Навчитися складати та відлагоджувати програми на мові Асемблера для
реалізації простих арифметичних і логічних операцій.
Завдання: Ознайомитися з короткими теоретичними відомостями, порядком
виконання роботи; провести дослідження способів адресації для
мікропроцесора і8086.
Обладнання та програмне забезпечення: персональний комп’ютер, emu8086. Час
виконання: 2 години.

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

1.1. Типова структура програми на мові Асемблера


Асемблером називається i мова програмування у мнемокодах команд, i
спеціальна програма-транслятор, що переводить (транслює) мнемокоди у
машинні коди, які зчитуються мікропроцесором з пам’яті програм,
дешифруються i виконуються. Процес переведення у машинні коди називається
асемблеруванням.
Програми, виконані під управлінням DOS, можуть належати до одного з
двох типів, яким відповідають розширення імен програмних файлів .com і .exe.
Основна відмінність цих програм полягає в тому, що програми типу .com
складаються з єдиного сегмента об'ємом в 64 Кб, в якому розміщуються
програмний код, дані та стек, а в програмах типу .exe для кожного з них
виділяються окремі сегменти. Управління сегментами – один з найбільш
складних аспектів програмування на мові асемблера.
Програма на мові асемблер містить два типи
виразів: - команди, що транслюються в машинні
коди; - директиви, що керують ходом трансляції.
Загальний синтаксис команди має вигляд:
{<мітка>}:<мнемокод> {<операнд>} {,} {<операнд>} {; коментар}

У фігурних дужках наведено елементи виразу, які можуть бути відсутні в


деяких командах.

5
Архітектура комп’ютерів

Програма на мові асемблера складається з директив та логічних розділів,


які мають назву і можуть належати до класів: сегмент кодів, сегмент даних і
сегмент стеку:

TITLE ;директива заголовку програми 386


;директива задання типу процесора model
;задає модель сегментації пам’яті
оption casemap ;сприйняття великих і малих символів
include ;директива підключення файлів
includelib ;директива підключення бібліотек
stack ;директива початку сегмента стеку
data ;директива початку сегмента даних
code ;директива початку сегмента коду
start: ;мітка початку коду програми
ret
end start ;завершення коду програми

Програмний код на мові Асемблер починається з директиви TITLE, яка не є


обов’язковою, але може бути використана для опису програми. Наприклад,
TITLE Hello World Program Директива model задає
параметр, який визначає модель сегментації пам’яті для програмного модуля
(таблиця 5.1).

Таблиця 5.1 – Моделі пам’яті


Модель Призначення
tiny Код і дані об’єднані в одну групу з ім’ям DGROP (для com-програм).
small Код займає один сегмент, дані об’єднані в одну групу з ім’ям DGROP. Довжина
групи по 64 Кб.
medium Код займає кілька сегментів по одному на кожен програмний модуль. Дані
об’єднані в одну групу з ім’ям DGROP.
compact Код в одному сегменті, дані в декількох.
large Код у кількох сегментах, по одному на кожний програмний модуль, дані – у
кількох.

Директива option casemap :none дає вказівку компілятору нерозрізняти


великі і малі символи в програмі. Варианти option casemap: all, none, notpublic.

Таблиця 5.2 – Спрощені директиви опису сегментів


Формат директиви Призначення
.code Початок або продовження сегмента коду.

6
Архітектура комп’ютерів

.data Початок або продовження сегмента ініціалізованих даних.


.const Початок або продовження сегмента постійних даних (констант).
.data? Початок або продовження сегмента неініціалізованих даних.
.stack (розмір) Початок або продовження сегмента стеку. Параметр (розмір) задає
розмір стеку.
.fardata (ім’я) Початок або продовження сегмента ініціалізованих даних типу far.
.fardata? (ім’я) Початок або продовження сегмента неініціалізованих даних типу far.
1.2. Директиви визначення даних
Асемблер забезпечує два способи визначення даних: по-перше, через
задання довжини даних і, по-друге, за їх значенням.
Основний формат визначення даних:
[Ім’я] Dn вираз Ім’я елемента даних не є
обов’язковим, але якщо в програмі є посилання на деякий елемент, то це робиться
за допомогою імені. Для визначення елементів даних Dn використовують
директиви, приведені в таблиці 5.3.

Таблиця 5.3 – Директиви визначення даних


Тип Директива Кількість байт
Байт DB 1
Слово DW 2
Подвійне слово DD 4
8 байт DQ 8
10 байт DT 10

Вираз може містити константу, наприклад: FLD1 DB 25, або знак питання
для невизначеного значення, наприклад: FLD2 DB ?
Вираз може містити кілька констант, розділених комами й обмеженими
тільки довжиною рядка:
FLD3 DB 11, 12, 13, 14, 15, 16, ...

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


Звертання за FLD3 вказує на першу константу 11, за FLD3+1 - на другу 12. (FLD3
можна представити як FLD3+0).
Наприклад команда MOV AL,FLD3+3 завантажує в регістр AL значення 14
(шістнадцяткове 0E).
Вираз допускає також повторення константи у наступному форматі:
[ім’я] Dn кількість повторень DUP (вираз) ...

Приклади повторення:
FLD4 DW 10 DUP(?) ;Десять невизначених слів

7
Архітектура комп’ютерів

FLD5 DB 5 DUP(14) ;П’ять байт, що містять число 0Eh

Цілочисельні дані
Цілі числа в асемблері можуть бути представлені в 1-, 2-, 4- або 8-байтній
формі. Цілочисельні дані можуть представлятися у знаковій і беззнаковій формі.
Беззнакові цілі числа представляються у вигляді послідовності бітів в
діапазоні від 0 до 2n-1 (рис. 5.1), де n – кількість займаних бітів.

Рис. 5.1 – Беззнакові цілі числа

Знакові цілі числа представляються в діапазоні -2n-1 ... + 2n-1-1 (рис. 5.2).
При цьому старший біт даного відводиться під знак числа (0 відповідає
позитивному числу, 1 - негативному).

Рис. 5.2 – Знакові цілі числа

Числа з плаваючою комою


Числа з плаваючою комою можуть бути 4, 8 або 10-байтними і
обробляються математичним співпроцесором.
Логічні дані
Логічні дані представляють собою біт інформації і можуть записуватися у
вигляді послідовності бітів. Кожен біт може приймати значення 0 (хибність) або 1
(істина). Логічні дані можуть починатися з будь-якої позиції в байті.
Символьні дані
Символьні дані задаються в кодах і мають довжину, як правило, 1 байт (для
кодування ASCII) або 2 байта (для кодування Unicode).
Числа у двійково-десятковому форматі
У двійковій-десятковому коді представляються беззнакові цілі числа, які
кодують цифри від 0 до 9. Числа в двійковій-десятковому форматі можуть
використовуватися в одному з двох видів: - упакованому; - неупакованому.
Упакований вид допускає зберігання двох десяткових цифр в одному байті,
причому старша половина байту відводиться під старший розряд (рис. 5.3).

8
Архітектура комп’ютерів

Рис. 5.3 – Неупакований двійковій-десятковий формат

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


в молодшій половині байту (біти 3 ... 0) (рис. 5.4).

Рис. 5.4 – Упакований двійковій-десятковий формат

Числові константи
Числові константи використовуються для позначення арифметичних
операндів і адрес пам'яті. Для числових констант в Асемблері можуть
використовуватися такі числові формати.

Десятковий формат - допускає використання десяткових цифр від 0 до 9 і


позначається останньою буквою d, яку можна не вказувати, наприклад, 125 або
125d. Асемблер сам перетворює значення в десятковому форматі в об'єктний
шістнадцятковий код і записує байти в зворотній послідовності для реалізації
прямої адресації.
a DB 12 Шістнадцятковий формат -
допускає використання шістнадцятирічних цифр від 0 до F і позначається
останньою буквою h, наприклад 7Dh. Так як асемблер вважає, що з букви
починаються ідентифікатори, то першим символом шестнадцатеричной
константи повинна бути цифра від 0 до 9. Наприклад, 0Eh.
a DB 0Ch Двійковий формат - допускає
використання цифр 0 і 1 і позначається останньою буквою b. Двійковий формат
зазвичай використовується для більш чіткого уявлення бітових значень в
логічних командах (AND, OR, XOR).
a DB 00001100b Восьмирічний формат -
допускає використання цифр від 0 до 7 і позначається останньою буквою q або o,
наприклад, 253q.
a DB 14q Масиви

і ланцюжки
Масивом називається послідовний набір однотипних даних, іменований
одним ідентифікатором.
Ланцюжок - масив, який має фіксований набір початкових значень.

9
Архітектура комп’ютерів

Приклади ініціалізації ланцюжків


M1 DD 0,1,2,3,4,5,6,7,8,9
M2 DD 0,1,2,3
DD 4,5,6,7
DD 8,9
Кожен із записів виділяє десять послідовних 4-байтних комірок пам'яті і
записує в них значення 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
Ідентифікатор M1 визначає зміщення початку цієї області в сегменті даних
.DATA.
Для ініціалізації всіх елементів масиву однаковими значеннями
використовується оператор DUP:
Ідентифікатор Тип Розмір DUP (Значення),

де Ідентифікатор - ім'я масиву; Тип - визначає кількість байт, які займає один
елемент; Розмір - константа, що характеризує кількість елементів в масиві;
Значення - початкове значення елементів.
Наприклад: a DD
20 DUP (0),

описує масив a з 20 елементів, початкові значення якого дорівнюють 0.

Якщо необхідно виділити пам'ять, але не форматувати її, у якості поля


Значення використовується знак ?, наприклад, b DD 20 DUP (?).
Символьні рядки
Символьні рядки являють собою набір символів для виведення на екран.
Вміст рядка зазначається:
- одиночними лапками ‘’, наприклад, ‘рядок’; -
подвійними лапками “”, наприклад “рядок”.
Символьний рядок визначається тільки директивою DB, в якій вказується
більше одного символу в послідовності зліва направо.
Символьний рядок, призначена для коректного виведення, повинна
закінчуватися нуль-символом '\0' з кодом, рівним 0.
Str DB 'Привіт всім!', 0
Для переводу рядка можуть використовуватися символи:
- повернення каретки з кодом 13 (0Dh) - переклад рядка
з кодом 10 (0Ah). Приклад: str DB «Привіт», 13, 10,
0

10
Архітектура комп’ютерів

Від’ємні числа
Якщо число десяткове, то перед ним ставлять знак мінус (наприклад, -26).
Якщо число двійкове або шістнадцяткове, то його вводять у доповняльному коді.
Число -32: 11100000b або 0E0h.

1.3. Команди передачі даних


Команда Опис
MOV Пересилка операндів
XCHG Обмін операндів
Перестановка байтів з порядку «молодший – старший» у порядок «старший –
BSWAP
молодший»
MOVSX Пересилка з розширенням формату та дублюванням знакового біта
MOVZX Пересилка з розширенням формату та дублюванням нульового біта
Завантажити в AL байт з таблиці в сегменті даних, на початок якої вказує EBX
XLATXLATB
(ВХ); початкове значення AL відіграє роль зміщення
LEA Завантаження ефективної адреса
LDS
LSS
LES Завантажити пару регістрів з пам’яті
LFS
LGS

1.4. Арифметичні операції


Команда Пояснення
ADD Додавання цілих чисел
ADC Додавання цілих чисел с урахуванням прапорці перенесення CF
INC Збільшення на 1
DEC Зменшення на 1
SUB Віднімання цілих чисел
SBB Віднімання з урахуванням прапорця перенесення CF
Порівняння цілих чисел
CMP
За результатом порівняння встановлюються прапори CF, PF, AF, ZF, SF, OF
NEG Зміна знаку числа
MUL Множення без знаку
IMUL Множення зі знаком
DIV Ділення без знаку
IDIV Ділення зі знаком

11
Архітектура комп’ютерів

1.5. Логічні операції


Команда Опис
AND Логічне множення (І), кон’юнкція
OR Логічне додавання (АБО), диз’юнкція
XOR Виключальне АБО
NOT Логічне заперечення (НЕ), інверсія
Логічне множення без збереження результату. У відповідності до результату
TEST
встановлюються прапори PF ZF SF

1.6. Операції зсуву


Команда Описание
SHR Логічний зсув вправо
SAR Арифметичний зсув вправо (старші розряди заповнюються значенням знакового)
SHL
SAL Логічний (арифметичний) зсув уліво
ROR Циклічний зсув вправо
ROL Циклічний зсув уліво
RСR Циклічний зсув вправо через перенос
RCL Циклічний зсув уліво через перенос

1.7. Команди корекції двійково-десяткових чисел


Команди корекції двійковій-десяткових чисел не мають операндів і
використовують операнд за замовчуванням, що зберігається в регістрі AX (парі
регістрів AH:AL).

Команда Опис
AAA Корекція AX після додавання двох неупакованих двійково-десяткових чисел
AAS Корекція AX після віднімання двох неупакованих двійково-десяткових чисел
AAM Корекція AX після множення двох неупакованих двійково-десяткових чисел
AAD Корекція AX перед діленням двох неупакованих двійково-десяткових чисел
Команда Опис
DAA Корекція AL після додавання двох упакованих двійково-десяткових чисел
DAS Корекція AL після віднімання двох упакованих двійково-десяткових чисел

12
Архітектура комп’ютерів

1.8. Команди перетворення типів


Команди перетворення типів призначені для коректного зміни розміру
операнда, заданого неявно в регістрі-акумуляторі (EAX, AX, AL). Безпосередньо
після абревіатури команди операнд не вказується.

Команда Пояснення Опис

CBW AX=(DW)AL 2 байта ← 1 байт

CWDE EAX=(DD)AX 4 байта ← 2 байта

CWD DX:AX=(DD)AX 4 байта ← 2 байта

CDQ EDX:EAX=(DQ)EAX 8 байт ← 4 байта

2. Порядок виконання роботи

2.1. Підготовка до роботи


1. Ознайомтеся з теоретичними відомостями.
2. Завантажте програму-емулятор emu8086.

2.2. Хід роботи

Завдання №1 Створення програми “Hello World”


1. Створіть новий exe-файл та введіть програмний код на мові асемблера:

TITLE Hello World Program


.model small ;модель пам'яті data
segment
message db "Hello, World!",0dh,0ah,'$'
ends stack segment
dw 128 dup(0) ;сегмент стеку розміром в 256 байт
ends code
segment
start:
mov ax, data ;ініціалізація сегменту даних
mov ds, ax mov
es, ax

lea dx, message


mov ah, 9 ;виведення рядка за адресою ds:dx
int 21h

mov ah, 1 ;очікування натискання клавіші

13
Архітектура комп’ютерів

int 21h

mov ax, 4c00h ;функція DOS завершення програми


int 21h
ends end
start

3. Запустіть програму на виконання та перегляньте результат роботи.

4.

Завдання №2 Арифметичні операції над беззнаковими однобайтними


числами

3
Обчислити вираз: y a *ca , де а=12, б=5, с=4.
8b
1. Створіть новий exe-файл та введіть програмний код на мові
асемблера:

const segment
const1 equ 3
const2 equ 8
ends data
segment
val_a db 12
val_b db 5

14
Архітектура комп’ютерів

val_c db 4
y db 0
mes db "rezultat y=$"
ends stack segment
dw 128 dup(0) ends
code segment start:
mov ax, data
mov ds, ax mov
es, ax

mov ax,0 ;обнулення регістра ax


mov al,val_a
add al,const1 ;реалізація додавання а+3
mov bl,const2
sub bl,val_b ;реалізація віднімання 8-b
div bl ;реалізація ділення а+3/8-b
mov ah,0 ;обнулення залишку
mul val_c ;реалізація множення на с
add al,val_a ;реалізація ділення а+3/8-b
mov y,al ;занесення результату в
пам’ять
lea dx, mes ;виведення повідомлення
mov ah, 9
int 21h

mov al, y ;виведення числа


mov cx, 0
mov bl, 10
@div:
inc cx
mov ah, 0
div bl
push ax
test al, al
jnz @div mov
ah, 02h
@show:
pop dx
mov dl, dh
add dl, '0'
int 21h loop
@show
mov ah, 1 ;очікування натискання клавіші
int 21h

mov ax, ;функція DOS завершення програми


4c00h int
21h ends end

15
Архітектура комп’ютерів

start

2. Запустіть програму на виконання та перегляньте результат


роботи.
3. Проаналізуйте програмний код.
4. Змініть значення на b=5. Поясніть результат виконання
програми.
5. Змініть значення на а=-12. Поясніть результат виконання
програми.
6. Змініть програмний код таким чином, щоб він працював з
від’ємними числами.

Завдання №3 Логічні операції


Дані два числа у двійковому коді. Перше число проінвертувати і поділити
на 4. Друге помножити на 2. Результат скласти і молодші чотири розряди
замінити на протилежні.
1. Створіть новий exe-файл та введіть програмний код на мові асемблера:
data segment val_a db
10110101b val_b db
00110111b val_c db
0
data ends stack
segment dw 128
dup(0) ends code
segment start:
mov ax, data
mov ds, ax
mov es, ax

mov ax,0 ;обнулення регістра ax


not val_a ;інверсія числа
shr val_a,2 ;ділення на 4
shl val_b,1 ;множення числа b на 2
mov al, val_a add ;додавання двох чисел
al, val_b
xor al, 00001111b ;інвертуємо перші чотири розряди
mov val_c,al
mov ax, ;функція DOS завершення програми
4c00h int
21h ends end
start

2. Запустіть програму на виконання та перегляньте результат роботи.


3. Проаналізуйте програмний код.

16
Архітектура комп’ютерів

Загальні висновки:

3. Індивідуальна робота

Реалізувати алгоритм виконання арифметичних, логічних операцій та


операцій зсуву за варіантом викладача.

Контрольні питання

1. Яке призначення мають директиви: MODEL SMALL, STACK, DATA,


CODE, END?

2. Яке призначення мають команди, що записані на початку програми:


mov ax, @data та mov ds, ax?

17
Архітектура комп’ютерів

3. Де повинні знаходитися операнди та результат при виконанні команд


додавання ADD та віднімання SUB?

4. Де повинні знаходитися співмножники та результат при виконанні ко-


манд множення MUL та ІMUL?

5. Де повинні знаходитися ділене та дільник при виконанні команд DIV


та ІDIV, а також результат та залишок?
6. Чим відрізняються відображення в пам’яті додатних та від’ємних да-
них?
7. Яким чином розташовуються в пам’яті дані розміром у слово або по-
двійне слово?
8. Які регістри використовують для зберігання даних, що мають розмір
байту, слова або подвійного слова?

Оцінка: Робота захищена:


(дата) (підпис)

18

You might also like