Система команд та методи адресації в мікропроцесорі КР1810ВМ86

Список команд МП-86 набагато більший, аніж у МП-80. Якщо в МП-80 повний такий список складає десь близько 100, то в МП-86 кількість їх перевищує 300. У цьому списку можна побачити, що деякі команди не змінили ані форми, ані змісту, наприклад: HLT, NOP, STC, IN, OUT, JMP, CALL тощо.

Деякі команди зберегли свій зміст, але мають дещо іншу мнемоніку:

З'явилися принципово нові команди, пов'язані з новими можливостями МП86: MUL - множення; DIV - ділення; NEG -утворення доповняльного коду; NOT - інверсія; TEST - операція І без фіксації результату (тільки заради ознак); SAR, SAL, SHR, SHL -команди зсувів без утворення циклів; LOOP - організація циклу на задану кількість разів та ін.

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

Для МП-80 існує тільки три варіанти цієї операції:

ADI D8 (А <— А + D8) - додавання за безпосередньою адресацією;

ADD R (А <— А + R) - додавання за регістровою адресацією;

ADD М (А<- А + M(HL)) - додавання за непрямою адресацією.

Для МП-86 це будуть:

ADD RB, D8 (RB< RB +D8) - додавання однобайтових операндів за безпосередньою адресацією. Тут регістром RB може бути будь-який з однобайтових регістрів: AL, AH, BL, BH, CL, СН, DL, DH. Наприклад, ADD C4L,D8. Таким чином, кожний із цих регістрів може виконувати функцію, котру в МП-80 міг виконувати лише акумулятор (регістр А).

для МП-80 INR OCR ANA ORA XRA JZ JTNZ JC JNC

для МП-86 INC DEC AND OR XOR JE JNE JB NB

ADD RBD, RBS (RBD <-RBD + RBS) - додавання за регістровою адресацією. Тут RBD - регістр-приймач, RBS - регістр-джерело. Наприклад, ADD CL,BH.

ADD ADR,D8 (M(ADR) <- M(ADR) + D8) - додавання за непрямою адресацією, наприклад, ADD [BX),D8!, або ADD ALPHA, D8. Тут ALPHA - ім'я комірки пам'яті, ефективна адреса якої (зміщення) задається в регістрах ВР, ВХ, DI або SI.

Аналогічні команди можливі й з робочими регістрами, котрі можуть бути як приймачами, так і джерелами. ADD RB, ADR (RB <— RB + M(ADR)), наприклад, ADD BL, BETA, або

ADD ADR, RB (M(ADR) <- M(ADR)+RB), наприклад, ADD GAMMA, AL.

Такими самими можуть бути операції додавання й для двобайтових операндів (слід тільки замість RB писати RW).

Отже, команда ADD може мати 10 варіантів. Стільки саме подібних варіантів можуть мати всі інші арифметичні та логічні операції: ADC, SUB, SBB, CNP, AND, OR, XOR та TEST. Особливо розширився порівняно з МП-80 список команд зсуву: замість чотирьох у МП-80 їх у МП-86 більш як 40. Команд умовних переходів стало 19 замість восьми в МП-80. Значно розширився список різновидів команди MOV: їх тепер стало 20. Цікаво, що зникли команди MVI R,D8 та LXI Q, D16. їх тепер заміняють команди MOVRB, D8 та MOVRW, D16.

Але все ж слід визнати, що головні особливості й відміни команд МП-86 та МП-80 полягають у значно складніших методах адресації застосовуваних у МП-86. Розглянути це питання можна найліпшим шляхом, порівнюючи вже знайомі нам методи адресації МП-80 з тими, які застосовуються в МП-86.

Неявна адресація

За неявної адресації для виконання команди не потрібно вказувати адресу будь-якого регістра або комірки пам'яті. Адреси передбачені вже в самому змісті цих команд. Так, наприклад, у МП-80 команда STC означає встановлення біта CY = 1 у регістрі ознак. Це також команди зсувів RLC, RAR, RAL, RRC, які відносяться до

[BX] - вміст комірки, ефективна адреса якої задається вмістом регістра ВХ.

акумулятора. Щодо команд RET, El, DI, XCHG, HLT, то їх зміст очевидний.

Аналогічні команди є також і в МП-86.

Регістрова адресація

У МП-80 явно вказується регістр R або пара Q, звідки повинен бути взятий операнд, або куди його треба помістити. Такими командами можуть уважатися, наприклад, MOV RD, RS; INR R; DCR R; INX Q; ADD R; SUB R; PUSH Q; CMP R тощо. Приклади аналогічних команд для МП-86:

