Уверен, что такой вопрос уже был , однако, в intel'овских мануалах написано, что при наличии в опкоде: ModRM = 00 XXX 100 (только SIB), и SIB = XX XXX 101, "effective address" вычисляется: [scaled index] + disp32. как формируется весь опкод? disp32, просто добавляется к опкоду? например для NOT: 0xF7 00 010 100b 00 000 101 и + disp32?
Да было темка, но похоже осталась только кешах гугла... Посему перезалил: IntelAmdQuickRef Там усё подробно.
Все верно. При Mod=00b и Base=101b в SIB вместо регистровой базы кодируется "длинная" числовая база (адреса типа [esi*4] приводят к появлению 4-х нулевых байт в опкоде). В целом структура опкода такова: префиксы, основной код, ModRM, SIB, смещение, непосредственный операнд. Код NOT в принципе корректен, но компилятор при Scale=00b и отсутствии регистровой базы обычно не включает в команду SIB, т.е. у тебя получился not dword [eax*1+disp32], что эквивалентно not dword [eax+disp32], но на один байт длиннее и уже ни при каких условиях не позволяет закодировать "короткое" смещение.
Y_Mur однако не настолько, чтобы определить что в "Table 2.2" в строке "[--][--]" надо писать "[--][--] + disp32 (если SIB.BASE = 101)" Phantom_84 угу, разобрался.
могу еще посоветовать по теме статью криса касперски "Тонкости дизассемблирования (дизассемблирование в уме)". лежит где-то на insidepro