Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МПТ.doc
Скачиваний:
71
Добавлен:
03.11.2018
Размер:
20.52 Mб
Скачать
  1. Основи програмування на мові Асемблера

Мова асемблера є мовою символьного кодування, яка дозволяє суттєво спростити процес програмування МПС. Головна його перевага в тому, що асемблер допускає представлення всіх елементів програми в символьній (буквено-цифровій) формі, яка відображає їх зміст. Перетворення символьних найменувань в двійкові коди машинної мови (об`єктна програма) забезпечує спеціальна програма, яку називають асемблером. Програма-асемблер діє як ‘компоновщик’, що об’єднує елементи програми в конкретні машинні команди.

Символьні імена, що вводяться при програмуванні на асемблері, мають багато синонімічних назв-ідентифікатори, символи, мітки тощо. В асемблері прийнято символічне позначення адреси називати міткою, а символьне позначення коду операції - кодом.

Довжина символьних найменувань, що містить букви і цифри, обмежена 5-6 символами, першим з яких завжди є буква. Для кожного МП деякі символьні найменування фіксовані і часто їх називають ключовими словами. До них відносяться мнемоніки кодів операцій, директиви асемблера і найменування внутрішніх регістрів. Інші символьні позначення означує програміст у відповідності з контекстом програми. Числові дані допускається представляти у двійковій, вісімковій, десятковій і шістнадцятковій системах числення.

Алфавітом допустимих символів в асемблері прийнятий код ASCII (Американський Стандартний Код для обміну інформацією), який містить латинські букви (тільки заголовні), цифри, розділювачі (:,;,,), знаки математичних операцій і спеціальні символи, наприклад CR-повернення каретки. Кожний символ представляється 7 бітами і зберігається в 1 байті пам’яті..

Приведений далі опис асемблера характерний для 8-розрядних процесорів та мікроконтролерів, проте він є ядром асемблерів для мікропроцесорів вищого гатунку.

    1. Формат бланка асемблерної програми

Асемблерна програма записується у вигляді послідовності команд, які називають також операторами і реченнями асемблера; для кожної команди відводиться одна стрічка.

Стандартний блок асемблерної програми містить такі поля:

Мітка

Код

Операнд

Коментар

Іноді поле ‘операнд’ поділяють на два поля ( операнд1 і операнд2). Найчастіше використовують формат з фіксованими полями, кожне з яких має певне число символів в цьому полі.

Поле мітки. Необов’язкове символьне позначення в полі мітки асоціюється з 16-бітовою адресою тієї комірки пам’яті, в яку буде розміщений перший байт відміченої команди. Мітка використовується як адреса переходів команд передачі керування і звільняє програміста від необхідності оперувати абсолютними адресами пам’яті.

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

AGAN:, A15:, C5FA:, M1:.

Оскільки мітка асоціюється з адресами пам’яті, їх не можна дублювати.

Допускається вводити для одного і того ж оператора декілька міток:

Мітка

Код

Операнд

Коментар

LOOP1:

LOOP2:

RAL

***

JMP

LOOP1

***

JNZ

LOOP2

***

Команди JMP i JNZ передають керування (перша-безумовно, друга - при Z=0) одній і тій же комірці пам’яті з командою RAL. Міткам LOOP1 і LOOP2 асемблер присвоює однакове числове значення.

При програмуванні, як правило, вводять мітки для тих команд, яким необхідно передати керування.

Поле мнемоніки (коду). В полі мнемоніки записують символьне позначення виконуваної команди (код операції). Більшість мнемонік представляють собою абревіатури речень, що характеризують основні функції команди, наприклад:

MOV (MOVe)-передати, переслати;

ACI (Add with Carry Immediate)-додавання з переносом безпосереднє;

JNZ (Jump if Non Zero)-перейти, якщо не нуль;

XCHG (Exchange)-обміняти.

Часто довжина поля мнемоніки не перевищує чотирьох позицій, а між ним і сусіднім зправа полем операнда необхідний хоч би один пробіл.

Поле операнда. В цьому полі розміщуються дані, які є операндами (операндом) команди. Таким чином, вміст поля операнда може інтерпретуватися у відповідності з функцією команд. Операндами можуть бути адреси пам’яті, внутрішні регістри МП, адреси портів вводу і виводу, числові символьні константи. Деякі команди, що оперують повними внутрішніми регістрами, мають пусте поле операнда:

Мітка

Код

Операнд

Коментар

СМА

; інвертувати акумулятор

RAL

;; ; з сув вправо через перенос

XTHL

; обмін ( H, L) і SP

Програма - асемблер має знайти двійковий еквівалент вмісту поля операнда і підставити його ( в залежності від типу команди) в певні біти коду операції, в другий байт 2- байтової команди або у другий і третій байт 3- байтових команд. Обраховане двійкове значення вмісту поля операнда вирівнюється зправа і має вкладатись в діапазон, визначений змістом команди. В іншому випадку фіксується хибне поле операнда.

Поле операнда стандартного асемблера МП 8080 може містити інформацію таких типів: числові і символьні безпосередні дані, внутрішні регістри і регістрові пари, адреси пам’яті. Розглянемо способи визначення інформації вказаних типів.

Шістнадцяткові дані. Шістнадцяткове число в полі операнда має починатись з цифр 0-9 і завершуватись буквою Н (Нех). Число, яке починається з букв А-F, доповнюється зліва нулем. Приклади завдання шістнадцяткових чисел:

Мітка

Код

Операнд

Коментар

STORE:

STA

8000Н

; Запам’ятати в комірці 8000

MVI

С,ОААН

; Запам’ятати в регістр

ANI

; С код 10101010

COMP:

CPI

10Н

290Н

; Виділення четвертого біта

; Недопустимий операнд

Десяткові дані. Десяткове число в полі операнду закінчується необов’язково буквою D (Decimal). Приклади завдання десяткових чисел:

Мітка

Код

Операнд

Коментар

MVI

B,15

; Завантажити в регістр В

; код 00001111

ADI

1 D

; інкремент акумулятора

ANI

64

; виділення шостого біту

IN

32

; ввід із порту з адресою ; 00100000

Вісімкові дані. Кожне вісімкове число в полі операнда закінчується буквою О (Octal). Частіше вісімкову систему ідентифікують буквою Q, щоб відрізнити букву О від цифри 0. Приклади вісімкових чисел:

Мітка

Код

Операнд

Коментар

ORI

200Q

; Установка старшого біта

SUI

1Q

; Декремент акумулятора

MVI

H,777Q

; Хибний операнд

Двійкові дані. Двійкове число в полі операнда закінчується буквою В(Binary). Приклади визначення двійкових чисел:

Мітка

Код

Операнд

Коментар

OUT

1111B

; Вивід в порт з адресою 15

XRI

10000000B

; Інверсія знакового біта

ANI

11011111B

; Обнулення п’ятого біта

Символьні константи. В полі операнда допускається використання зовнішнього алфавіту, взятого в апострофи.

Програма-асемблер підставляє замість такого операнда відповідний двійковий код символа:

Мітка

Код

Операнд

Коментар

CPI

.

; Порівняти з кодом крапки

MVI

D,’T’

; Завантажити код букви Т

Ідентифікатори внутрішніх регістрів. В полі операнда потрібно вказувати символьне ім’я, яке визначене в асемблері і зв’язане з внутрішньою архітектурою мікропроцесора. В мову асемблера МП 8080 включені ідентифікатори внутрішніх регістрів В,С,D,E,H,L,M,A з відповідними їм двійковими кодами від 000 до 111.

Приклади використання таких ідентифікаторів:

Мітка

Код

Операнд

Коментар

MOV

A,E

; Передати з регістра Е в А

ADD

L

; Добавити вміст регістра L

SUB

M

; Відняти вміст комірки

; пам’яті, адресованої парою ; HL

Замість ідентифікаторів внутрішніх регістрів допускається використання їх адреси в будь-якій системі числення. Наприклад, наступні команди еквівалентні: MOV A,B; MOV 7,0; MOV 111B,0H, тощо.

В командах, які оперують 16-бітовими значеннями, використовуються ідентифікатори внутрішніх 16-бітових регістрів В,D,H,PSW,SP. Приклади таких команд:

Мітка

Код

Операнд

Коментар

LXI

H,0FF00H

; Ініціалізація пари HL

INX

SP

; Інкремент покажчика стека

PUSH

PSW

; Завантаження в стек вмісту ; А- і F-регістрів

Для однокристальних мікроЕОМ (наприклад МК8051) є певні особливості.Операнд може задаватись безпосередньо або через його адресу (прямо чи опосередковано). Безпосередній операнд задається числом (MOV A, #15) або символьним іменем (ADDC A, #OPER2) з обов’язковим префіксом безпосереднього операнда (#). Пряма адреса операнда може бути задана мнемонічним позначенням (IN A, P1), числом (INC 40), символьним іменем (MOV A, MEMORY). Покажчиком опосередкованої адресації служить префікс @. В командах передачі керування операндом може бути число (LCALL 0135H), (JMP@A+DPTR) (JMP LABEL), (JMP¤-2, де ¤-поточний вміст лічильника команд).

Мітки. В командах передачі керування можна вказувати мітки, які введені програмістом в полі мітки команд. Мітки в полі операнда замінюється абсолютно адресою переходу. Приклади:

Мітка

Код

Операнд

Коментар

JMP

DONE

; Перехід до мітки DONE

***

CALL

SWAP

; Виклик підпрограми SWAP

***

SWAP:

RAR

***

***

MOV

A,M

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

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

¤ і вказаного в операторі зміщення. Зміщення може задаватися в будь-якій із розглянутих форм визначення числових значень. Приклади відносної адресації:

Мітка

Код

Операнд

Коментар

JMP

¤+20H

; Перехід за адресою ;GOTO+20H (‘вперед’)

JNZ

¤-80

; Адреса переходу= МORE-80 ; (‘назад’)

Вирази. Складнішими конструкціями є вирази. Вони містять, як елементи, всі розглянуті вище типи даних, які зв’язуються арифметичними і логічними операторами. Аргументами виразів служать 15-бітові цілі, а значення виразів визначаються 16-бітовими цілими без знаку. Значення виразу має відповідати змісту операції, що визначена в полі мнемоніки.

Результатами арифметичних операторів додавання (+), віднімання (-), множення (*), ділення (/) вважаються, відповідно, арифметична сума, різниця, добуток і частка аргументів. Результатом операції MOD є ціла частка від ділення першого (лівого) аргумента на другий. Унарний оператор ‘мінус’ означає віднімання аргумента від нуля.

Допустимими логічними операторами є такі:

-унарний оператор NOT, який інвертує кожний біт аргумента;

-оператори AND, OR, XOR, які виконують відповідно, побітну кон’юнкцію, диз’юнкцію і додавання по mod2 аргументів;

-оператори зсуву вправо SHR і вліво SHL, які зсувають перший аргумент на число бітів, визначених значенням другого аргумента; звільнені при зсуві біти заповнюються нулями.

Приклади допустимих виразів в полі операнда:

Мітка

Код

Операнд

Коментар

MVI

B,30+40H/2

; Завантаження числа 62

SUI

34 MOD 3

; Декремент акумулятора

Оператори MOD,NOT та інші треба розмежовувати від аргумента пробілом. У виразах іноді допускається використання дужок.

Оператори у виразах підпорядковуються ієрархії: множення, ділення, MOD, зсуви, додавання, віднімання; заперечення, кон’юнкція, диз’юнкція, додавання по mod2.

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

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