2014-10-28 7 views
4

Я изучал руководство разработчика по архитектуре x86, пытаясь очистить мои обратные инженерные навыки. Я знаю, что архитектура сложна и обратно совместима с предыдущими поколениями. С более новыми поколениями некоторые из старых частей документации остаются в стороне. Но один из тревожных объяснений и кривотолков была инструкция, похожая на этот:x86 Декодирование команд OpCode

80 /2 ib 

Так инструкции, основанная на следующий 80 OpCode будет сопровождаться/RM/REG байтами MOD. Один из побочных эффектов, связанных с игнорированием старого контента, я не имел понятия о различных версиях MOD/RM/REG байт. Но я всегда считал, что это была разница, потому что архитектурные корни были 8/16-бит. К счастью, я наткнулся на вскрытие байт MOD/RM/REG во время первоначального внедрения архитектуры.

Так, как указано выше, за которым следует цифра прямой косой черты, указано, что значение Octal будет содержаться в смещении RM байта MOD/RM/REG, будет значением 2.

Мой актуальный вопрос (ы) являются следующим:

компенсированы ли MOD в MOD/RM/REG байты принимают все режимы адресации в текущем состоянии или существует какое-либо ограничение, налагаемое? С другой стороны, кто-нибудь знает, почему цифра указана с помощью /2? Было бы основанием полагать, что более низкие значения использовались в старших поколениях ISA и, таким образом, сохраняются для обратной совместимости.

+0

'/ 2' относится к значению поля' reg' байта ModRM. Поле 'reg' имеет размер 3 бита (бит 3..5). В AMD manual Vol 3: '/ n Поле регистров ModRM-байта или базовое поле SIB-байта, где n - значение между нулем (двоичное число) и 7 (двоичное число 111).' 'Ib' означает немедленный байт.В 16-битовом коде '80 00 00' есть' add byte [bx + si], 0x0', '80 08 00' is 'или byte [bx + si], 0x0', **' 80 10 00' is ' adc byte [bx + si], 0x0' **, '80 18 00' is' sbb byte [bx + si], 0x0', '80 20 00' is 'и byte [bx + si], 0x0',' 80 28 00 'is' sub byte [bx + si], 0x0', '80 30 00' является' xor byte [bx + si], 0x0' и '80 38 00' является' cmp byte [bx + si] , 0x0'. – nrz

+0

Возможно, вы захотите ознакомиться с руководствами AMD и Intel. [Руководства AMD] (http://developer.amd.com/resources/documentation-articles/developer-guides-manuals/) [прямая ссылка на тома AMD 3 pdf] (http: //amd-dev.wpengine.netdna- cdn.com/wordpress/media/2008/10/24594_APM_v3.pdf) [Руководства Intel] (http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html) [прямая ссылка на объединенные тома Intel pdf] (http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual -325462.pdf). – nrz

ответ

2
Instruction Prefix    0 or 1 Byte 
Address-Size Prefix    0 or 1 Byte 
Operand-Size Prefix    0 or 1 Byte 
Segment Prefix     0 or 1 Byte 
Opcode       1 or 2 Byte 
Mod R/M       0 or 1 Byte 
SIB, Scale Index Base (386+)  0 or 1 Byte 
Displacement      0, 1, 2 or 4 Byte (4 only 386+) 
Immediate       0, 1, 2 or 4 Byte (4 only 386+) 

Format of Postbyte(Mod R/M byte from Intel-manual) 
-------------------------------------------------- 
MM RRR MMM 

MM - Memory addressing mode 
RRR - Register operand address 
MMM - Memory operand address 

RRR Register Names 
Filds 8bit 16bit 32bit 
000 AL  AX  EAX 
001 CL  CX  ECX 
010 DL  DX  EDX 
011 Bl  BX  EBX 
100 AH  SP  ESP 
101 CH  BP  EBP 
110 DH  SI  ESI 
111 BH  DI  EDI 

--- 

16bit memory (No 32 bit memory address prefix) 
MMM Default MM Field 
Field Sreg  00  01   10    11=MMM is reg 
000 DS  [BX+SI] [BX+SI+o8] [BX+SI+o16] 
001 DS  [BX+DI] [BX+DI+o8] [BX+DI+o16] 
010 SS  [BP+SI] [BP+SI+o8] [BP+SI+o16] 
011 SS  [BP+DI] [BP+DI+o8] [BP+DI+o16] 
100 DS  [SI]  [SI+o8]  [SI+o16] 
101 DS  [DI]  [DI+o8]  [SI+o16] 
110 SS  [o16]  [BP+o8]  [BP+o16] 
111 DS  [BX]  [BX+o8]  [BX+o16] 
Note: MMM=110,MM=0 Default Sreg is DS !!!! 

32bit memory (Has 67h 32 bit memory address prefix) 
MMM Default MM Field 
Field Sreg  00  01   10    11=MMM is reg 
000 DS  [EAX]  [EAX+o8] [EAX+o32] 
001 DS  [ECX]  [ECX+o8] [ECX+o32] 
010 DS  [EDX]  [EDX+o8] [EDX+o32] 
011 DS  [EBX]  [EBX+o8] [EBX+o32] 
100 SIB  [SIB]  [SIB+o8] [SIB+o32] 
101 SS  [o32]  [EBP+o8] [EBP+o32] 
110 DS  [ESI]  [ESI+o8] [ESI+o32] 
111 DS  [EDI]  [EDI+o8] [EDI+o32] 
Note: MMM=110,MM=0 Default Sreg is DS !!!! 

--- 

SIB is (Scale/Base/Index) 
SS BBB III 
Note: SIB address calculated as: 
<sib address>=<Base>+<Index>*(2^(Scale)) 

Fild Default Base 
BBB Sreg Register Note 
000 DS  EAX 
001 DS  ECX 
010 DS  EDX 
011 DS  EBX 
100 SS  ESP 
101 DS  o32  if MM=00 (Postbyte) 
SS  EBP  if MM<>00 (Postbyte) 
110 SS  ESI 
111 DS  EDI 

Fild Index 
III register Note 
000 EAX 
001 ECX 
010 EDX 
011 EBX 
100    never Index SS can be 00 
101 EBP 
110 ESI 
111 EDI 

Fild Scale coefficient 
SS =2^(SS) 
00 1 
01 2 
10 4 
11 8 
3

Вы должны прочитать Глава 2 ИНСТРУКЦИЯ ПО FORMAT в руководстве. В качестве краткой информации в нотации /digit используется поле reg/opcode байта modr/m в качестве расширения кода операции данного значения. В руководстве написано: Поле reg/opcode указывает либо номер регистра, либо еще три бита информации о кодах операций.. См. Также Таблица 2-2. 32-битные формы адресации с байтом ModR/M.

Расширение кода операции используется, когда нет второго операнда регистров, например, для непосредственных пользователей, как в вашем примере, который равен ADC r/m8, imm8. Другие инструкции существуют с основным кодом операции 80, но разные расширения. Вы можете посмотреть в таблице Таблица A-6. Opcode Расширения для Одно- и двух-байтовых Opcodes по группе Число, и видеть, что опкод расширения от 0 до 7 соответствуют ADD, OR, ADC, SBB, AND, SUB, XOR, CMP соответственно.

Также обратите внимание, что modr/m и, следовательно, эта схема кодирования используется также в 32 и 64-битном коде, поэтому это не является чем-то устаревшим. Например, ADC [eax], 0x42 имеет машинный код 80 10 42, где 80 является основным опкод, 10 является ModR/м с 2 в поле Изотерм и указав [eax], и, конечно же 42 является непосредственным.

Смежные вопросы