Ассемблер Это просто! Учимся программировать


ГЛАВА 08


В я писал о том, что программа не работает на 486 процессорах (помните?). Пришло несколько ответов, которые я опубликую (возможно, вам это будет интересно):

В 486 процессорах есть ошибка в схемотехнике, приводящая к тому, что при записи в память по адресу большему текущего IP, но меньшему длины очереди предвыборки команд, содержимое очереди не перечитывается, а выполняется то, что уже было считано процессором. Поэтому процессор никак не реагирует на изменения в коде. Эта ошибка была исправлена только в Пентиуме.

Прислал Alex.

_______

Мне кажется, я могу дать объяснение данному "феномену" :) Дело в том, что у процессоров 80486 работа механизма кэширования отлична от механизма реализованного в процессорах Pentium. Попробую разъяснить.

Дело в том, что процессор, при выполнении команд, считывает их в кэш. И на выполнение команды поступают уже из кэша. Так вот. Секрет в том, что при изменении участка кода, который уже закэшировал процессор 486, не обновляет содержимое кэша!!! Т.е. на 486 процессорах возможен вариант затирания NOP-ами всей программы, и, тем не менее, она выполнится. В случае с Pentium-ами, ситуация выглядит более правильной. При изменении участка памяти, который уже закэширован, процессор сбрасывает содержимое кэша и заново считывает данные из памяти. Поэтому пример работает на Pentium и не работает на 486.

Остается один момент: почему на 486 под SoftIce программа-таки да выполняется? Тут дело в том, что когда отладчик прерывает выполнение программы, то меняются значения всех сегментных регистров. И процессор принудительно сбрасывает кэш, так как его содержимое ему уже не нужно. А так как кэш сбрасывается, то его новое содержимое уже будет отражать текущее содержимое памяти, и, следовательно, программа выполняется по командам, которые лежат в памяти. А там как раз лежат именно нами прописанные NOP-ы.

Прислал Slava V.




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



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