eXeLab
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС
выпущен 4 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Русский / Russian English / Английский

Сейчас на форуме: Public
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS · SVN ·

 eXeL@B —› Основной форум —› Принцип работы shl
Посл.ответ Сообщение

Ранг: 159.1 (ветеран)
Статус: Участник

Создано: 18 августа 2008 23:14 New!
Цитата · Личное сообщение · #1

Казалось бы, простая команда,все предельно ясно. Но вот столкнулся с кодом, который не могу понять/систематизировать:

mov ax,0ffff
mov cx,0e9
shl ax,cl

В доке написано, что значение сдвига может быть от 0 до 31(и это понятно). Сдвинем на 32 бита,специально превысив значение 31, в результате имеем 0. Вроде бы как все логично. Почему же в вышеприведеном примере, результат в регистре ax будет 0FE00 ?


Ранг: 355.4 (мудрец)
Статус: Uploader
5KRT

Создано: 19 августа 2008 01:02 · Поправил: coderess New!
Цитата · Личное сообщение · #2

[DEL]

Ранг: 38.7 (посетитель)
Статус: Участник

Создано: 19 августа 2008 01:10 New!
Цитата · Личное сообщение · #3

Если shl получает невалидное значение второго операнда (вне 1..31), то истинное значение, на которое команда сдвинет значение первого операнда будет вычислено путем вычитания из некорректного операнда числа 32 (для 32битной машины) до тех пор, пока остаток не ляжет в промежуток 1..31.
Конкретно в нашем случае из cx число 32 вычтется семь раз, тогда количество сдвигаемых битов будет равно 9, что удовлетворяет нужному промежутку, на столько shl и сдвинет значение в ax. Вроде так.


Ранг: 1288.1 (!!!!)
Статус: Модератор

Создано: 19 августа 2008 07:47 New!
Цитата · Личное сообщение · #4

нифига не так

Ранг: 30.5 (посетитель)
Статус: Участник

Создано: 19 августа 2008 08:07 · Поправил: obfuskator New!
Цитата · Личное сообщение · #5

[Edited]
Ara пишет:
cl - это 8 бит, E9 там и будет.


точняк, чет я не туда полез


Ранг: 1288.1 (!!!!)
Статус: Модератор

Создано: 19 августа 2008 08:18 New!
Цитата · Личное сообщение · #6

cl - это 8 бит, E9 там и будет.


Ранг: 116.6 (ветеран)
Статус: Участник

Создано: 19 августа 2008 08:51 · Поправил: dermatolog New!
Цитата · Личное сообщение · #7

Количество битов для SHL вычисляется как CL mod 32.
Значение = 32 видимо обрабатываются отдельной веткой.


Ранг: 116.6 (ветеран)
Статус: Участник

Создано: 19 августа 2008 08:58 · Поправил: dermatolog New!
Цитата · Личное сообщение · #8

Кстати вот микрокод для интела:
tempCOUNT = (COUNT AND 1FH);
tempDEST = DEST;
WHILE (tempCOUNT != 0)
DO
IF instruction is SAL or SHL
THEN
CF = MSB(DEST);
ELSE (* instruction is SAR or SHR *)
CF = LSB(DEST);
FI;
IF instruction is SAL or SHL
THEN
DEST = DEST * 2;
ELSE
IF instruction is SAR
THEN
DEST = DEST / 2 (*Signed divide, rounding toward negative infinity*);
ELSE (* instruction is SHR *)
DEST = DEST / 2 ; (* Unsigned divide *);
FI;
FI;
tempCOUNT = tempCOUNT - 1;
OD;
(* Determine overflow for the various instructions *)
IF COUNT = 1
THEN
IF instruction is SAL or SHL
THEN
OF = MSB(DEST) XOR CF;
ELSE
IF instruction is SAR
THEN
OF = 0;
ELSE (* instruction is SHR *)
OF = MSB(tempDEST);
FI;
FI;
ELSE IF COUNT = 0
THEN
All flags remain unchanged;
ELSE (* COUNT neither 1 or 0 *)
OF = undefined;
FI;
FI;

Ранг: 38.7 (посетитель)
Статус: Участник

Создано: 19 августа 2008 09:46 New!
Цитата · Личное сообщение · #9

Ara пишет:
нифига не так


dermatolog пишет:
Количество битов для SHL вычисляется как CL mod 32.


Да я вроде то же самое и написал, только промежуток указал неверный, должен быть 0..31, чтобы при сдвиге на 32 бита ничего не происходило. Ткните где ошибся пожалуйста, не пойму.


Ранг: 1288.1 (!!!!)
Статус: Модератор

Создано: 19 августа 2008 10:11 · Поправил: Ara New!
Цитата · Личное сообщение · #10

как-то не по-дзенски смотрится твой алго получения числа 0..31 =) Ради получения операнда придется семь раз делать вычитание, не тру это...
А вот 0хE9 mod 32==9 как раз самое то...

Ранг: 38.7 (посетитель)
Статус: Участник

Создано: 19 августа 2008 10:33 New!
Цитата · Личное сообщение · #11

Понятно

Ранг: 159.1 (ветеран)
Статус: Участник

Создано: 19 августа 2008 11:25 New!
Цитата · Личное сообщение · #12

Всем спасибо за помощь
 eXeL@B —› Основной форум —› Принцип работы shl
Эта тема закрыта. Ответы больше не принимаются.

Оригинальный DVD-ROM: eXeL@B DVD !

Вы находитесь на форуме сайта EXELAB.RU
Проект ReactOS