Тема 5

5. Формат на инструкциите в защитен режим на работа: префикси, кодове на операциите, Mod/rm и SIB байтове, отместване и непосредствени операнди, кодиране на адресните режими.


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


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

Формат на инструкциите

Още от първата тема знаем какво е защитен режим на работа на процесора, така че сега няма да се спираме на това.
Една x86 инструкция е разделена на няколко елемента:
1)Instruction prefixes – отразяват се на поведението на операциите които трябва инструкцията да извърши.
2)Opcode – може да бъде един или повече байта(до три цели байта).
3)ModR/M байт –не задължителен и понякога може да съдържа част от opcode-а.
4)SIB байт – не е задължителен и представлява комплексни индиректни паметни форми.
5)Displacement – отместването, не е задължително и е стойност с варираща големина от байтове(byte, word, long).
6)Immediate - не е задължителен компонент и се използва като числова стойност от вариращи размери от байтове(byte, word, long).

Формата изглежда така:
1.JPG

Instruction Prefixes

Instruction prefixes не са задължителни и се използват когато на основното поведение на инструкцията не му достига функционалност.
Ако искате да увеличите функционалността на инструкцията или да смените параметрите и, префиксите могат да ви помогнат.
Има четири типа префикси:
1. Lock and Repeat
2. Segment Override
3. Operand Size
4. Address Size

Тук са показани стойностите на различните префикси в шестнадесетична бройна система и тяхното предназначение:
- Lock and Repeat:
- 0xF0 — LOCK
- 0xF2 — REPNE/REPNZ
- 0xF3 - REP/REPE/REPZ
- Segment Override:
- 0x2E - CS
- 0x36 - SS
- 0x3E - DS
- 0x26 - ES
- 0x64 - FS
- 0x65 - GS
- Operand-Size Override: 0x66, switching to non-default size.
- Address-Size Override: 0x67, switching to non-default size.

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

Lock префиксът се използва за да се заключи магистралата за писане. Използва се с множество техники за синхронизация на кода.

Repeat префиксите са замислени да бъдат от същия тип като Lock префиксът, така че инструкцията да може да има само Lock или Repeat, не и двата префикса по едно и също време.
Repeat префиксите се използват само със string инструкции които поддържат този префикс.
Има два repeat префикса, REPZ и REPNZ, повтаряй докато Zero флагът не е вдигнат и обратното.

Segment Override се използва за да се смени сегмента по подразбиране на инструкцията. Всеки регистър за общо ползване има свой сегмент по подразбиране. Например SS за ESP, DS за BX, и тн…

Operand Size Override е отговорен за смяната на размера на операцията. Това означава, че ако даден код се изпълнява в 32 битова среда и този префикс се използва, тази инструкция ще се изпълни като 16 битова инструкция.

Address Size Override работи като Operand Size префикса, но върху косвено паметния модел на операнда.
Така ако четем(в 16 бита) от [BP+DI], когато го префиксираме, резултата е четене от [EBX].

If you still ask yourself why you need both address and operand prefixes, the answer is right here.
Let's do some order in the mess:
You have to distinguish between the operand size and the address size.
The operand size acts on OPERATION size. The operation size is determined implicitly by the instruction.
Например (Модела на декодиране по подразбиране е 16 битов):
MOV AX, BX //знаем, че размера на операцията е 16 бита, понеже знаем, че AX и BX са 16 битови регистри.
MOV EAX, EBX // 32 бита.
MOV EAX, [EBX] //все още лесно, EAX е 32 бита, така че четем 32 бита от паметта.
Но тук:
MOV [EBX], 5 // Виждате проблема, не знаем размера на операцията. Затова трябва явно да кажем на асемблера размера на операцията

Opcode

Кода на операцията е статичен елемент от инструкцията който води до (дефинира) самата инструкция.
Големината на кода на операцията варира от 1 до 4 байта. Той също може да включва и още 3 бита от REG полето от ModR/M байта.

ModR/M

Някои инструкции изискват ModR/M байтът за да специфицира формата на операндите.
И някои други инструкции знаят типовете на операндите си предварително от своя код на операцията и не се нуждаят от ModR/M байт за да се специфицират.
ModR/M байта не е задължителен. ModR/M може да доведе до следващ SIB байт.
Кода на операцията на инструкцията има информация за типа на операндите, но тези типове биха могли да бъдат разширени по някакъв начин, например да има immediate операнд или по-сложен начин за образуване на ефективния адрес.
Ролята на ModR/M е да дефинира дали са необходими SIB байт, immediate операнд или отместване.
И още повече дефинира регистрите, които се използват, в зависимост от типа на операндите.
ModR/M се образува от три полета:
4.JPG

MOD полето са 2-та най-значими бита, то дефинира дали се използва отместване(displacement) и ако се използва такова, колко е голямо.

MOD Bin
No DISP 00
DISP8 01
DISP16/32 10
REG 11

MOD
00 означава, че не се използва отместване.
01 изисква отместване 8 бита.
10 изисква отместване 16 и 32 бита, размера се определя от кодиращия модел.
11 означава че само регистри за общо ползване се използват.

Така известното REG поле(3 бита).
REG полето се използва за да специфицира регистъра на единия от операндите, ако се използва такъв разбира се.
R/M полето означава регистър (Register) или памет(Memory).
То има различно значение и значението му е избрано от MOD полето.
2.JPG

SIB

SIB значи Scale-Index-Base, това е един байт който съдържа тези полета.
Той не е задължителен и ако се използва, трябва да бъде след ModR/M байтът.
SIB прави ефективния адрес по силен, така използваме по-малко инструкции за да се изчислят по-сложни адреси.
Формата е:

5.JPG

И излиза като [INDEX*SCALE + BASE].
3.JPG

Displacement

Отместването не е задължителен компонент, може да бъде използвано само ако R/M полето позволи.
Размера на отместването варира между 1 байт, 2 байта или 4 байта, MOD и R/M полетата дефинират това.
Това поле трябва да следва ModR/M байта или SIB байта ако такъв съществува.

Immediate

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

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