MOV AX,SI - переслати вміст регістра SI в АХ;

MOV BL,DH - переслати вміст регістра DH у BL.

Примітка: тут і далі розміри операндів повинні бути однаковими. Не можна пересилати 8-розрядний операннд у 16-розрядний регістр або навпаки!

PUSH F - пересилання вмісту регістра ознак до стеку;

POP SI - пересилання зі стеку до регістра SI;

ADD CX,DI - додати вміст регістра DI до СХ і записати суму в СХ. Тут видно, що кожний із робочих регістрів (однобайтових або двобайтових) може виконувати функції акумулятора.

R.OL DX,1- циклічно зсунути вміст DX на один розряд ліворуч;

SAL DI, CL - нециклічно зсунути вміст DI ліворуч на кількість бітів указану в регістрі CL;

OR CL, DH - логічне додавання CL та DH (результат залишається в CL).

Безпосередня адресація

Для МП-80 це команди типу ANI D8, ADI D8, СРІ D8 та інші, коли перший операнд знаходиться в акумулятор, а другий (D8) задаєтья в команді. Результат залишається в акумуляторі.

Для МП-86 роль акумулятора може виконувати будь-який робочий регістр. Цей регістр має бути визначний у команді. Він відіграє роль регістра-приймача результату. Ось приклади таких команд:

MOV CL, 24 - завантажити регістр CL десятковим числом 24. Ця команда є аналогом команди MVI R,D8;

AND AL, 80H - логічне множення (виділення старшого біта в регістрі AL);

OR DI, 8000Н - встановлення старшого біта в регістрі DI;

SUB СН, 41Q - відняти від вмісту регістра СН вісімкове число 41Q, результат зберегти в СН;

СМР ВХ, 140Н - порівняти вміст ВХ із числом 0140 Н;

TEST AL, 01 - перевірити, чи є в регістрі AL одиниця в наймолодшому розряді.

На мові Асемблера константи, що фігурують у всіх цих командах, можуть бути подані у вигляді імен, конкретне значення яких розкривається за допомогою директив привласнення EQU або SET, котрі звичайно розташовуються в кінці програми.

Так, наприклад, команда MOV CL,24 може бути записана як MOV CL, NUMB, де значення константи NUMB задається у вигляді NUMB EQU 24.

Пряма адресація (абсолютна адресація)

При прямій адресації в команді вказується адреса операнда. Так, наприклад, у МП-80 при прямій адресації адреса, звідки має бути взятий операнд або куди його слід помістити, задається в другому або другому й третьому байтах команди: LDA 8118, STA 8319, SHLD 8223, OUT F9 тощо. Вихідним або кінцевим місцем розташування операнда тут є акумулятор, HL-napa або порт.

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

Наприклад, запис ALPHA: DB OA8H резервує комірку пам'яті за адресою з ім'ям ALPHA й у цю комірку є записаним число А8Н. Запис DELTA: DW 1A19H резервує пару комірок, в яких записано число ІАІ9Н.

Прикладом команди з прямою адресацією може бути MOV AL,[ALPHA] - завантажити в робочий регістр AL вміст комірки, що

має ім'я ALPHA1. Оскільки в цю комірку було завантажено число Л8Н, то саме воно опиниться в регістрі AL. Такий самий результат можна було б одержати, задавши число А8Н у вигляді ALPHA EQU ОА8Н, але це була б уже безпосередня адресація. Принципова різниця полягає тут у тому, що директивою ALPHA EQU OA8H число А8Н задається як константа, тоді як за директивою ALPHA: DB OA8H вміст комірки пам'яті з адресою ALPHA є змінним і в процесі виконання програми може зазнавати змін.

За допомогою операторів DB та DW можна зарезервувати довільну кількість комірок пам'яті, подаючи їх вміст за списком, наприклад:

ALPHA DB: ОА8Н, 01, 02, 03, 05, ODAH

Адресу ALPHA має перше число А8Н, друге число має вже адресу [ALPHA+1], а для введення в регістр AL останнього числа DA треба записувати MOV AL,[ALPHA+5].

Непряма регістрова адресація

У МП-80 є тільки один варіант такої адресації: через HL-napy, у котрій зберігається адреса операнда, наприклад, MOV А,М - записати в акумулятор вміст комірки пам'яті, адреса якої міститься в HL-napi; SUB M - відняти з акумулятора вміст комірки пам'яті M(HL) і написати результат у акумулятор

