Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
А С Е М Б Л Е Р.doc
Скачиваний:
7
Добавлен:
12.08.2019
Размер:
835.58 Кб
Скачать

Набір інструкцій процесора

Процесори 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 ; В АХ одержуємо результат.