Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБОРАТОРНА РОБОТА общее.doc
Скачиваний:
33
Добавлен:
18.03.2015
Размер:
5.16 Mб
Скачать

Мови програмування

Мова, "зрозуміла" МП, на якому пишуться програми, називається машинною мовою /машинним кодом/. Тому що МП має справу безпосередньо із цифровими сигналами, то команди машинної мови закодовані у двійковому коді, наприклад 00111100. Людині важко користуватися машинною мовою, оскільки запис 00111100 - мало наочний. Можна полегшити роботу, уживаючи шістнадцяткову систему, заміняючи 00111100 на "ЗС". Однак цього ще недостатньо для розпізнавання команди. Наступний крок - заміщення командного коду коротким ім'ям, що називається мнемонікою. Наприклад, код "ЗС" для МП КР580ИК80 означає збільшення вмісту регістра Н и позначається як INR А. Мнемоніка набагато легше для запам'ятовування, ніж машинні коди. Заміняючи кожний код мнемонікою, можна написати програму. Мнемоніка може бути легко перетворена в машинні коди після написання програми. От чому не обов'язково запам'ятовувати машинні коди, а мнемонічне значення кожної команди запам'ятати легко. Програми, написані з використанням мнемоніки, називають програмами мовою Асемблер. Машинна мова звичайно визначається призначенням МП і не може бути змінений. Асемблер створюється при виробництві МП для зручності програміста, але не передбачається призначенням пристрою. Наприклад, можна записати INC А замість INR А, і обоє вираження будуть переведені в машинний код "ЗС". Хоча Асемблер має більші переваги перед машинною мовою, вона важка при написанні складних програм. Щоб полегшити програмування, були створені мови високого рівня. Вони схожі на англійську мову й зовсім не залежать від типу МП. Типовою командою може бути LET COUNT=10 або PRINT COUNT. Ці команди припускають набагато більше складні дії, чим ті, що може "зрозуміти" МП. От чому мікро-ОЕМ, що використовують мови високого рівня, також містять довгу складну програму /постійно зберігається в їхній пам'яті/, що переводить програму з мови високого рівня на машинну мову. Прості команди, написані на мові високого рівня, можуть переводитися в десятки команд машинною мовою. Такий транслятор програми називається компілятором.

Приклади програмування

На мал.4 наведена структурна схема програми, що рахує до 10. цій програмі немає початку й кінця, зміст комірки просто нарощує від 0 до 10 і потім все повторюється /види програм та програмування будуть більш детально розглядатися в наступних розділах/.

Перехід від структурної схеми до мови високого рівня дуже простий. Наступний приклад показує варіант мови високого рівня, що називається BASIC, що володіє перевагою, що полягає в простоті й схожості з англійською мовою.

Таблиця 1. Лістинг програми.

Перші рядки програми точно відповідають двом першим блокам схеми. У першому рядку в комірку пам'яті, позначену COUNT, засилається 0. Другий рядок LET COUNT= COUNT+1 - це просто спосіб позначення рахунку. Третій і четвертий рядки виконують функції перевірочного блоку. Третій рядок перевіряє, чи рівняється COUNT 10. Якщо COUNT=10 то виконується команда, записана в першому рядку. Якщо ж COUNT10, то ця команда не виконується, а виконується рядок 4. Ця команда говорить: "Перейди на рядок 2". Таким чином, дві ці команди виконують дії, необхідні блоком перевірки в структурній схемі. Якщо простежити програму крок за кроком, можна побачити, як відбувається нагромадження результату рахунку.

Кожний МП має власну машинну мову, тобто власний Асемблер. У даному прикладі використовується Асемблер МП КР580ИК80, на якому розроблен "Микролаб".

У табл.2 наведений лістинг програми рахунку до 10 мовою Асемблер

Таблиця 2

Лістинг програми рахунку до 10 мовою Асемблер

Ця програма менш зрозуміла, чим та ж програма мовою BASIC, хоча виконує ту ж функцію, тому що BASIC ближче до англійської мови, чим до машинної мови МП. Три стовпці - це мітки, команди й коментарі. Мітка виконує ту ж функцію, що й номер рядка. Замість нумерації кожного рядка потрібно вибрати мітку /ім'я/ для кожного рядка, на яку необхідно буде послатися. Символ «;» використовується для розпізнавання мітки. Мітка в рядку необхідна, тільки якщо в програмі присутня команда, що посилається на цей рядок. Мітка дозволить легше розпізнати рядок, на яку ви хочете перейти при виконанні програми. Коментарі служать для полегшення сприйняття програми. Символ «;» ідентифікує початок коментарю. Програма на мові високого рівня не вимагає великої кількості коментарів, оскільки команди самі по собі зрозумілі.

Для програми мовою Асемблер, однак, коментарі необхідні. Вони корисні для всіх, кому потрібно зрозуміти програму, або для програміста, якому треба повернутися до цієї програми після закінчення деякого часу. Перша команда MVI А, О /безпосереднє засилання в акумулятор О/. Акумулятор /що називається А-Регістром/ - це місце зберігання даних у МП. Ця команда еквівалентна команді LET COUNT=0, за винятком того, що замість ім'я змінної COUNT використовується позначення А для внутрішнього регістра МП. Пізніше буде сказано, чому цей регістр називається акумулятором. Зараз для простоти приймемо, що це місце в МП, куди завантажуються нульові дані. Наступна команда INR А означає збільшення вмісту акумулятора. Акумулятор містить результат рахунку, так що ця команда еквівалентна .команді LET COUNT=COUNT+1. Всі три наступні команди виконують функцію перевірки. Команда CPI 10 /безпосереднє порівняння/ означає порівняння величини в акумуляторі із числом 10. Вона не викликає переходу залежно від результату порівняння, а замість цього встановлює спеціальний тригер, називаний прапором, якщо величина в регістрі А дорівнює 10. Наступна команда JZ START перевіряє цей прапор. Якщо числа рівні, ця команда визначає, що прапор установлений, і викликає перехід на рядок з міткою START. Обидві ці команди /CPI 10 JZ START/ виконують функцію оператора IF COUNTED0 THEN 1 мовою BASIC.