У МП-86 зміщення для формування фізичної адреси потрібної комірки може бути взятим із регістрів ВР, ВХ, SI або DI, наприклад, MOV CL,[BP] - переслати в CL вміст комірки пам'яті адресованої через регістр ВР;

ADD AX,[DI] - скласти вміст АХ із вмістом двох суміжних комірок, перша з яких адресована через регістр DI.

Ефективна адреса може складатися із суми вмістів двох регістрів -базового та індексного, наприклад, [BX+S1] або [BP+DI].

Розмір адресованого операнда повинен, звичайно, відповідати розмірам регістра, вказаного в команді. Машина враховує це автоматично й за неузгодженості цих розмірів дає сигнал помилки. Ллє в деяких випадках із команди аж ніяк не видно, якої величини

' У деяких версіях трансляторів (більш ранніх) ЕОМ може сприймати цю команду й без квадратних дужок: MOV AL,ALPHA.

має бути операнд - однобайтовим або двобайтивим. Це стосується, наприклад, команд INC, DEC, NOT, NEG та ін. В таких разі слід спеціально обумовлювати розмір операндів за допомогою оператора PTR, наприклад, BYTE PTR або WORD PTR. Так, для інхрементування однобайтового операнда, що зберігається за адресою [ВХ], слід записати FNC BYTE PTR [BX]. А для декрементування двобайтового слова, що записано за адресою [DI], -DTC WORD PTR [DI].

Індексна адресація

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

У МП-80 такого метод адресації офіційно не існує. Але ми фактично користуємося ним при роботі з масивами. Гак, наприклад, при роботі з масивом 8100 - 8IFF зберігаємо незмінним вміст регістра Н (Н = 81) - це буде база, і змінюємо в межах від 00 до FF вміст L-регістра (це буде індекс). Щоправда, користуватися таким методом можна лише для масивів, розмір яких не перевищує FF.

Метод індексної адресації широко застосовується в мікропроцесорі 8086 і процесорах наступних поколінь (80286, 80386 тощо), а також у мікропроцесорах сімейства М^68хх.

Типовим варіантом такого методу адресації є, наприклад, запис MOV AX,[100H+SI]. Ця команда означає: переслати в регістр АХ вміст двох суміжних комірок пам'яті, початкова адреса яких визначається як сума числа 100Н, і вмісту індексного регістра SI. Отже, сума 100H+SI утворює ефективну адресу (зміщення), котре для формування фізичної адреси має бути доданим відповідним чином до вмісту сегментного регістра.

Замість конкретного числа 100Н, що є базою при індексній адресації, можна скористатися ім'ям цього числа: MOV AX,[SCOT + SI], де ім'я SCOT розшифровується наприкінці програми як SCOT EQU 100Н або як SCOT: DW 0100Н. Цю команду можна записати й у більш скороченому виді як MOV AX,SCOT[SI]. Машина сприйме такий запис.

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

задається базою. А перебирання елементів здійснюється інкрементуванням вміст}' індексних регістрів SI або DI.

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

Базова адресація

При базовій адресації ефективна адреса також складається з двох частин - бази та зсуву. Значення бази міститься в регістрах ВХ або ВР, а зсув задається в команді у вигляді конкретного числа або ім'ям цього числа. Наприклад, команда MOV [BP+21H], DX або MOV [BP+SAMP], DX означає, що вміст регістра DX пересилається в комірку з відносною адресою ВР+21Н або BP+SAMP. Частіше така команда записується в скороченому вигляді як MOV [BP]21H,DX або як MOV [BP]SAMP,DX.

Базова адресація також зручна для роботи з масивами. Але тепер початкова адреса масиву задається вмістом базового регістра ВР або ВХ, а перебирання масиву здійснюється інкрементуванням (або декрементуванням) числа з ім'ям SAMP.

Базово-індексна адресація

При роботі з двомірними масивами (матрицями) виникає потреба варіювати номери як стовпців, так і рядків. У цьому разі буває доцільним застосовувати комбіновану базово-індексну адресацію, наприклад:

MOV [BP][SI],AX або

ADD[BP]ALPHA[D1],AX

де ефективна адреса комірки пам'яті визначається як BP+SI або як BP+ALPHA+DI. При цьому можна незалежно варіювати як ВР, так і SI або DI, а також число ALPHA.

Відносна адресація

Відносна адресація застосовується тільки в командах, за якими здійснюється передача управління (типу JMP, JNE, CALL, LOOP). За

