- •Регістри загального призначення процесора 8086
- •Р егістри спеціального призначення процесора 8086
- •Набір інструкцій процесора
- •Xchg ах, bx ; Міняємо місцями вміст ах і bx
- •Визначення даних
- •Виклик функцій bios і операційної системи
- •Директиви segment, assume, end і .386
- •Приклад визначення сегменту:
- •X db ? ; байт пам'яті, початкове значення якого не визначено
- •Управління пам'яттю процесора
- •Типи адресації 8086
- •Типи адресації 80386
- •Контроль над програмним потоком
- •Команди переходу після зіставлення чисел з урахуванням знака:
Визначення даних
Для опису простих типів даних в програмі використовуються спеціальні директиви DEFINE резервування і ініціалізації (установки початкового значення) даних. Транслятор, обробляючи таку директиву, виділяє необхідну кількість байт пам'яті і при необхідності ініціалізував виділену область значенням.
Числа в пам'яті записуються у форматі Little Endian – якщо число займає більше одного байта, то в пам'яті ці байти слідуватимуть за старшинством, починаючи з наймолодшим.
Наприклад, число 12345678h в пам'яті буде записаний як 78h, 56h, 34h, 12h.
При завданні рядкових констант, всі символи константи беруться в одинарні або подвійні лапки. В пам'яті символи зберігаються у вигляді числового коду, який визначається по спеціальній таблиці. В операційній системі MSDOS використовується кодування ASCII:
Шесnнадцатеричный код символу формується як строка*16 + стовпець. Наприклад, код символу «S» – 53h.
Загальний синтаксис директиви для визначення даних:
[<имя переменной>] <директива> <значение> [ <значение> ...]
Директива визначає кількість байтів, що виділяються:
Директива |
К-ть байт |
Діапазон для числа із знаком |
Діапазон для числа без знака |
||
DB (байт) |
1 |
-128 |
127 |
0 |
255 |
DW (слово) |
2 |
-32 768 |
32 767 |
0 |
65 535 |
DD (подвійне слово) |
4 |
-2 147 483 648 |
2 147 483 647 |
0 |
4 294 967 295 |
DF, DP |
6 |
–247 |
247 – 1 |
0 |
248 |
DQ |
8 |
–263 |
263 – 1 |
0 |
264 |
DT |
10 |
–279 |
279 – 1 |
0 |
280 |
Значення може бути будь-яким виразом, що містить числові або рядкові константи, а також може бути знайомий «?», це означатиме, що воно невідоме. Якщо в директиві DB підряд йдуть декілька символів, їх можна об'єднати в одні лапки. Так само, якщо підряд йдуть декілька однакових значень, їх можна замінити конструкцією <количество повторов> dup (<значение>)
Приклад визначення даних:
А DB ? ; значення А неістотно при ініціалізації
B DD 1, 2, 3, 4, 40h ; B – масив подвійних слів
З DB ‘X’ ; символ
D DW 12 + ‘XY’ ; вираз
str DB ‘ Строка’ ; еквівалентно str DB ‘ С’, ‘ т’, ‘ р’, ‘ о’, ‘ к’, ‘ а’
buf DD 5 dup (0) ; еквівалентно buf DD 0, 0, 0, 0, 0
Виклик функцій bios і операційної системи
Практично будь-яка програма потребує взаємодії з BIOS або операційною системою (Ос) – вони пропонують програмісту набір вже готових функцій, що дуже зручно, особливо для програмування на асемблері.
Програма «спілкується» з операційною системою MSDOS і BIOS за допомогою інструкції виклику переривання:
INT <номер прерывания>
У ДОС номер програмного переривання – 21h. Багато переривань багатофункціональні, номер функції завжди в регістрі AH. Також дуже важливо запам'ятати, що переривання під час виклику можуть змінити вміст певних регістрів, тому потрібні дані предусмотрительнее буде зберегти в стеку.
Для виходу в операційну систему використовується переривання ДОС. Номер цієї функції – 4ch – повинен бути в AH, а в AL записується код виходу програми (звичайно – нуль, якщо програма виконалася успішно, інакше – код помилки).
MOV АХ, 4c00h ; Кладемо в AH 4ch, а в AL – нуль
INT 21h ; Викликаємо переривання ДОС
Після цих інструкцій програма передасть управління операційній системі, і всі подальші команди виконуватися не будуть.
Розглянемо ще дві корисні функції ДОС – прочитування символу з клавіатури і висновок символу на екран. Для читання, кладемо 1 (номер функції) в AH і викликаємо переривання 21h. Після цього в AL зберігатиметься код ліченого символу. Для висновку, в AH записуємо 2, а в DL – код символу, який потрібно вивести, і потім викликаємо переривання. Наприклад, щоб рахувати символ і тут же вивести його на екран:
MOV AH, 1 ; Код функції прочитування символу
INT 21h ; Викликаємо переривання ДОС
MOV DL, AL ; Кладемо в DL код ліченого символу
MOV AH, 2 ; Код функції висновку символу
INT 21h ; Викликаємо переривання ДОС