Остання команда JMP LOOP просто забезпечує перехід на рядок з міткою LOOP.

Це еквівалентно операторові GO T02 мовою BASIC.

Розглянута програма в машинних кодах наведена в таблиці 3.

Функції цієї програми не змінилися, а особливості роботи з машинною мовою тепер очевидні. Однак причина використання цієї мови істотна: МП "розуміє" тільки його. Відзначимо, що вміст комірок пам'яті наведено в таблиці в шістнадцятковому коді, а МП "розуміє" тільки двійковий код. Значить шістнадцятковий машинний код повинен бути переведений у двійковий.

Кожна комірка пам'яті в " Мікролабі" містить 8 біт інформації /що може бути представлено двома шістнадцятковими символами/, Кожна команда починається з коду операції, необхідного для виконання команди.

Усі коди операцій /КОП/ для КР580ИК80 мають 8 біт у довжину й займають одну комірку пам'яті. За КОП можуть піти О; 1 або 2 байти даних залежно від команди. Перший байт /ЗЕ/ за адресою 8000 - це КОП для команди MVI А. Однак це тільки частина всієї команди. Він інформує про те, що необхідно помістити деяку інформацію в акумулятор. Далі потрібно інша комірка пам'яті для завантаження самої цієї інформації. Отже випливає що комірка пам'яті /адреса 8001/ містить 00 - дані, необхідні для засилання в акумулятор. Третя комірка містить КОП другої команди INR А. Цей КОП /ЗС/ "наказує" МП збільшити вміст акумулятора. Тому що в цій команді не є додаткової інформації, вона займає тільки одну комірку пам'яті. Код FE - це КОП для команди порівняння CPI. Як і в команді MVI А, тут за КОП випливають додаткові дані для її виконання, яким приділяється ще одна комірка пам'яті. Внаслідок шістнадцяткового подання інформації число 10 виражається як ОА. Команда порівнює вміст акумулятора із числом 10 і встановлює прапор /як це було описано вище/, якщо вони рівні. Команда JZ має КОП СА, що має адресу 8005. Цей КОП інформує МП про необхідність переходу, якщо прапор установлений. У наступних двох комірках пам'яті зберігається адреса, на який потрібно перейти. Оскільки довжина адреси для КР580ИК80 16 битов, потрібно два осередки /по 8 біт/ для зберігання адреси. Частини адреси зберігаються у зворотному порядку: молодші розряди записуються в першу чергу, старші - слідом за ними. Таким чином, адреса 8000 зберігається у вигляді 00 80. Команда Асемблера JZ START означає, що МП повинен перейти до команди з міткою START. Далі програма повинна зчитувати КОП з комірки, що відповідає мітці START /8000 у нашім випадку/. Остання команда JMP LOOP закодована в такий же спосіб. Різниця лише в тому, що цей перехід не залежить від яких-небудь умов. Код такого типу переходу -СЗ. Адреса переходу /8002/ зберігається в комірках пам'яті так само, як і для команди JZ.

Відзначимо, що програма машинною мовою складається з послідовностей байтів, кожний з яких може мати одне із трьох значень: КОП, дані, адреса переходу. Електричні схеми МП визначають, що повинне випливати за КОП - або дані, або адреси, і "пам'ятають" про це.

З вище сказаного слідує, що мови високого рівня набагато легше для програміста й не залежать від приватного виду МП. Однак переведені в машинний код програми займають багато місця в пам'яті; крім того, потрібно мати довгі програми - транслятори. Мови високого рівня також менш ефективні в змісті швидкості виконання операцій і розподілу пам'яті. Еквівалентна програма, написана мовою Асемблер, виконується значно швидше й займає менше пам'яті. Асемблер широко використовується для програмування на мікро-ЕОМ. Він більше важкий для написання програм, чим мова високого рівня, однак він легше для перекладу в машинні коди. Там, де необхідно швидше й ощадливіше виконати програми, Ассемблер незамінний. Програмування на Асемблері допоможе опанувати навичками роботи з мікропроцесорними системами.

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

Таким чином, безпосередньо в "Мікролаб" вводяться програми тільки машинною мовою. Для машинних кодів використовується шістнадцяткове подання як більше легке в порівнянні із двійковим. "Мікролаб" має матзабезпечення для порівняно простого перекладу із шістнадцяткового у двійковий код.

Проведемо експеримент по перевірці змісту частини пам'яті "Мікролаб". Для цього необхідно:

1. Нажати кнопку СКИДАННЯ;

2. Нажати кнопку 5, 5, УСТ.АД. Це означає, що треба перевірити адресу 0055. Дані, які зберігаються по цій адресі /31/, можна побачити на двох крайніх правих індикаторах;

3. Для перевірки наступної комірки нажати кнопку АД +. На тих же двох правих індикаторах можна побачити зміст наступної комірки;

4. Натискаючи кнопку АД. +, переглянути частину програми й зрівняти її з роздруківкою програми монітора, наведеної в технічному описі "Мікролаб";

5. Простежити в роздруківці монітора відповідність машинних кодів і мнемоніки /коди команди наведені в додатку/