Курсове - Основи на микропроцесорната техника - Лекция 4: Операндно адресиране
Материал от Intuit
Съдържание
НЯМА ДАННИ
Основната функция на всеки процесор, за която е създаден, е изпълнението на инструкции. Системата от инструкции, изпълнявани от процесора, е нещо подобно на таблицата на истинността на логическите елементи или таблицата на режимите на работа на по-сложни логически схеми. Тоест определя логиката на процесора и реакцията му към определени комбинации от външни събития.
Писането на програми за микропроцесорна система е най-важният и често най-отнемащият време етап от разработването на такава система. И за да създадете ефективни програми, е необходимо да имате поне най-обща представа за системата от инструкции на използвания процесор. Най-компактните и най-бързи програми и подпрограми се създават на асемблерния език, чието използване без познаване на командната система е абсолютно невъзможно, тъй като асемблерният език е символен запис на цифрови машинни езикови кодове, кодове на инструкции на процесора. Разбира се, има всякакви софтуерни инструменти за разработка на софтуер. Обикновено можете да ги използвате, без да знаете набора от инструкции на процесора. Най-често използваните езици за програмиране на високо ниво като Pascal и C. Но познаването на командната система и асемблерния език позволява няколко пъти да повиши ефективността на някои от най-важните части на софтуера на всяка микропроцесорна система - от микроконтролер до персонален компютър.
Ето защо в тази глава ще разгледаме основните видове инструкции, налични за повечето процесори, и характеристиките на тяхното приложение.
3.1. Адресиране на операнд



3.1.2. Сегментиране на паметта
В процесора Intel 8086 сегментирането на паметта е организирано по следния начин.
Цялата системна памет е представена не като непрекъснато пространство, а като няколко части - сегменти с определен размер (64 KB всеки), чиято позиция в пространството на паметта може да се променя програмно.




- offset е 8-, 16- или 32-битово число, включено в командата.
- base е съдържанието на основния регистър на процесора. Обикновено се използва за посочване на началото на някакъв масив.
- index е съдържанието на индексния регистър на процесора. Обикновено се използва за избиране на един от елементите в масив.
- scale е множителят (може да бъде 1, 2, 4 или 8), определен в кода на инструкцията, по който индексът се умножава преди сумиране с други компоненти. Използва се за определяне на размера на елемент от масив.
Във всеки случай сегментирането ви позволява да разпределите един или повече сегменти в паметта за данни и един или повече сегменти за програми. Преминаването от един сегмент към друг е само въпрос на промяна на съдържанието на сегментния регистър. Понякога това е много удобно. Но за програмист работата със сегментирана памет обикновено е по-трудна, отколкото с непрекъсната, несегментирана памет, тъй като трябва да следите границите на сегментите, тяхното описание, превключване и т.н.
3.1.3. Адресиране на байтове и думи

3.2. Регистри на процесора
Както вече споменахме, вътрешните регистри на процесора са малко количество памет за изтриване, което е предназначено за временно съхранение на служебна информация или данни. Броят на регистрите в различните процесори може да бъде от 6-8 до няколко десетки. Регистрите могат да бъдат универсални и специализирани. Специализиранрегистрите, които присъстват в повечето процесори, са регистърът на програмния брояч, регистърът на състоянието (PSW), регистърът на указателя на стека. Останалите регистри на процесора могат да бъдат както универсални, така и специализирани.
16-битовият процесор Intel 8086, който се превърна в основа в линията процесори, използвани в персоналните компютри, използва коренно различен подход. Всеки регистър на този процесор има свое специално предназначение и регистрите могат само частично да се заменят един друг или изобщо не могат. Нека се спрем по-подробно на характеристиките на този процесор.
Процесорът 8086 има 14 16-битови регистъра. От тях четири регистъра ( AX , BX , CX , DX ) са регистри за данни, всеки от които, в допълнение към съхраняването на операнди и резултати от операциите, също има своя специфична цел:
За регистрите на данни е възможно да се използват и двата байта поотделно (например за регистъра AX те се обозначават AL - нисък байт и AH - висок байт).
Следващите четири вътрешни регистъра на процесора са сегментни регистри, всеки от които определя позицията на един от работните сегменти (фиг. 3.10):
- регистърът CS (кодов сегмент) съответства на сегмента от команди, които се изпълняват в момента;
- регистър DS (Data Segment) съответства на сегмента от данни, с който работи процесорът;
- регистър ES (Extra Segment) съответства на допълнителен сегмент от данни;
- регистърът SS (сегмент на стека) съответства на сегмента на стека.

По принцип всички тези сегменти могат и наистина се припокриват за оптимално използване на пространството в паметта. Например, ако програмата заема само част от сегмента, тогава сегментът с данни може да започне веднага след приключване на работата.програма (с 16-байтова точност), а не след края на целия програмен сегмент.
Следващите пет процесорни регистъра (SP - Stack Pointer, BP - Base Pointer, SI - Source Index, DI - Destination Index, IP - Instruction Pointer) служат като указатели (т.е. те определят отместването в рамките на сегмента). Например, броячът на инструкции на процесора се формира от двойка регистри CS и IP, а указателят на стека се формира от двойка регистри SP и SS. Регистрите SI, DI се използват при операции с низове, т.е. при последователна обработка на няколко клетки с памет с една команда.
Последният регистър FLAGS е регистърът на състоянието на процесора (PSW). От неговите 16 бита се използват само девет (фиг. 3.11): CF (Carry Flag) - флаг за пренасяне за аритметични операции, PF (Parity Flag) - флаг за четност на резултата, AF (Auxiliary Flag) - допълнителен флаг за пренасяне, ZF (Zero Flag) - флаг за нулев резултат, SF (Sign Flag) - флаг за знак (съвпада с високия бит на резултата), TF (Trap Fla g) - флаг за стъпков режим (използван за отстраняване на грешки), IF (Flag за разрешаване на прекъсване) - флаг за разрешаване на хардуерно прекъсване, DF (Flag за посока) - флаг за посока за операции с низове, OF (Flag за преливане) - флаг за препълване.
Битовете на регистъра на състоянието се задават или изчистват в зависимост от резултата от изпълнението на предишната инструкция и се използват от някои инструкции на процесора. Битовете на регистъра на състоянието могат също да бъдат зададени и изчистени чрез специални инструкции на процесора (системата с инструкции на процесора ще бъде обсъдена в следващия раздел).
Много процесори разпределят специален регистър, нареченакумулатор(т.е. съхранение). В този случай, като правило, само този регистър-акумулатор може да участва във всички операции, само чрез него може да взаимодейства сI/O устройства. Понякога в него се поставя резултатът от всяка изпълнена команда (в този случай дори се говори за "батерийната" архитектура на процесора). Например в процесора 8086 регистърът на данните AX може да се счита за вид акумулатор, тъй като той е този, който задължително участва в командите за умножение и деление и само чрез него могат да се изпращат данни към I / O устройството и от I / O устройството. Разпределението на специален акумулиращ регистър опростява структурата на процесора и ускорява прехвърлянето на кодове в процесора, но в някои случаи забавя системата като цяло, тъй като целият поток от информация трябва да премине през един акумулиращ регистър. В случай, че няколко процесорни регистъра са напълно взаимозаменяеми, такива проблеми не възникват.