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


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


10100001 00000001 00000000 00000000 00000000 (A1 01 00 00 00)

А теперь то же значение загрузим в регистр AL (w=0, d=0):

10100000 00000001 00000000 00000000 00000000 (A0 01 00 00 00)

Изменился всего один бит инструкции! Между тем результат операции будет разительно отличаться: в первом случае в регистр EAX будут скопированы четыре (!) байта, начиная с адреса 1, тогда как во втором случае - в регистр AL будет скопирован лишь один байт по тому же адресу, остальные 3 байта регистра EAX останутся без изменений.

Архитектура IA-32 предоставляет очень богатый набор способов адресации памяти. Сейчас отметим лишь, что возможна еще и косвенная адресация, когда адрес операнда в памяти находится в регистре, а инструкция ссылается на соответствующий регистр. Для работы с такими случаями, а также для перемещения данных между регистрами используется так называемый байт способа адресации (ModR/M). Этот байт следует непосредственно за опкодом, который предполагает его использование, и содержит следующие поля:

2 бита MOD - 3 бита REG - 3 бита R/M

Байт ModR/M предполагает, что имеются два операнда, причем один из них всегда находится в регистре (код которого содержится в поле REG), а второй может находиться (в зависимости от значения поля MOD) либо тоже в регистре (при MOD = 11; при этом поле R/M содержит код регистра), либо в памяти (R/M="register or memory"). В последнем случае адрес памяти, по которому находится операнд, вычисляется следующим образом (см. табл.):

R/MMOD=00MOD=01MOD=10

000[EAX][EAX] + 1 байт смещения [EAX] + 4 байта смещения

001[ECX][ECX] + 1 байт смещения [ECX] + 4 байта смещения

010[EDX][EDX] + 1 байт смещения [EDX] + 4 байта смещения

011[EBX][EBX] + 1 байт смещения [EBX] + 4 байта смещения

100 SIB SIB + 1 байт смещения SIB + 4 байта смещения

1014 байта смещения [EBP] + 1 байт смещения [EBP] + 4 байта смещения

110[ESI][ESI] + 1 байт смещения [ESI] + 4 байта смещения

111[EDI][EDI] + 1 байт смещения [EDI] + 4 байта смещения

SIB означает, что после байта ModR/M следует еще один байт способа адресации (Scale-Index-Base - SIB), который мы рассматривать не будем. При MOD=00 нужный адрес памяти находится в соответствующем регистре, кроме R/M=101, когда 4 байта адреса следуют непосредственно после опкода и байта ModR/M (как в случае команды 101000dw). В ассемблере для указания того, что в регистре содержится адрес операнда, а не его значение, регистр заключают в квадратные скобки.




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



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