Изменился всего один бит
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"). В последнем случае адрес памяти, по которому находится операнд, вычисляется следующим образом (см. табл.):
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 байта смещения |
101 | 4 байта смещения | [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
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий