Win32 в машинных кодах


Введение в машинные коды для Win32 - часть 6


1011 w reg &ltбайты данных&gt

В зависимости от значения бита w за опкодом следует либо 1, либо 4 байта, содержащих непосредственное значение (и это значение попадет соответственно либо в 1-байтную часть регистра, либо заполнит регистр целиком). В архитектуре IA-32 используется так называемый "little-endian" порядок следования байтов (его называют обратным): сначала (по младшим адресам в памяти) размещаются младшие байты числа. Т.е. 16-ричное ABCDh будет представлено как байты CDh ABh, а 12345678h - как 78h 56h 34h 12h. Подробнее об этом поговорим в следующей статье, а пока пример: загрузим в регистр EAX единицу. Регистр 000, бит w=1 (полный регистр), а данные - внимание - 4 байта для одной единицы!

10111000 00000001 00000000 00000000 00000000

Или в 16-ричном виде: B8 01 00 00 00. А вот как то же значение передается в младший байт регистра EAX (т.е. AL): регистр тот же - 000, бит w=0 (1 байт), а вот данные уже - 1 байт - 01:

10110000 00000001 (B0 01)

Обратите внимание - если в регистре EAX до этого содержался 0, последняя инструкция будет равносильна первой. Но в общем случае это не так.

Теперь эту же единицу загрузим в старший байт регистра AX (2-й байт EAX): тоже один байт (w=0), но код регистра AH уже другой (100):

10110100 00000001 (B4 01)

Удовольствие составления различных инструкций с данным опкодом оставим вам для самостоятельных упражнений и перейдем к другой команде, которая перемещает данные между памятью и регистром EAX (AX, AL):

101000 d w &ltбайты адреса&gt

Этот опкод содержит бит w, но не содержит кодов регистров, поскольку он предполагает работу лишь с регистром EAX (или его частью). Зато есть другой характерный бит - d (direction), указывающий направление перемещения данных - из памяти в регистр (0) или из регистра в память (1).

В этом примере мы видим одну важную особенность обращения к данным в памяти: размер операнда и размер его адреса в памяти - разные вещи. В данном случае операнд находится в памяти и может занимать 1, 2 или 4 байта, тогда как адрес (входящий в состав самой инструкции) в любом случае занимает 4 байта. Составим инструкцию для перемещения в регистр EAX значения, которое хранится по адресу 1. Используется полный регистр (w=1), направление - из памяти в регистр (d=0):




Начало  Назад  Вперед



Книжный магазин