Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МП-сист_ЛР-1_Сист команд.docx
Скачиваний:
1
Добавлен:
18.11.2019
Размер:
83.26 Кб
Скачать

Міністерство освіти і науки, молоді та спорту україни Національний університет "Львівська політехніка"

Інститут екології, природоохоронної діяльності та туризму ім. В.Чорновола

Кафедра “Загальної екології та екоінформаційних систем”

Інструкція до лабораторної роботи №1

з дисципліни « Мікропроцесорні системи »

Тема. "Практичне застосування команд однокристального мікроконтролера.

Табличне асемблювання програм, написаних на мові Асемблера"

Для студентів базового напряму 6.0915 „Комп’ютерна інженерія”

Затверджено

на засіданні кафедри ЗЕС

Протокол № 1 від ____.08.2012 р.

Львів – 2012

  1. Мета роботи.

1.1. Вивчення та практичне застосування команд однокристального мікроконтролера сімейства MCS-51 (МК51).

1.2. Засвоєння методики табличного асемблювання програм, написаних на мові Асемблера

  1. Короткі теоретичнi відомості.

2.1. Система команд МК51

2.1.1. Система команд МК51 містить 111 базових команд, які вигідно розділити по функціональних ознаках на п'ять груп: команди передачі даних, арифметичних операцій, логічних операцій, передачі управління та операцій з бітами. До складу системи команд МК51 входять команди множення, ділення, додавання та віднімання, операції над бітами, опе­рації зі стеком та розширений набір команд передачі керування. Більшість команд (94) мають формат один або два байти і виконуються за один або два машинних цикли. При тактовій частоті 12 МГц тривалість машинного циклу складає 1 мкс.

Мікроконтролер оперує командами тринадцяти типів:

Тип 1

КОП

Тип 2

КОП

#d8

Тип 3

КОП

ad

Тип 4

КОП

bit

Тип 5

КОП

rel

Тип 6

a10 . a8 КОП

a7...a0

Тип 7

КОП

ad

#d8

Тип 8

КОП

ad

rel

Тип 9

КОП

ads

add

Тип 10

КОП

#d8

rel

Тип 11

КОП

bit

rel

Тип 12

КОП

ad16h

ad16l

Тип 13

КОП

#d16h

#d16l

Перший байт команди любого типу і формату завжди містить код операції (КОП). Другий та третій байти містять або адреси операндів, або безпосередні операнди.

