Сейчас на форуме: subword, rtsgreg1989 (+9 невидимых)

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

Ранг: 159.1 (ветеран), 7thx
Активность: 0.130
Статус: Участник

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

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

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

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




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

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

[DEL]

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes




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

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

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




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

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

нифига не так



Ранг: 30.5 (посетитель), 5thx
Активность: 0.010
Статус: Участник

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

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


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




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

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

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




Ранг: 116.6 (ветеран), 8thx
Активность: 0.050
Статус: Участник

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

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




Ранг: 116.6 (ветеран), 8thx
Активность: 0.050
Статус: Участник

Создано: 19 августа 2008 08:58 · Поправил: dermatolog
· Личное сообщение · #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 (посетитель)
Активность: 0.020
Статус: Участник

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

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


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


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




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

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

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



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

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

Понятно



Ранг: 159.1 (ветеран), 7thx
Активность: 0.130
Статус: Участник

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

Всем спасибо за помощь


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