Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Соглашаюсь, это неправильно. Может и вправду в Intel написать? 12.02.04 12:03 Число просмотров: 1309
Автор: HandleX <Александр М.> Статус: The Elderman
|
> > Как вы думаете, что будет в EAX после исполнения > > следующего: > > > > MOV EAX, 7777 > > RCR EAX, 32 > > RCL EAX, 64 > > Вот здесь меня терзают смутные сомнения. Поскольку полный > круг = 33 бита (32 + перенос), то двигать нужно было > соответственно на 33 и 66. Это, если по-хорошему. Да и > вообще результат этих двух прокрутов должен быть > эквивалентен RCL EAX, 32 или RCR EAX, 1. > > Как вы думаете, что будет в EAX после исполнения > > следующего: > > > > MOV EAX, 7777 > > RCR EAX, 32 > > RCL EAX, 64 > > Вот здесь меня терзают смутные сомнения. Поскольку полный > круг = 33 бита (32 + перенос), то двигать нужно было > соответственно на 33 и 66. Это, если по-хорошему. Да и > вообще результат этих двух прокрутов должен быть > эквивалентен RCL EAX, 32 или RCR EAX, 1.
Во всех инструкциях циклического сдвига, просто сдвига и сдвига с исп. флага переноса используются только младшие 5 бит второго операнда, что реально даёт возможность сдвига на 31 позицию максимум. Остальное понятно (проявление цикличности и проч. «эффекты»), поскольку все они исходят из этого 5-битного ограничения.
И если с обычными и циклическими сдвигами без использования флага переноса всё понятно, поскольку такая "фича" процессора не только покрывает все возможные варианты сдвига, но и может найти какое-нибудь полезное применение в программировании, то циклические сдвиги RCL и RCR с невозможностью сдвига на 32 позиции явная недоработка.
В самом деле, рассмотрим пример:
Пусть CF = 0;
MOV EAX, $FFFFFFFF
RCL EAX, 31
В результате получим $BFFFFFFF, что в двоичном представлении будет 101(30), СF = 1
Но если изменить инструкцию сдвига на [RCL EAX, 32], то теоретически в результате должны получить 01(31), CF = 1, чего не наблюдается. Налицо ошибка процессора. Ошибка ещё и потому, что аналогичная 16-битная инструкция на свой полный размер отрабатывается корректно, т.е. последовательность [CF = 0; MOV AX, $FFFF; RCL AX, 16] даст в результате EAX = 01(15), СF = 1.
Я немножко порыл Сеть, но ничего об этом нигде не нашёл. Может и вправду, напишем в Intel? Прикольно то, что конкуренты (AMD) старательно копируют все фичи и баги, поскольку на этих процессорах точно такая же картина с этими инструкциями.
|
|
|