цим методом у команді задається зміщення щодо адреси деякої команди, наприклад, JMP-5, що означає перейти на адресу, котра на 5 одиниць менша за адресу команди, наступної після IMP. Або команда CALL + ОЕ200Н - перейти на адресу, котра на Е200Н одиниць більша за адресу команди, наступної після CALL.

Зміщення можна задавати також щодо деякої мітки: наприклад, JMP МІ -5. Це означає: перейти на адресу, котра на 5 одиниць менша за адресу команди з міткою МІ. Замість конкретного числа в подібних командах можна задавати його ім'я, наприклад, замість команди JMP-5 можна писати JMP - ALPHA, задаючи ALPHA як ALPHA EQU 5.

Перетворення адрес на операнди

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

Цю дію може виконувати оператор OFFSET, котрий перетворює 16-розряднну ефективну адресу на двобайтове число-операнд. Наприклад:

MOV BX,OFFSET W CMP [BX],OCOOOH і далі INC WORD PTR [ВХ]

W: DW OFBCDH, OBCDEH, OCDEFH

Тут W - масив із трьох елементів з ім'ям W, початковому елементу якого при трансляції привласнюється деяка ефективна адреса, наприклад, W = 8200. Командою MOV BX,OFFSET W ця адреса записується в регістр ВХ (ВХ=8200), вміст якого можна далі порівнювати з якимось числом СОООН звичайним чином і далі перебирати й порівнювати в циклі адреси всього масиву.

Було б невірно писати MOV BX,W, бр при цьому в регістр ВХ було б записано значення першого елемента масиву ABCDH, а не його адресу, і саме це число зазнало б порівняння з ОСОООН.

Аналогічну операцію виконує й команда LEA, наприклад, LEA SI,W. Вона передає в робочий регістр SI адресу першого елемента масиву з ім'ям W. Команда LEA застосовується звичайно для

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

Формати кодів команд МП-86

Далі мова піде про те, як переходити від мнемонічного виразу команд до їх машинних кодів. Для МП-80 правила розглядалися вище й вони досить прості. У МП-86 це робити значно важче з причин складності та різноманітності методів адресації.

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

Неявна адресація

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

CLC (встановлення біту ознак CF = 0) 11111000= F8

НЬТ(зупинка) 11110100= F4

RET (повернення з підпрограми в межах

одного сегмента) 11000011 = СЗ

RETF (повернення з підпрограми у інший

сегмент) 11001011 =СВ

Безпосередня адресація

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

Командний байт

однобайтовий або двобайтовий операнд.

У чотирьох старших бітах командного байта записується код операції. Він залежить від конкретного виду операції, його слід знаходити за довідником. Так, наприклад, для операцій типу MOV RRB,D8 або MOV RW,D16 код операції буде 1011; п'ятий біт визначає розмір операнда: w =

О для D8 і w = 1 для D16.. Три останні біти місгять номер робочого регістра. Його можна встановити за наведеною таблицею (табл. 13.1)

Таблиця 13.1.

Розглянемо як приклад команду MOV АХ,0123Н. Для неї перші п'ять бітів будуть 10111. Операнд двобайтовий і біт w = 1.Для обраного в нашому прикладі регістра АХ REG = 000. Отже, код команди в наведеному прикладі буде 10111000 = В8.

У другому байті команди записується молодший байт даних, у третьому - старший. Таким чином, код усієї команди матиме вигляд В82301.

Інший приклад: команда MOV AL,25H. її код буде 1011 0000 00100101=8025.

Регістрова адресація

Код таких команд складається з двох байтів. У першому (командному) байті записується код операції КОП, який займає 6 бітів. У сьомому завжди стоїть 0, а у восьмому 1 або 0, залежно від того яким є операнд - двобайтним чи однобайтним. У другому байті команди (постбайті) два старші біти - одиниці, далі йдуть номери регістра-джерела (s) і регістра-приймача (d). Так, наприклад, команда MO DX,DI (тип MOV RWD,RWS) має КОП = 100010, W/B = 1, reg s (DI)=lll,regd(DX) = 010.

Отже, загальний код команди буде 1000 1001 1111 1010 = 89 FА.

Непряма адресація

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

У командному байті старші шість бітів є кодом операції. У командах такого типу обов'язковим співучасником є робочий регістр. Біт d визначає чи цей регістр буде приймачем (d=l), чи джерелом (d^O). Біт w визначає довжину операнда: (w=l), якщо він двобайтовий і (w = 0), якщо однобайтовий.

