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


           

Изменился всего один бит


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). В ассемблере для указания того, что в регистре содержится адрес операнда, а не его значение, регистр заключают в квадратные скобки.

Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий