Тема 2

2. Основни програмни регистри, указатели и флагов регистър за IA-32 и Intel-64 архитектура.


страницата се нуждае от дописване/преглеждане


<< Тема 1 | Тема 3 >>

Регистри

Архитектурата на x86 процесорите съдържа 16 регистри които интересуват програмиста. Фигурата показва , че можем да разделим тези регистри в няколко основни групи:

  1. Регистри с общо предназначение. Тези осем 32-битови регистри с общо предназначение се използват главно за да съдържат операнди за аритметични и логически операции.
  2. Сегментни регистри. Тези специални регистри позволяват на дизайнерите на системния софтуер да използват flat или сегментен модел на организация на паметта. Тези шест регистъра определят в определено време кои сегменти на паметта са адресируеми в дадения момент.
  3. Регистри за статус и инструкции. Тези специални регистри се използват да записват и променят определени аспекти от състоянието на x86 процесора.
untitled75.JPG

Регистри за общо предназначение

untitled76.JPG
Регистрите за общо предназначение на x86 архитектурата са EAX, EBX, ECX, EDX, EBP, ESP, ESI и EDI. Тези регистри се изпозват за съхранението на операндите на логическите и аритметични операции. Те също така могат да бъдат изпозвани за операнди на изчисленията на адрес (освен че ESP не може да бъде изпозван като индексен операнд).
На фигурата е показано, че16-битовите части от тези регистри за общо предназначение, имат собствени имена, като това се оказва особено полезно при употребата на 16 битови данни. Регистрите с дължина дума се наричат AX, BX, CX, DX, BP, SP, SI и DI.
Фигурата също така демонстрира и факта че всеки байт от 16-битовите регистри AX, BX, CX и DX има отделно име и може да бъде третиран самостоятелно. Това е полезно при употребата на 8-битова информация. Тези байтови части са наречени AH, BH, CH и DH (високи байтове); и AL, BL, CL и DL (ниски байтове).
Всички регистри за общо предназначение са на разположение за изчисления при адресиране и за резултатите на повечето аритметични и логически изчисления. .

Сегментни регистри

untitled77.JPG
Сегментните регистри на x86 процесорите дават на дизайнерите на системен софтуер гъвкавостта да избират сред множество модели на организация на паметта(разгледахме го в предната тема).
Една пълна програма обикновено се състои от множество различни модули, всеки от които съдържа инструкции и информация. Във всеки момент от изпълнението на програмата само малка част от тези модули е всъщност в употреба. x86 архитектурата се възползва от това като осигурява механизми които поддържат директния аксес в инструкциите и информацията не текущия модул.
Във всеки момент шест сегмента от паметта могат да бъдат достъпни за изпълняваща се x86 програма. Регистрите CS, DS, SS, ES, FS и GS се използват за идентификацията на тези шест текущи сегмента. Всеки един от тези регистри специфицира определен вид сегменти("code," "data" или "stack"), показани на фигурата. Всеки регистър уникално определя един определен сегмент, от сегментите които образуват програмата.
Сегментът съдържащ в момента изпълняваща се последователност от инструкции се знае като текущия code сегмент, той е специфициран като CS регистър. x86 процесорите извличат всички инструкции от този кодов сегмент, използвайки като отместване(offset) съдържанието на instruction pointer.
Подпрограмни извиквания и параметри обикновено изискват регион от паметта да бъде асоцииран като стек. Всички стекови операции използват SS регистъра за да се намери стека.
DS, ES, FS и GS регистрите позволяват спецификацията на четири сегмента на данни всеки адресиран от текущата програма.

Флагов регистър

untitled78.JPG
AF - междинен пренос (междинен пренос между младшата и страшата тетрада). Смисъла от този флаг е някоя от следващите инструкции да провери този флаг. Използва се при двоично кодиране на десетични числа.
SF – най-левия бит на резултата (знака).
OF - за препълване ако и двата са нула или и двата са единица нямаме препълване. Ако се различават то имаме такова.
DF – обикновено при сравнение на низове (обръщане на посоката на прочитане на данните). Този флаг може да се постави от приложната програма (разрешен е за пипане от всяка програма).
TF – когато се сложи в единица се изпълнява една инструкция и се прави трап. Режим на трасировка.
IF – за да се случи прекъсване този флаг трябва да е единица.
IOPL – ниво на привилегия на входно изходните устройства. От това се определя дали да се случи едно входно изходнопрекъсване или не.
AC – когато се сложи в единица се задължава процесора да прави проверка за подравняването на границите на операндите. Ако е е в нула процесора не се интересува къде са границите.
ID – идея всеки процесор да си има собствен идентификатор. Това не е този идентификатор, но при този флаг в единица се позволява да се ползва този идентификатор.

Status Flags - Статус флаговете на EFLAGS регистъра позволяват резултатите от една инструкция да влияят на следващи инструкции. Аритметичните инструкцииизползват OF, SF, ZF, AF, PF и CF. SCAS (Scan String), CMPS (Compare String) и LOOP инструкците използват ZF за да сигнализират, че са свършили работата си.
Control Flag - Контролният флаг DF от регистъра EFLAGS контролира инструкциите с низове.

Instruction Pointer

Регистърът instruction pointer (EIP) съдържа адреса на отместването свързан с началото на текущия кодов сегмент на следващата инструкция която чака изпълнение. Instruction pointer - а не е директно видим за програмиста; той се контролира неявно от инструкции за трансфер, прекъсвания и exception-и.
untitled.JPG

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License