2.1.2. Типи операндів. Склад операндів МК51 включає в себе операнди чотирьох типів: біти, 4-бітні цифри, байти та 16-бітні слова. МК51 має 128 програмнокерованих прапорців користувача (20 – 2F). Можли­ва також адресація окремих біт блока регістрів спеціальних функцій і портів (*ACC, *B, *PSW, *P0, *P1, *P2, *P3, *IP (регістр пріоритетів), *IE (регістр маски переривань), *TCON (регістр керування /статусу таймера), *SCON (регістр керування прийомо-передавачем),. Для адресації біт використовується пряма 8-бітна адреса (bit). Непряма адресація біт неможлива. Чотирибітні операнди використовуються тільки при операціях обміну (команди SWAP та XCHD). Восьми­бітним операндом може бути комірка пам'яті програм або даних (резидентної або зовнішньої), константа (безпосередній операнд), регістри спеціальних функцій (РСФ), а також порти вводу/виводу. Порти та РСФ адресуються тільки прямим способом. Байти пам'яті можуть адресуватися також непрямим способом через адресні регістри (R0, R1, DPTR та PC). Двобайтні операнди - це константи та прямі адреси, для представлення яких використовуються другий та третій байти команди.

2.1.3. Способи адресації даних. пряма, безпосередня, непряма та неявна.

Система команд МК51 допускає велику кількість комбінацій способів адресації операндів в командах, що робить її гнучкою та універсальною.

Прапорці результату. Слово стану програми (PSW) включає в себе чотири прапорці: С - перенос, АС - допоміжний перенос, OV - переповнення та Р - паритет.

Прапорець паритету напряму залежить від поточного значення акумулятора. Якщо число одиничних біт акумулятора непарне то прапорець Р встановлюється, а якщо парне - скидується. Прапорець Р не може бути змінений примусово. При виконанні операцій множення та ділення прапорець С скидається. Прапорець ОV встановлюється, якщо результат операції додавання/віднімання не вкладається у сім біт і старший (восьмий) біт результату не може інтерпретуватися як знаковий. При виконанні операції ділення прапорець ОV скидується, а у випадку ділення на нуль - встановлюється. При множенні прапорець ОV встановлюється, якщо результат більший 255.

Всі команди, в результаті виконання яких модифікуються прапорці, перераховані в таблиці:

Команди

Прапорці

Команди

Прапорці

ADD, ADDC, SUBB

C, OV, AC

CLR C

C = 0

MUL, DIV

C = 0, OV

CPL C

C = C

DA , RRC, RLC

C

ANL C,b; ANL C,/b; ORL C,b; ORL C,/b

C

SETBC

C = 1

MOV C,b; CJNE

C

В таблиці відсутній прапорець паритету, так як його значення змінюється всіма командами, які змінюють вміст акумулятора. Крім ко­манд, наведених в таблиці, прапорці модифікуються командами, в яких місцем призначення результату визначені PSW або його окремі біти, а та­кож командами операцій над бітами.

Символічна адресація. При використанні асемблера МК51 (X8051) для отримання об'єктних кодів допускається використання в програмах символічних імен РСФ, портів та їх визначених біт.

Для адресації окремих біт РСФ та портів (така можливість є не у всіх РСФ) можна використати символічне ім'я біту такої структури:

<ім'я РСФ або порту>. <номер біта>

Наприклад, символічне ім'я п'ятого біта акумулятора буде таким: АСС.5. Символічні імена РСФ, портів та їх біт є зарезервованими слова­ми для асемблера, і їх непотрібно визначати за допомогою директив асемб­лера.

2.1.4. Група команд передачі даних. Більшу частину команд цієї групи складають команди передачі та обміну байт. Команди пересилки біт представлені в групі команд бітових операцій. Всі команди цієї групи не модифікують прапорців результату, за винятком команд заван­таження PSW та акумулятора (прапорець паритету).

Передачі даних в МК51 можуть виконуватися без участі акумулятора.

Звертання до акумулятора може бути виконано в К51 з використанням неявної та прямої адресації.

В залежності від способу адресації акумулятора застосовується одне з символічних імен: А або АСС (пряма адреса). При прямій адресації звернення до акумулятора проводиться як до одного з РСФ, і його адреса вказується у другому байті команди.

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

Звернення до зовнішньої пам'яті даних. В МК51 реалізований режим непрямої адресації ЗПД. При використанні команд МОVX @Rі забезпечується доступ до 256 байтів зовнішньої пам'яті даних.

Існує також режим звернення до розширеної ЗПД, коли для доступу використовується 16-бітна адреса, яка зберігається в регістрі-вказівнику даних (DPTR). Команди MOVX @DPTR забезпечують доступ до 65 536 байт ЗПД.

Структура інформаційних зв'язків. В залежності від способу адресації та місця розташування операнду можна виділити дев'ять типів операндів, між якими можливий інформаційний обмін.

2.1.5. Група команд арифметичних операцій. Цю групу утворюють 24 команди, що виконують операції додавання, десяткової корекції, інкременту/декременту байтів множення та ділення байтів. Команди ADD і ADDC допускають додавання акумулятора з великою кількістю операндів. Аналогічно командам АDDC існують чотири команди SUBB, що дозволяють проводити віднімання байтів і багатобайтних двійкових чисел.

В МК51 реалізується розширений список команд інкременту/декременту байтів, команда інкременту 16-бітного регістра-вказівника даних.

2.1.6. Група команд логічних операцій. Цю групу утворюють 25 команд, що реалізують логічні операції над байтами. Існує можливість проводити операцію "виключаюче АБО" із вмістом портів. Команда XRL може бути ефективно використана для інверсії окремих біт портів.

2.1.7. Група команд операцій з бітами. Особливістю цієї групи команд є те що вони оперують однобітними операндами. В якості таких операндів можуть бути окремі біти деяких регістрів спеціальних функцій (РСФ) і портів, а також 128 програмно-досяжних прапорців користувача.

Існують команди скиду (CLR), встановлення (SETB) та інверсії (CPL) біт, а також кон'юнкції та диз'юнкції біту і прапорця переносу. Для адресації біт використовується пряма восьмирозрядна адреса (bit). Непряма адресація біт неможлива.

2.1.8. Група команд передачі керування. До цієї групи команд відносяться команди, що забезпечують умовне і безумовне розгалуження, виклик підпрограм і повернення з них, а також команда порожньої операції NOP. В більшості команд використовується пряма адресація, тобто адреса переходу повністю (або його частина) міститься в самій команді передачі керування. Можна виділити три різновиди команд розгалуження по розрядності вказаної адреси переходу:

  1. Довгий перехід. Перехід по всьому адресному простору ПП. В команді міститься повна 16-бітна адреса переходу (ad 16). Трибайтна команда довгого переходу містить у мнемокоді літеру L(Long). Всього існують дві такі команди: LJMP - довгий перехід і LCALL - довгий виклик підпрограми. На практиці рідко виникає необхідність переходу в межах цілого адресного простору і частіше використовуються скорочені команди переходу, які займають менше місця в пам'яті.

  2. Абсолютний перехід. Перехід в межах однієї сторінки пам'яті програм розміром 2048 байт. Такі команди містять тільки 11 біт адреси переходу (ad11). Команда абсолютного переходу має формат 2 байти. Початкова літер мнемокоду - А(Absolute). При виконанні команди в обчисленій адресі наступної за порядком команди ((PC)=(PC)+2) 11 молодших біт замінюються на ad11 з тіла команди абсолютного переходу.

  3. Відносний перехід. Короткий відносний перехід дозволяє передати керування в межах -128 - +127 байт відносно адреси наступної команди (команди, що іде за порядком за командою відносного переходу). Існує одна команда безумовного короткого переходу SJMP (Short). Всі команди умовного переходу використовують цей метод адресації. Відносна адреса переходу (rel) міститься у другому байті команди.

  4. Непрямий перехід. Команда JMP @A+DPTR дозволяє передавати керування за непрямою адресою. Ця команда вигідна тим, що надає можливість організації переходу за адресою, яка вираховується самою програмою і невідомою при написанні вихідного тексту програми.

  5. Умовні переходи. Розвинута система умовних переходів дає можливість робити розгалуження на таких умовах: акумулятор містить нуль (JZ); вміст акумулятора не дорівнює нулю (JNZ); перенос дорівнює одиниці (JC); перенос дорівнює нулю (JNC); адресований біт дорівнює одиниці (JB); адресований біт дорівнює нулю (JNB).

Для організації програмних циклів зручно користуватись командою DJNZ. В якості лічильника циклів в МК51 може використовуватись не тільки регістр, а й прямоадресований байт (наприклад, комірка РПД).

Команда CJNE ефективно використовується в процедурах очікування якоїсь події. Наприклад, команда WAIT: CJNE A,P0,WAIT буде виконуватись доти, доки на лініях порту 0 не встановиться інформація, співпадаюча з вмістом акумулятора.

Всі команди цієї групи, за виключенням CJNE і JBC, не діють на прапорці. Команда CJNE встановлює прапорець С, якщо перший операнд виявляється менший другого. Команда JBC скидає прапорець С у випадку переходу.

Підпрограми. Для звернення до підпрограм необхідно використати команди виклику підпрограм (LСАLL, ACALL). Ці команди на відміну від команд переходу (LJMP, AJMP) зберігають в стеку адресу повернення в основну програму. Для повернення з підпрограми треба виконати команду RET. Команда RETI відрізняється від команди RET тим, що дозволяє переривання обслуженого рівня.

2.2. Процедура асемблювання програми

2.2.1. В ЕОМ всі команди представлені машинним (двійковим) кодом. Для полегшення запам'ятовування команд в мові Асемблера використовуються мнемокоди команд, які являють собою скорочення від повного англійського найменування команди. Для представлення символьної інформації використовується код КОІ-7.

Результатом асемблювання програми, написаної на мові Асемблера є об'єктний код програми, тобто її машинний (двійковий) код.

Мова асемблера ізоморфна машинній мові, тобто кожній команді (оператору) мови асемблера відповідає, як правило, одна машинна команда.

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

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

Друге поле (поле операндів) вміщає мнемонічний код операції, що реалізується поточним оператором.

Третє поле (поле операндів) задає аргументи виконуваної операції. Операнд може бути заданий безпосередньо або у вигляді його адреси (прямої або непрямої). Безпосередній операнд представляється числом або символічним іменем. Якщо операнд задається числом, перед ним записується символ “#. Пряма адреса може бути задана мнемонічним позначенням, числом, символічним іменем. Ознакою непрямої адреси є символ “@. У командах передачі керування операндом може бути число, мітка, непряма адреса. Числа повинні вказуватись з ознакою системи числення.

Четверте поле (поле коментарів) не впливає на об'єктну програму і використовується для запису коментарів. Починається з “;”.

Програма на мові асемблера звичайно вміщає два типа символів: завчасно визначені і приписані сегментам даних і команд програмістом.

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

2.2.3. Псевдокоманди.. Асемблююча програма транслює вихідну програму в об’єктні коди. Хоча транслююча програма бере на себе багато рутинних завдань програміста, таких, як присвоєння дійсних адрес, перетворення чисел, присвоєння дійснмх значень символьним змінним та ін., прграміст все ж повинен вказати їй деякі параметри: початкову адресу програми, кінець програми тощо. Всю цю інформацію програміст вставляє у вихідний текст своєї програми у вигляді псевдокоманд (директив) Асемблера, які тільки керують процесом трансляції і не перетворюються у коди об’єктної програми.

Оператори мови асемблера, які використовуються для керування програмою, можна класифікувати таким чином: визначення імен (EQU, SET, BIT); визначення даних (DB, DW); визначення пам'яті (DS); закінчення асемблювання (END); керування програмними сегментами (ORG).

Псевдокоманди визначення імені. Асемблер автоматично присвоює значення іменам, які визначені як мітки команд. Ці значення визначаються такими, що дорівнюють поточному значенню лічильника команд у процесі асемблювання команди. Але у програмі можна визначити інші імена і присвоїти їм значення, використовуючи псевдокоманди EQU, REG i SET. Імена, що визначені псевдокомандами EQU та REG, не можуть бути перевизначені під час поточного процесу асемблювання. Якщо ж ім'я визначене псевдокомандою SET, воно може бути в подальшому багаторазово перевизначене. Імена, визначені псевдокомандами

EQU, REG i SET, не повинні відділятись двокрапкою від псевдокоманди.

Псевдокоманда EQU присвоює розташованому у полі мітки імені значення у полі операнду. Наприклад, псевдокоманда:

ONES EQU FFh

помістить ім'я ONES у таблицю символів і надасть йому значення FF.

Вираз у полі операнду не може бути зовнішнім іменем або включати зовнішнє ім'я. Обчислення значення виразу у псевдокоманді EQU робиться по модулю 2 16, і, таким чином, воно завжди знаходиться в межах від 0 до 65 535 включно.

Псевдокоманда SET присвоює імені у полі мітки значення виразу, розташованого в полі операнду. Асемблер вводить це ім’я в таблицю символів і кожний раз, коли вираз для цього імені обчислюється заново, асемблер заміняє це значення в таблиці. Функції псевдокоманди SET ідентичні функціям псевдокоманди EQU, за виключенням того, що одне й теж саме ім'я може бути багаторазово перевизначено псевдокомандами SET у процесі асемблювання. Значення виразу завжди обчислюється по модулю 2 16.

KRIST SET 5Dh ;визначення імені KRIST

MOV A,#KRIST

KRIST SET 10h-6Q ;перевизначення KRIST

MOV A,#KRIST

ERROR_FL REG 25h.3 ;визначення біту ERROR_FL

Оператори визначення даних та пам'яті

Оператори DB (визначення байта) і DW (визначення слова) дозволяють визначити дані в програмі, DS - резервує пам'ять. В полі операнду дані можуть бути специфіковані або виразами, або рядками символів.

Оператор DB. Специфіковані оператором DB дані розташовуються послідовно в пом'яті починаючи з адреси, вказаної значенням лічильника команд.

Поле операндів DB може містити список, який включає до восьми виразів і (або) рядків, розділених комами. Оскільки довжина оператора DB обмежена, не завжди існує можливість помістити всі вісім елементів списку в одному рядку. Це питання вирішується використанням двох, або більшої кількості операторів DB з коротшим списком виразів.

Значення виразу повинно знаходитися в межах від -256 до 255 включно. Ім'я мітки у полі вказує на початкове значення лічильника команд і адресує перший байт, що розміщається у пам’яті оператором DB.

HERE: DB 0A3h

CONST: DB -03h, 5*2

Оператор DW визначає в пам’яті 16-бітові значення зі списку виразів поля операнду, починаючи з поточного значення лічильника команд. Молодші 8 біт першого виразу запам'ятовуються за адресою, що визначена біжучим значенням лічильника команд, а старші 8 біт - у наступному байті пам'яті. Такий процес повторюється до тих пір, поки не буде розміщений весь список, який може містити до восьми елементів.

Елемент списку виразів у цьому операторі означає одне слово (16 біт, 2 байта), яке як правило є адресою. Якщо значенням виразу є однобайтними даними, то вони доповнюються старшим нульовим байтом до слова.

Якщо в полі імені присутня мітка, їй присвоюється значення адреси першого байта що розміщається по даному оператору DW виразу (це молодший байт значення першого виразу у списку). Нехай COMP i FILL - мітки, що визначені раніше у програмі. Мітка COMP має значення 3В1С, мітка FILL - 3EB4. Тоді в результаті асемблювання чотирьох операторів будуть отриманні такі коди програми:

3В1С ADDR: DW COMP

3EB4 FILL: DW FILL

Оператор DW звичайно використовують у програмі для запам'ятовування адрес.

Оператор DS застосовують для визначення резервних областей пам'яті, що використовуються для розміщення даних у процесі виконання програми.

Значення виразу визначає число байт, які повинні бути зарезервовані у пам'яті. Любе ім'я, що зустрічається у полі операндів, повинно бути попередньо визначено в ході асемблювання до використання оператора DS. На відміну від операторів DB i DW оператор DS не визначає які-небудь дані програми при асемблюванні. Вміст пам'яті, що зарезервована, попередньо непередбачуваний, якщо програма не виконує її початкову установку. Якщо у полі імені присутня мітка, її значення буде вказувати на перший байт зарезервованої області (воно дорівнює значенню лічильника команд). Якщо значення виразу дорівнює 0, то пам'ять не резервується, але в випадку присутності мітки їй присвоюється значення лічильника команд. При асемблюванні директиви DS лічильник команд збільшується у відповідності зі значенням, вказаним в операнді.

BUFF: DS 72 ;РЕЗЕРВУВАННЯ 72 БАЙТ ДЛЯ БУФЕРА

Псевдокоманда припинення асемблювання. Псевдокоманда END фіксує кінець програми і завершує процес перегляду асемблером тексту програми на мові асемблера. В програмі може бути використана тільки одна псевдокоманда END, і вона повинна бути останнім оператором.

Псевдокоманда керування програмними сегментами. Псевдокоманда ORG встановлює лічильник команд у відповідності зі значенням виразу у полі його операнду.

У процесі асемблювання значення виразу завжди вираховується по модулю 2 16. Любе ім'я, що входить у вираз, попередньо повинно бути визначено. Наступна машинна команда або данні будуть асембльовані з вказаної адреси. В програму може бути введено довільне число псевдокоманд ORG, які не обов'язково розміщувати в зростаючий за адресами послідовності, але слід попередити можливість перекриття програмних ділянок. Якщо в псевдокоманді ORG є мітка, їй присвоюється значення лічильника команд в момент появи псевдокоманди.

2.2.4. В результаті трансляції буде отримана карта пам’яті програм, де кожній комірці поставлений у відповідність код, що в ній зберігається. У відповідності з форматом команд для представлення їх об’єктних кодів відводяться одна, дві або три комірки пам’яті. В першій – завжди код операції. У другій (і третій) – безпосередній операнд, адреса прямоадресованого операнду, адреса переходу.

Записана версія програми повинна бути переведена в об'єктний (машинний) код вручну або за допомогою спеціальної програми.

2.2.5. Вручну це робиться таким способом:

1) Знаходиться код операції (КОП) кожної мнемоніки по таблиці машинних кодів (див. додаток).

2) Визначаються операнди (дані та адреси) для дво- і трибайтних команд.

3) Визначаються адреси пам'яті для кожних команд та операндів.

4) Визначені адреси та коди записуються відповідно у полі адрес та полі кодів, що заходяться зліва від поля міток, за таким зразком:

поле поле поле поле поле поле

адрес кодів міток команд операндів коментарів

--------------------------------------------------------------------

8000 74 81 mov a,#81h ;загрузка акумулятора

8002 F5 90 mov p1,a ;вивід на порт Р1

8004 E5 80 cikl: mov a,p0 ;зчитування порту Р0

8006 F5 F0 mov b,a ;пересилка в регістр B

8008 53 F0 25 anl b,#25h ;B  25h

8009 85 80 F0 mov p3,b ;вивід на порт P3

800B 02 80 04 jmp cikl ;зациклювання

--------------------------------------------------------------------

Документ, що вміщає програму, написану в мнемонічних кодах, і об'єктні коди, називається лістингом програми.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]