- •Регістри загального призначення процесора 8086
- •Р егістри спеціального призначення процесора 8086
- •Набір інструкцій процесора
- •Xchg ах, bx ; Міняємо місцями вміст ах і bx
- •Визначення даних
- •Виклик функцій bios і операційної системи
- •Директиви segment, assume, end і .386
- •Приклад визначення сегменту:
- •X db ? ; байт пам'яті, початкове значення якого не визначено
- •Управління пам'яттю процесора
- •Типи адресації 8086
- •Типи адресації 80386
- •Контроль над програмним потоком
- •Команди переходу після зіставлення чисел з урахуванням знака:
Набір інструкцій процесора
Процесори Intel x86 можуть виконувати безліч різноманітних команд, кількість яких в сучасних моделях перевищує декілька сотень. Ці команди, так звані інструкції процесора, виконують різні дії над регістрами, пам'яттю або системою в цілому. Вони прочитуються процесором з пам'яті, у вигляді машинного коду. Інструкції можуть мати один або два операнди, а можуть і зовсім не мати операндів.
Будь-який рядок програми, що визначає виконання команди процесора може бути записаний по наступній схемі:
Кожна команда процесора представляється своєю мнемонікою (ім'ям), за якою слідують через кому операнди. Наприклад, команда MOV копіює дані з одного місця в інше.
MOV <куда> <откуда>
Як перший операнд може виступати будь-який регістр або адреса в пам'яті, куди необхідно провести запис значення, а другим операндом може бути регістр, адреса в пам'яті або константа, які визначають це значення.
Важливо помітити, що командою MOV неможливо записати дані з пам'яті в пам'ять.
Приклад фрагмента програми, використовуючої MOV:
MOV АХ, BX ; Копіювання вмісту BX в АХ
MOV DH, CL ; Копіювання вмісту CL в DH
MOV EAX, 50 ; Запис в EAX числа 50
MOV [100h], DI ; Кладемо в пам'ять за адресою 256 вміст DI
Цікава ситуація виникає, при записі в пам'ять константи. Процесору необхідно знати розмір цієї константи (в байтах), а транслятор сам не може його визначити. Дійсно, наприклад, число 10 може займати як один, так і два або навіть чотири байти. Тому необхідно в тексті програми уручну вказати цей розмір, використовуючи директиву вказівки типу PTR.
<byte/word/dword> PTR константа
Слова byte, word або dword визначають розмір константи. Вони означають один, два або чотири байти відповідно.
MOV [10h], byte PTR 10 ; Запис 10 в один байт за адресою 16
MOV [10h], word PTR 10 ; Запис 10 в два байти за адресою 16
MOV [10h], dword PTR 10 ; Запис 10 в чотири байти за адресою 16
Найпоширеніші помилки, зв'язані з використанням команди MOV:
MOV АХ, BH ; Копіювання в 16-бітовий регістр 8-бітового
MOV CL, SI ; І навпаки
MOV DH, 10000 ; Запис в регістр числа, що перевищує його розмір
MOV [600], 87 ; При записі в пам'ять не вказаний розмір константи
MOV [30] [90] ; Копіювання з пам'яті в пам'ять
MOV 10, АХ ; Не можна писати в константу
Окрім інструкції MOV існує корисна інструкція XCHG, яка має такий же синтаксис, як і MOV, і здійснює не копіювання, а обмін даними.
Xchg ах, bx ; Міняємо місцями вміст ах і bx
Також, при написанні програм широко застосовуються так звані арифметичні і логічні команди. Ці команди в основному мають два операнди, правила завдання яких аналогічні правилам для інструкції MOV. Над цими операндами виконується деяка арифметична або логічна дія, і потім, як правило, результат зберігається в першому з них. Розглянемо арифметичні і логічні команди:
Арифметичні инстукции |
|
ADD А, B |
А = А + B |
SUB А, B |
А = А – B |
INC А |
А = А + 1 |
DEC А |
А = А – 1 |
Логічні інструкції |
|
AND А, B |
А = логічне «И» (А, B) |
OR А, B |
А = логічне «АБО» (А, B) |
XOR А, B |
А = що виключає «АБО» (А, B) |
NOT А |
А = логічне не А |
Наприклад, для обчислення виразу АХ = (30 – SI) «И» (BH + 1) :
MOV АХ, 30 ; Кладемо в АХ 30
SUB АХ, SI ; Віднімаємо з АХ SI
INC BH ; Додаємо до BH 1
; для того, щоб виконати «И», необхідно, щоб другий операнд теж мав розмір
; два байти. Для цього, переписуємо BH в BL, а в BH записуємо нуль.
XOR BL, BL ; Більш швидкий варіант MOV BL, 0
XCHG BL, BH ; Міняємо місцями BH з BL
; Тепер в BX лежить потрібне значення
AND АХ, BX ; В АХ одержуємо результат.