Смекни!
smekni.com

Програмування на мові Асемблер (стр. 1 из 2)

Курсова робота

з мови прграмування „Асемблер”

на тему:Програмування на мові Асемблер”.

.
Зміст

Вступ

1. Сегментація пам’яті.

2. Команди пересилання muv.

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

4. Робота з стеком (команди pop і push).

5. Арифметичні команди.


Сегментація пам’яті.

Перед тим як вивчати регістри і команди процесора 8086 необхідно зрозуміти,як він адресує пам’ять,використовуючи системні сегменти і зміщення.

Регістр— невелика по розміру пам’ять спеціального призначення.Використовуючи для представлення значення адреси 20 біт,8086-й процесор може мати доступ до 1 Мбайта пам’яті.DOS ROMBIOS та інші програми,які знаходяться в пам’яті ПК вже займають певне місце в пам’яті,тому решта програм записуються, використовуючи менший простір пам’яті– до 640 кБ.

Незалежно від того,скільки пам’яті може адресувати процесор,найменшим блоком пам’яті є 8-бітовий байт.Кожен байт має своє унікальне місцеположення,яке називається фізичним адресом,по ньому програми можуть читати і записувати інформацію.[Для адресації великих об’ємів пам’яті,потрвбно більша кількість біт під фізичні адреси ].Процесор 8086 використовується тільки 16-бітові регістри.Щоб мати доступ до всього мегабайта пам’яті,використовується метод сегментації пам’яті.

Сегментація пам’яті— метод,який використовується процесором 8086 для розділення великого адресного прстору на логічні 64 кБ фрагменти.З допомогою цього методу адрес конкретного байта може бути виражений двома значеннями: за адресом фрагмента сегмента і 16-бітовим зміщенням від початку сегмента.Ця комбінація значень сегмента і зміщення,називається логічною адресою.

Якщо в комп’ютері 64 кБ пам’яті,тоді для задання адреса будь-якого байта досить 16 біт,з допомогою яких представляються значення від 0 до 65535 (216-1) або заокруглено– до 64 кБ.

СП. Тема 1.5:Команди МП 8088/86.

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

В залежності від виконуваних функцій всі команди CPU 8086 діляться шість категорій:

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

- Алгоритмічні команди.

- Логічні команди.

- Команди управління потоком.

- Команди управління процесором.

- Команди для роботи з рядками.

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

Ці команди діляться на чотири частини:загальні, в/в, адресні і прапорів.Операнди справа від імені команди визначають необхідні їй елементи даних.Їх може бути 2,1 або жодного.

Розглянемо основні команди.

2.Команда mov.

Ця команда найчастіше зустрічається в програмах на Аs.Для mov потрібні два операнди:операнд- джерело іоперанд- призначення; джерело записується після призначення:mov призначенн ¬ джерело (дані з джерела передаються в направленні стрілки,справа на ліво).

Наприклад: 1) mov ax bx ; ax¬bx

значення регістра bx пересилається в регістр ах.Якщо значення ах= 0000,bx= 0123h, то після виконання mov значення ах стане дорівнювати 0123h, bx не зміниться.

2) mov cx, [num Pages]; ax¬ [num Pages].

Пересилає значення, яке знаходиться в [num Pages] в регістер сх.Мітка num Pages визначає адресу в пам’яті,а [num Pages] відповідає даним записаним по цьому адресу.Тобто мітки визначають адреси,по яких дані зберігаються в пам’яті:

3) mov [level],dl ; [level]¬ dl

значення з 8- бітового регістра dl пересилаються по адресу,на який вказує мітка.Така пересилка даних ¾ копіювання значення одного регістра в другий і переміщення даних з регістра в пам’ять ¾ одна з найбільших загальних операцій в програмуванні на Аs.Проте mov не може пересилати дані безпосередньо між двома адресами пам’яті.Тому,запис mov [count], [maxCount] є некоректним,щоб пересилати значення,записане в maxCount по адресу count потрібно виконати два кроки і використати проміжковий регістер:

mov ax,[maxCount]; ax¬ [maxCount]

mov [count],ax ;[Count]¬ ax

Ознайомимся з використанням команди mov на прикладі програми MOV.ASM (практичне заняття).

Робота з стеком (команди pop і push).

Cтекова память.

Стек¾ це спеціальний сегмент пам’яті,який використовується деякими командами процесора 8086.Положення і розмір стека (до 64 кБт) визначаються програмою і програмістом.Cамий простий засіб створення стека заключається в використанні директиви STACK.Стек виконує три основні функції:

1) Тимчасове збереження значень регістрів;

2) Збереження адресів повернення з підпрограми;

3) Збереження динамічних змінних.

Останній більш характерний при роботі з високорівневими мовами програмування.

Як працює стек.(Принцип роботи стека).

Стек нагадує гору тарілок.Верхню тарілку легко взяти,але щоб добратися до тарілки,яка знаходиться знизу,потрібно зняти всі тарілки над нею.