У постбайті поле REG означає номер робочого регістра. Поле MOD визначає величину зміщення в адресі: MOD = 00 - адреса без зміщення;

01 - з однобайтовим зміщенняям; 10 - з двобайтоим зміщенням.

MOD =11 означає, як уже йшлося вище, регістрову адресацію. Поле R/M визначається регістрами, котрі беруть участь у формуванні зміщення. Значення полів R/M та MOD для різних випадків наведено в табл. 13.2.

Якщо в команді є одно- або двобайтове зміщення, то воно записується в третьому або третьому й четвертому байтах. Якщо ж будуть ще й одно- або двобайтові дані, то вони подаються в п'ятому та шостому байах.

Розглянемо як приклад команду SUB CX,[BX]. У командному байті для команди типу SUB RWADR КОП = 001010. Робочий регістр

AX CX DX BX SP BP SI DI AL CL DL BL AH CH DH BH 000 001 010 O1l 100 101 110 111

Таблиця 13.2.

Ефективна адреса

R/M MOD - 00 MOD - 0 і MOD - ІО

000 (BX)-b(SI) (BX)+(SI)+D8 (BX)+(SI)+D16

001 (BX)+(DI) (BX)+(DI)+D8 (BX)+(DI)+D16

010 (BP(+(SI) (BP)+(SI)+D8 (BP)+(SI)+D16

011 (BP)+(DI) (BP)+(DI)+D8 (BP)+(DI)+D16

100 (SI) (SI)+D8 (SI)+D16

101 (DI) (DI)+D8 (DI)+D16

110 Пряма адресація (BP)+D8 (BP)+D16

111 (BX) (BX)+D8 (BX)+D16

є приймачем, отже d = 1; операнд є двобайтовим і w = 1.

У формуванні адреси бере участь лише регістр ВХ, отже КУМ = 111. Номер регістра СХ = 001. Додаткового зміщення в команді немає, отже MOD=00. Таким чином, машинний код команди буде 0010 1011 0000 1111 = 2BOF.

Інший приклад: ADC DX,[BX]25.

Тип команди ADC RW,ADR і її КОП = 000100; d = 1; w = 1.

МОВНОЇ REG = 010 R/M=111.

Код команди 0001 0011 01010111-13 57 25Н.

Команда SUB BX,[BP]2C38. Для неї командний байт 0010 1011; постбайт складається з MOD = 10 REG = 011 R/M =110.

Отже, код команди 2В 9Е 38 2СН.

Пряма адресація

При прямій адресації в команді у явному вигляді вказується адреса операнда. Здебільшого ця адреса дається як ім'я тієї комірки, в якій знаходиться операнд. Прикладом може бути команда MOV DX,[ALPHA], де ALPHA - ім'я комірки, заданої як ALPHA: DW D16. До адреси ALPHA може бути додане зміщення, яке визначатиме номер елемента в масиві ALPHA (якщо цей масив містить декілька елементів), наприклад MOV DX,[ALPHA] 15.

Кодування таких команд подібне до кодування команд із непрямою адресацією, різниця полягає лише в тому, що в полі R/M установлюється завжди число 110, а в полі MOD - число 00.

Так, наприклад, вищенаведена команда MOV DX,[ALPHA] буде кодуватися так: КОП =100010; d = 1; w = і; MOD = 00; REG = 010; R/M =110.

Отже, загальний код команди буде 10001011 00010110.

При асемблюванні операційна система сама знайде адресу з ім'ям ALPHA й додасть її до коду команди.

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

Наприклад, команда JMP МІ. Нехай ця команда має внутришньо-сегментну (ефективну) адресу 0145, а команда з міткою МІ має адресу 0119. Команда, наступна за JMP, знаходиться за адресою 0148 і, отже, треба зміститися на мінус 2F адрес, або в доповняльному коді на D1. Якщо це зміщення однобайтове, то код нашої команди переходу ЕВ. Таким чином, код вищенаведеної команди буде ЕВ D1. При двобайтовому зміщенні код команди був би ЕЗ.

Інший приклад - команда JZ SKOK. Нехай ця команда має ефективну адресу АЗВ9, а перейти треба на команду з міткою SKOK, яка має адресу А572, тобто треба зміститися на +224Н адрес. Код цієї команди буде 74 02 24.

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

Команди передачі керування складаються з двох байтів: у першому байті записано код операції, в другому - відносна адреса, на

Передача керування


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: