Тема 3

3. Адресиране на операндите за IA-32 и Intel-64 архитектура.


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


<< Тема 2 | Тема 4 >>

IA-32

Това е формирането на 32 битовия адрес.
untitled1.JPG

Адресация на x86 процесорен набор инструкции

Една инструкция може да оперира върху нула или повече операнди. Пример за инструкция без операнди е NOP (no operation). Един операнд може да бъде във всяка от тези позиции:

  • В инструкцията (immediate operand)
  • В регистър (EAX, EBX, ECX, EDX, ESI, EDI, ESP или EBP при 32-битови операнди; AX, BX, CX, DX, SI, DI, SP или BP при 16-битови операнди; AH, AL, BH, BL, CH, CL, DH или DL при 8-битови операнди; сегментните регистри; или EFLAGS регистъра за флагови операции)
  • В паметта
  • Във входно изходен порт

Операндите в инструкцията и в регистрите могат да бъдат достъпвани много по-често от операндите в паметта, понеже операндите в паметта трябва първо да бъдат извлечени от паметта. Тук може да се добави информацията от предния коспект от теми 4 и 5.

Immediate Operands

Някои инструкции използват информация от самата инструкция като един (някой път и 2) от операндите. Такъв операнд се нарича immediate operand. Операнда може да е 32-, 16- или 8-бита. Например:

SHR PATTERN, 2

Един байт от инструкцията съдържа стойността 2, номера на битовете с които трябва да shift-нем променливата PATTERN.

TEST PATTERN, 0FFFF00FFH

Двойна дума от инструкцията съдържа маската която се използва за да се тества променливата PATTERN.

Register Operands

Операндите могат да бъдат поставени в един от 32-битовите регистри за общо ползване (EAX, EBX, ECX, EDX, ESI, EDI, ESP или EBP), в един от 16-битовите регистри за общо ползване (AX, BX, CX, DX, SI, DI, SP или BP) или в един от 8-битовите регистри за общо ползване (AH, BH, CH, DH, AL, BL, CL или DL).
x86 процесорите имат инструкции за референция към сегментните регистри (CS, DS, ES, SS, FS, GS). Тези инструкции се използват от програмите само ако дизайнерите на системите са избрали сегментен модел на паметта.
x86 процесорите имат инструкции за референция към флаговия регистър.

Memory Operands

Инструкциите, чиито операнди се намират в паметта, трябва да специфицират(директно или индиректно) сегмента който съдържа операнда и отместването на операнда във сегмента. За по-голямо бързодействие и компактност сегментните селектори се съхраняват във високо скоростни сегментни регистри. Така инструкцията трябва да специфицира само желания сегментен регистър и отместването за да се адресира операнд в паметта.
Инструкциите които изискват достъп до паметта или от регистрите използват един от следните методи за специфициране на отместването на операнда в сегмента:

  1. Повечето такива инструкции съдържат байт който явно специфицира адресиращия метод за операнда. Този байт, наречен modR/M байт, следва кода на операцията и специфицира дали операнда е в регистър или в паметта. Ако операнда е в паметта адресът се изчислява от сегментния регистър и някои от следните стойности: базов регистър, индексен регистър, scaling factor, displacement. Когато се използва индексен регистър modR/M байтът също е последван от друг байт който идентифицира индексния регистър и scaling factor.
  2. Някои инструкции неявно използват специални методи за адресация:
    1. За някои кратки форми на MOV които неявно използват EAX регистърът, отместването на операнда се кодира като двойна дума в инструкцията. Не се използвата базов регистър, индексен регистър или scaling factor.
    2. Операциите с низове неявно адресират паметта посредством DS:ESI, (MOVS, CMPS, OUTS, LODS, SCAS) или чрез ES:EDI (MOVS, CMPS, INS, STOS).
    3. Операциите със стек неявно адресират операндите чрез SS:ESP регистри; e.g., PUSH, POP, PUSHA, PUSHAD, POPA, POPAD, PUSHF, PUSHFD, POPF, POPFD, CALL, RET, IRET, IRETD, exceptions и interrupts.

Segment Selection

Инструкциите за манипулация на информацията не е необходимо да посочват явно кой сегментен регистър се използва. За тези инструкции които не го правят процесорът автоматично избира сегментен регистър по правилата на таблицата.

Memory Reference Needed Segment Register Used Implicit Segment Selection Rule
Instructions Code (CS) Automatic with instruction prefetch
Stack Stack (SS) All stack pushes and pops. Any memory reference that uses ESP or EBP as a base register.
Local Data Data (DS) All data references except when relative to stack or string destination.
Destination Strings Extra (ES) Destination of string instructions.

Адресация на x87 процесорен набор инструкции

x87 е наименование на набор от инструкции за работа с числа с плаваща запетая в процесорната архитектура x86. Подобно на архитектурата x86, тези инструкции носят името си от поредицата математически копроцесори на Intel, които въведоха x87 инструкциите.
Операндите на x87 инструкциите може да се намират или в x87 регистрите, или в паметта (не се използват непосредствени операнди - такива, които са кодирани в самата инструкция).
Повечето x87 инструкции могат да приемат операнд от паметта, а някои от тях могат и да записват резултата в паметта. При достъп до операнд в паметта, могат да се използват стандартните x86 методи за адресиране.
Повечето x87 инструкции могат да приемат операнд от x87 регистър и да записват резултата в него. При достъп до x87 регистрите се използва означението ST(i), където i е число от 0 до 7. ST(0) обозначава регистъра, който е на върха на регистровия стек, ST(1) е регистърът под него и т.н.
Повечето x87 инструкции са с два операнда, като първият е едновременно и място, където се записва резултатът от операцията (подобно на x86 инструкциите).

Intel-64

Това е формирането на 64 битовия адрес.
untitled2.JPG
x86-64 процесор се държи като IA-32 процесор когато е включен в реален или защитен режим. Това са режими които се поддържат когато процесора не е в long режим.
Докато големината на регистрите е увеличена до 64-бита в сравнение с предишната x86 архитектура, адресирането на паметта все още не е увеличено до пълните 64 бита. Засега не е практично да екипираме компютрите с повече памет, така че да се изискват пълните 64 бита. Докато сме в това положение load/store unit(s), cache tags, MMUs и TLBs могат да бъдат по-прости без никаква загуба на използваема памет.

Изчисляване на ефективния адрес(отместването)

untitled3.JPG
modR/M байтът осигурява най-удобния от методите за адресиране. За операндите които се намират в паметта дефинирани от modR/M отместването във желания сегмент се пресмята като се сумират до три компонента:
  • displacement елемент в инструкцията.
  • базов регистър( base register).
  • индексен регистър(index register). Индексния регистър може автоматично да бъде умножен по scaling factor - 2, 4 или 8.

Отместването което се получава от събирането на тези компоненти се нарича ефективен адрес. Всеки един от тези компоненти на ефективния адрес може да има и положителна и отрицателна стойност. Ако сумата на всички тези компоненти превиши 2^(32), ефективния адрес се трансформира в 32 бита.

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