Inc edi
и
DEC ECX
регистры общего назначения EDI и ECX задаются 3-битовыми кодами в байте кода операции.
Кодировка непосредственной адресации
Режим непосредственной адресации задается в поле кода операции. Например, команда
MOV ЕАХ,820
имеет длину 5 байт. В однобайтовом поле кода операции определяется операция пересылки, указывается, что операнд задан непосредственно и имеет длину 32 разряда, а также задается имя регистра назначения. За кодом операции следует 4-байтовое значение 820. Если непосредственно заданный операнд имеет длину 8 бит, то для команды
MOV DL,5
достаточно 2 байт.
Режимы адресации и поля смещения
Если команда имеет два операнда, то один из них должен содержаться в регистре, а другой — либо в регистре, либо в памяти. Для этого правила имеются два исключения, когда оба операнда могут находиться в памяти. Одно из них касается команд, в которых первый операнд задается в режиме непосредственной адресации, а второй — в режиме прямой адресации. Другое исключение относится к операциям проталкивания и выталкивания значений из стека процессора. Стек располагается в памяти в сегменте стека, и в него можно поместить значение из памяти, а можно вытолкнуть из него значение в память. Эти операции подробно описаны в разделе6.6.
Когда оба операнда находятся в регистрах, для поля режима адресации достаточно одного байта. Например, команда
ADD EAX,EDX
занимает 2 байта. В первом из них содержится код операции, а во втором — коды двух регистров.
Рассмотрим несколько примеров кодирования команд, один операнд которых располагается в памяти, а другой в регистре. Команда
MOV ECX,N
в программах на рис. 5.4 кодируется 6 байтами: один для кода операции, один для поля адресного режима, в котором задается режим прямой адресации и регистр ЕСХ, и четыре байта для адреса памяти N. Для кодирования команды
ADD EAX,[EBX+EDI*4]
в тех же программах требуется 2-байтовое поле режима адресации, поскольку для вычисления исполнительного адреса исходного операнда используются два регистра. Во втором из этих байтов задается коэффициент масштабирования 4. Таким образом, для всех команд требуется три байта, с учетом байта для кода операции. Теперь рассмотрим команду
MOV DWORD PTR[EBP+ESI*4+DISP],10
Директива ассемблера DWORD PTR указывает, что непосредственно заданный операнд 10 имеет длину 32 бита. В других языках ассемблера размер операнда часто определяется мнемоническим обозначением команды. Например, в языке процессора Motorola 68000 команда MOVEB определяет 1-байтовый операнд, а команда MOVEL — 4-байтовый. Если в команде задано 32-разрядное значение смещения DISP, для ее кодирования требуется 11 байт: один байт для поля кода операции, два — для поля режима адресации и по четыре байта для полей смещения и непосредственно заданного операнда. В табл. 5.1 указано, что смещение может иметь дину 8 или 32 бита. Его размер задается в первом из двух байтов поля режима адресации.
При кодировании команд с двумя операндами спецификации регистровых операндов и операндов в памяти располагаются в строго определенном порядке, и регистровый операнд всегда задается первым. Для различения команды
MOV EAX,LOCATION
которая загружает в регистр ЕАХ содержимое памяти по адресу LOCATION, и команды
MOV LOCATION,EAX
загружающей в память по адресу LOCATION содержимое регистра ЕАХ, в поле кода операции содержится бит, который называется битом направления. Он указывает, какой из операндов является исходным.
Правила кодирования полей кода операции и адресного режима в архитектуре IA-32 довольно сложны, не всегда унифицированы и имеют множество исключений. И хотя это несколько затрудняет для компилятора использование всех возможностей системы команд и режимов адресации, архитектура IA-32, без сомнения, обладает большой гибкостью.