Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Способи адресації даних
Система команд МК51 припускає чотири основних типи адресації: - пряму – адреса операнда або переходу міститься в команді; - безпосередню – операнд, що завантажується, міститься в другому або в другому і третьому байтах команди; - непряму – адреса комірки ЗПД (ЗПП) міститься (обчислюється) у якому-небудь спеціальному регістрі, посилання на який міститься в команді; - регістрову – джерелом або приймачем операнда є регістр активного банку, посилання на який міститься в команді. Крім того, у розпорядженні програміста є такі різновиди непрямої адресації: - відносна – у команді міститься не вся абсолютна адреса переходу, а лише зсув у байтах від поточного вмісту PC; - сторінкова – у регістрі-фіксаторі порту Р2 міститься адреса області пам'яті, виведеної на границю блоку розміром 256 бaйтів (так званий номер сторінки), а в іншому регістрі (R0 або R1) міститься зсув по сторінці в байтах. Виконавча адреса комірки пам'яті формується стикуванням вмісту Р2 (старша частина адреси) і вмісту регістрів R0 або R1 (молодша частина адреси); - базова – вказівний регістр DPTR містить початкову (так звану базову) абсолютну адресу області пам'яті, де перебувають дані довільної структури. До адреси бази додається байтове зміщення для визначення адреси потрібної комірки пам'яті. Джерелом зміщення є акумулятор. Зміщення – це беззнакове число в діапазоні 0...255. Використання символічних імен Наявність компілятора Асемблер МК51 передбачає можливість присвоєння символічних імен як байтам РПД, адресам ЗП і РПД, безпосереднім даним (константам), так і окремим бітам. Символічні імена ділять на такі: - зарезервовані (АСС, PSW, SBUF, TCON і т.д.). Багато з таких імен згадувалися при розгляді апаратних ресурсів МК51; - імена, що визначаються користувачем за допомогою директив Асемблера. Таким чином, на рівні Асемблера в команді може бути присутнім або пряма адреса байта, або його символічне ім'я: MOV PSW, #0 та MOV 0D0H, #0 – це те саме. Адресація бітів Всі окремо адресовані біти можна поділити на дві групи: 1) біти з 16-байтової області ОЗП (0...127); 2) біти блоку апаратних регістрів (128...255). Біти із групи 1 доступні шляхом вказівки в команді прямої адреси біта або символічного імені біта, привласненого користувачем раніше. Біти із групи 2 доступні або через пряму адресу біта, або з використанням зарезервованого імені (С, OV, F0). Крім того, адресувати будь-який біт із груп 1 і 2 можна з використанням бітового селектора: - АСС.4 – четвертий біт акумулятора; - PSW.5, TCON.2 і т.д. – з використанням зарезервованого імені регістра; - V1.3, MY_2.0 – з використанням символічного імені, що присвоєне користувачем. Для бітів не допускається непряма адресація! Характеристика функціональних груп команд Всі команди МК51 можна розділити на групи по функціональних ознаках: передачі даних, арифметичних, логічних, бітових операцій, передачі керування. Команди арифметичних операцій, логічні, бітові операції та команди порівняння модифікують чотири прапори, які перебувають у регістрі PSW: Р — жорстко пов'язаний із вмістом акумулятора. Якщо кількість одиниць у ньому непарна, то (Р)=1, інакше (Р)=0; АСС — встановлюється в " 1", якщо при підсумовуванні (відніманні) виникло міжтетрадне перенесення (позика) в акумуляторі; С — встановлюється в " 1", якщо виникло перенесення зі старшого (АСС.7) біта в акумуляторі або позика в старший біт; OV — встановлюється в " 1", якщо в результаті підсумовування/віднімання знакових чисел виникло переповнення, тобто цей прапор свідчить про факт переповнення без вказівки типу — позитивне чи негативне; При діленні (OV)=1, якщо виконувалося ділення на нуль. При множенні (OV)=1, якщо результат більший 255. Потоки передачі даних Відповідно структурі пам'яті МК51 можна виділити три інформаційних потоки: пересилання із ЗПП у РПД, пересилання між ЗПД і РПД, обмін даними усередині РПД (включаючи РСФ). КОМАНДИ ПЕРЕДАЧІ ДАНИХ є найбільш численною групою. Вони охоплюють всі потоки передачі, розглянуті вище. КОМАНДИ АРИФМЕТИЧНИХ і ЛОГІЧНИХ ОПЕРАЦІЙ характеризуються тим, що для них одним з операндів завжди є вміст акумулятора, однак результат може поміститися або в акумулятор, або на місце другого операнда, якщо це прямоадресований байт РПД або блоку РСФ. КОМАНДИ ПЕРЕДАЧІ КЕРУВАННЯ. До даної групи відносяться команди, які реалізують безумовні та умовні переходи, виклики підпрограми і повернення з підпрограми. По способу адресації переходу можна виділити такі типи: 1. ДОВГИЙ перехід – здійснюється по АП в об’ємі 64Кб. У команді міститься повна 16-бітова абсолютна адреса переходу, що завантажується в (PC). Мнемоніка команд починається з букви L. 2. АБСОЛЮТНИЙ перехід – здійснюється в межах сторінки ЗПП (РПП) розміром 2048 байтів (2Кб). У команді містяться тільки 11 бітів адреси (а0...а10). При виконанні команди в обчисленій адресі наступної команди (РС)=(РС)+2; молодші 11 бітів заміняються на а0...а10, взяті з команди. Формат – номер 6. Мнемоніка починається із символу А. 3. КОРОТКИЙ ВІДНОСНИЙ перехід – дозволяє передати керування в границях -128...+127 байтів щодо адреси команди, що слідує за командою переходу, тобто відносно (РС)=(РС)+2 або (РС)=(РС)+3. Відносна адреса переходу rel міститься в другому або третьому байті команди. Мнемоніка починається із символу S для безумовних переходів. Команди умовних переходів також реалізовані по цьому формату. 4. НЕПРЯМИЙ перехід – дозволяє передати керування по непрямій адресі, що формується по вмісту регістра DPTR і зміщенню з акумулятора. Дозволяє організувати перехід за адресою, обчисленою в процесі роботи програми. Асемблер припускає використання узагальненої мнемоніки команд JMP і CALL, які в процесі трансляції заміняються оптимальними і припустимими по формату команди переходу (AJMP, SJMP, LJMP) або виклику (ACALL, LCALL). Правила запису програм мовою Асемблер Кожна команда являє собою рядок такої конструкції: [ МІТКА: ] мнемокод операції операнд(и) [; коментарі ] де [ ] – поле може бути відсутнім; МІТКА – символічне ім'я комірки пам'яті, починаючи з якої розміщається в пам'яті дана команда. У якості ОПЕРАНДІВ можуть застосовуватися числа (адреси і дані), зарезервовані і задані символічні імена. Для вказівки системи числення, в якій задається число, використовують буквені індекси після самого числа: В – двійкова, Q – вісьміркова, D або нічого – десяткова, Н – шістнадцяткова. КОМЕНТАРІ – будь-які символи. Поняття про Асемблер Асемблер – це програмний засіб, призначений для перетворення вихідного тексту програми, що містить мнемонічні імена команд і операндів, у послідовність двійкових кодів, що являють собою команды, які виконує процесор. Таким чином, вхідна інформація для Асемблера представляється у вигляді текстового файлу, а вихідна інформація генерується у вигляді так званого файлу ОБ'ЄКТНИХ кодів (об'єктного файлу). Крім того, Асемблер виконує перевірку коректного опису команд. Іноді його називають компілятором (транслятором) з мови Асемблер. У результаті роботи Асемблера є можливість крім об’єктного файлу одержати також файл ЛІСТИНГУ, що містить текстову інформацію про розміщення кодів команд і даних по конкретних адресах пам'яті мікроконтролера або мікропроцесорної системи. Програма мовою Асемблера складається з логічних сегментів – блоків з елементів одного типу (команди, дані). Для МК51 ці логічні сегменти безпосередньо відповідають фізичним областям пам'яті (РПП, ЗПП, РПД, ЗПД, бітова область). Для вказівки адрес команд і даних або значень даних зручно використати символічні імена (далі – просто імена), які відповідають фізичному або математичному змісту завдання. Використання імен робить програму більш зрозумілою для програміста і його колег, полегшує процес модифікації програми і її налагодження. Ім'я може починатися з літери і містити не більше 32 символів. Для сегментної побудови програми й визначення символічних імен адрес і значень даних використовують Директиви Асемблера. Директиви Асемблера не є виконуваними командами, а являють собою інструкції для компілятора по розміщенню команд і даних у пам'яті МК або МПС. СТРУКТУРА ПРОГРАМИ: - ДЕКЛАРАТИВНИЙ блок – опис символічних імен даних та адрес, які використовуються у програмі, а також директиви виділення пам'яті для змінних і вказівки значень констант (за допомогою директив Асемблера); - блок ІНІЦІАЛІЗАЦІЇ – настроювання портів і блоків периферійних функцій на необхідні режими роботи, ініціалізація стека (за допомогою команд); - блок РЕАЛІЗАЦІЇ алгоритмів і функцій керування (за допомогою команд). Директиви визначення символічних імен Директива EQU – будь-якому імені ставиться у відповідність операнд. Формат директиви: < ім'я> EQU < вираз> Наприклад: z1 equ 10 z2 equ z1 + 4 z3 equ z1 + z2 + 5
Імена, визначені директивою EQU, можна використовувати як адресу коду, адресу даних (внутрішніх або зовнішніх) або значень даних. Наприклад: MOV A, #z1; Завантаження числа 10 в акумулятор MOV A, z1; Пересилання в акумулятор із комірки з адресою 0АН. Оператори, що допускаються для використання у виразах із директивами Асемблера, описані далі. Директива DATA – задає ім'я для адреси даних у РПД. Формат директиви: < ім'я> DATA < адресний вираз> Директива XDATA – задає ім'я для адреси зовнішніх даних (ЗПД). Формат директиви: < ім'я> XDATA < адресний вираз> Директива BIT – задає ім'я для адреси біта з області внутрішнього ОЗП із бітовою адресацією. Формат директиви: < ім'я> BIT < адреса біта> Наприклад: control DATA 2AH f1 bit control.3; Адреса у вигляді бітового селектора f2 bit f1 + 4; Адресний вираз f3 bit 60H; Абсолютна адреса
Приклади зручного використання символічних імен: counter DATA 20H flag BIT P1.7 on BIT 30Н MOV counter, 10 m1: < дії в циклі > SETB on wait: JNB flag, wait DJNZ counter, m1 CLR on Лічильник адрес (не плутати з лічильником команд (PC)) У процесі компіляції Асемблер з кожним сегментом зв'язує свою внутрішню змінну, що називається лічильником адрес. У цій змінній підраховується, скільки байтів відведено в пам'яті під кожну команду або число і відповідно, по якій адресі буде розміщені наступна команда або число. У такий спосіб лічильник адрес „стежить” за розміщенням у пам'яті кодів команд і даних. Мітка команди – це, по суті, символічне ім'я для адреси комірки пам'яті, починаючи з якої дана команда розміщена в пам'яті. Мітки команд зв'язуються з адресами автоматично в процесі компіляції програми, тому спеціальних директив для визначення міток не існує. Директиви керування сегментами програми Поява в тексті програми цих директив означає, що розміщені далі команди або дані відносяться до сегмента (типу) пам'яті, зазначеному директивою: - CSEG – початок сегмента кодів (пам'ять програм); - DSEG – початок сегмента даних в ОЗП РПД; - XSEG – початок сегмента зовнішніх даних (ЗПД). Керування значенням лічильника адрес З першою появою в тексті програми будь-якої з директив керування сегментами Асемблер створює новий лічильник адрес для цього сегмента і встановлює його в нуль. При повторному відкритті сегмента продовжується рахунок від попереднього значення лічильника. Існує директива ORG, що дозволяє програмісту встановлювати потрібні значення лічильника адреси для поточного активного сегмента і в такий спосіб розміщати коди в пам'яті по потрібних адресах. Формат директиви: ORG < адресний вираз> Директиви ініціалізації пам'яті DB, DW заповнюють байт або слово (2 байти) вказаним значенням. Використовують для розміщення значень констант у сегменті кодів (тобто в пам'яті програм): [ ім'я: ] DB < значення> [ ім'я: ] DW < значення> Директива резервування (виділення) пам'яті DS для змінної в сегменті зовнішніх або внутрішніх даних (ЗПД або ОЗП РПД): [ ім'я: ] DS < кількість байтів> END – директива визначення кінця програмного модуля. Оператори періоду трансляції Для зручності запису команд і директив у мові Асемблер допускається задавати числові значення й адреси пам'яті у вигляді алгебраїчних виразів. Значення такого виразу буде визначено компілятором ще під час трансляції, а в код команди буде підставлятися тільки результат цих дій. Припустимими операторами є: +, -, *, /, (), AND, OR, XOR, NOT, LOW – виділення молодшого байта, HIGH – виділення старшого байта із двохбайтового виразу. Наприклад: 1) X equ 10; визначено ім'я X для числа 10 Y equ X+2; визначено ім’я Y для значення 12 Z equ (X+Y)*4; визначено ім’я Z для значення 88
2) DSEG org 70H V1: ds 4; Виділення пам'яті для чотирьохбайтової змінної ... MOV A, V1+1; Читання в акумулятор другого байта змінної V1
3) X equ 3704; Оголошення двохбайтового числа MOV R0, #LOW(X); Запис молодшого байта X у регістр R0 MOV R1, #HIGH(X); Запис старшого байта X у регістр R1 Додаток 2. Зведена таблиця команд MCS-51. Умовні позначення: # - безпосередній операнд (#d8 – 8-бітний, #d16 - 16-бітний); @ - непряма адресація; Rn - регістр активного банка з номером n = 0..7; Ri - регістр активного банка для непрямої адресації (і = 0, 1); ad - пряма адреса комірки (байта) в РПД; ads, add - пряма адреса джерела і приймача даних в РПД; bit - пряма адреса біта в РПД; rel - 8-розрядне зміщення в командах відносного переходу; ad11 - 11-бітна адреса-зміщення всередині сторінки об’ємом 2кб; ad16 - пряма 16-бітна адреса переходу; ..h - старша частина адреси або операнда; ..l - молодша частина адреси або операнда; c.. - символьне ім’я константи (що визначається через директиви); v.. - символьне ім’я змінної (що визначається через директиви); (..) - вміст комірки пам’яті або регістра; ((..)) - вміст комірки пам’яті, яка адресується регістром непрямо; m.. або МІТКА - символьне ім’я адреси переходу.
|