Розміщення нової порції з вершини на вершину стека називається проштовхуванням в стек (push).

Видалення,порції з вершини стека, яке приводить до підняття на один рівень останніх порцій , на 3 виштовхуванням стека (pop) байта в стеку.

При проштовхуванні в стек останьої порції вона перша і виштовхується,тому такий тип стека називається LIFO-стек (LAST- IN- First- Out¾ останній- прийшов- перший- пішов).

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

Сегментний регістр ss містить адресу початку стекового сегмента.В регістрі sp знаходиться зміщення вершини стека відносно цього сегмента.

Стековий сегмент.

0F00:

0000

0002

0004

0006

ss:sp 3

0008

ss:sp 2

000A

ss:sp 1

000C

на рис.4.4 зображено,як розміщується в пам’яті невеликий сегмент із 12 байт.В регістрі ss знаходиться адрес початку стекового сегмента 0F00.Регістр sp вказує на зміщення відносно йієї початкової адреси в інтервалі від 0000 до 000А.Останній байт стека має зміщення 000В.Під елементи стека виділяють 2-байтові слова..

Щоб використовувати цей стек , в програмі досить декларувати STACK 12 , після чого асемблер компановщик DOS самі точно визначать , де розмістити стек в пам яті. Регістри ss i sp не потрібно ініціалізувати , це робить DOS при загрузці ас програми на рисунку 44 .SP1 вказує , куди при запуску програма вказує sp.Потрібно замітити , що логічний адрес ss:sp вка-

зуэ на байт , розміщений нижче останнього ,байта в стеку.

Потрібно пам ‘ятати , що основа стека розміщується в більш високих адресах пам ‘яті.В пам яті стек росте в напрямі зменшення адрес пам яті і зменшується в протилежному напрямку .

До бажаного результату приведем на рис.4.4 виконання слідуючих команд :

mov ax , 100

push ax ; sp 2

mov bx , 200

push bx ; sp3

Команда push виконує дві дії :

1) Зменшує на 2 значення sp

2) Задане значення регістра записується по адресу [ ss:sp ]- розуміємо значення з зміщенням sp в середині стекового сегмента .

Порядок цих кроків істтній . Спочатку push віднімає 2 із sp. На рис. 4.4 першиц оператор push

записує sp2 в sp , поміщаючи потім туди значення з регістра ax . Після виконання цих дій вказівник степення адресує останнє поміщення в стек юдюжзначення.

Управління стеком

Принцип правильного управління стеком простий :

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

Інакше , сдідуючі проштовхування приведуть до все більшого росту стека ,і можуть викликати переповнення сигмента , виділеного програмою. Це призводить до зависання системи , тому що починають перекриватись області пам ‘яті .

Якщо ж кількість команд pop , більше числа к. .Push ,може бути зникнення стека, що й приведе до зависання програми.

Приклад

push ax ; занести ax , bx , dx в стек

push bx

push dx

; - тут знаходиться програма

pop dx ; вийняти dx, bx , ax із стека.

pop bx

pop ax

Тут зрозуміло ,що команди між push i pop будуть використовувати регістри ax. bx i dx;

тому для збереження початкових значень вони проштовхуютья в стек . Потім ці ж регістри у зворотньому порядку виштовхуються із стека відновлюються початкові значення і підтримуючи стек в правильному стані ( состоянии ).

Перестановка даних ( команда xchg)

Команда xchg -міняє місцями значення двох регістрів або значення регістра з байтом або словом , яке зберігається в пам’ яті .

Приклад

Нехай , ми хочемо переставити значення в регістрах dx i ax. Використовуючи xchg , можна

записати :

xchg ax , dx ; ax ¬ dx ; dx ¬ ax

( порядок операндів не грає ролі )

Інакше , для перестановки двох 16 - бітових регістрів , можна використати менш ефективний метод який використовує стек як поміжкове місце збереження одного з значень.

push ax ; стек ¬ ax

mov ax,dx , ax ¬ dx

pop dx ; dx ¬ ( стек початкове значення ax ).

Приклад

Для перестановки двох 8 - бітових значень необхідний третій регістр , так як в стек можна проштовхувати , виштовхувати тільки 16 - бітні слова .

Щоб переставити два байти в al i ah, не використовучи xchg потрібно записати:

mov bh, ah ; bh ¬ ah

mov ah, al ; ah ¬ al

mov al, bh ; al ¬ bh

При використанні xchg цього не потрібно .

Приклад

Крім перестановки значень регістрв , xchg також може міняти місцями значення врегістрі

з значенням , яке зберігається :

1) xchg ax,[ things ] ; ax Ö [ things ]

2) xchg [ oldCount ],cx ; cx Ö [ oldCount ]

Команди для роботи з рядками

Команди для роботи з рядками можуть служити для обробки всіх типів даних, а не тільки символьних рядків. В Асемблері рядки є послідовностями байтів, які можуть або представляти, або не представляти ASCII-символи. Рядкові команди діляться на три групи: