Из Руководства разработчика ПО для архитектуры Intel, том 2: Справочное руководство по набору инструкций , таблица 3-1. Регистрация кодировок, связанных с номенклатурой + rb, + rw и + rd, стр. 3-3:
AL = 0 AX = 0 EAX = 0
CL = 1 CX = 1 ECX = 1
DL = 2 DX = 2 EDX = 2
BL = 3 BX = 3 EBX = 3
AH = 4 SP = 4 ESP = 4
CH = 5 BP = 5 EBP = 5
DH = 6 SI = 6 ESI = 6
BH = 7 DI = 7 EDI = 7
Чтобы ответить на ваш вопрос («ага, замечательно. Мне трудно найти список инструкций для перемещения регистров в регистры. Можете ли вы пролить свет?»):
Сначала приведем немного рыбы: (для 8-битных регистров)
8a c0 mov al, al
8a c1 mov al, cl
8a c2 mov al, dl
8a c3 mov al, bl
8a c8 mov cl, al
8a c9 mov cl, cl
8a ca mov cl, dl
8a cb mov cl, bl
8a d0 mov dl, al
8a d1 mov dl, cl
8a d2 mov dl, dl
8a d3 mov dl, bl
8a d8 mov bl, al
8a d9 mov bl, cl
8a da mov bl, dl
8a db mov bl, bl
А вот как начать ловить рыбу:
В руководстве по набору инструкций Intel найдите инструкцию MOV на стр. 3-402. Вы найдете таблицу, в которой перечислены различные разновидности инструкции MOV, начиная с:
88 /r MOV r/m8,r8 Move r8 to r/m8
89 /r MOV r/m16,r16 Move r16 to r/m16
89 /r MOV r/m32,r32 Move r32 to r/m32
8A /r MOV r8,r/m8 Move r/m8 to r8
8B /r MOV r16,r/m16 Move r/m16 to r16
8B /r MOV r32,r/m32 Move r/m32 to r32
Обратите внимание, как наша рыба выше использует код операции 8A. Как вы можете догадаться, r8 - это 8-битный регистр, а r / m8 может быть либо 8-битным регистром, либо байтом из памяти. Также обратите внимание, как доступны различные коды операций MOV для 16- и 32-разрядных регистров и значений (r16, r32). На страницах с 3-2 по 3-5 объясняются различные типы аргументов, которые вы можете указать в инструкции MOV.
Но, вы можете сказать, это не говорит вам достаточно о том, как построить следующие байты в инструкции. Для этого посмотрите раздел 2.1 - Общий формат инструкции, начиная со страницы 2-1. Инструкции x86 могут состоять из последовательностей длиной до 6 байтов: префиксы, код операции, ModR / M, SIB, смещение и непосредственные значения. Наши инструкции по перемещению регистра просты и включают только код операции (8A) и байт ModR / M.
Разбивка байта ModR / M документирована в разделе 2.4, а также во всеобъемлющих таблицах на страницах с 2-5 по 2-6. Вы обнаружите, что байт ModR / M может кодировать регистр источника и назначения. Например, для перехода от AL к DL вы будете использовать значение D0 ModR / M, дающее инструкцию 8A D0.