Посл.ответ |
Сообщение |
Ранг: 159.1 (ветеран), 7thx Активность: 0.13↘0 Статус: Участник
|
Создано: 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.32↘0 Статус: Uploader 5KRT
|
Создано: 19 августа 2008 01:02 · Поправил: coderess · Личное сообщение · #2
[DEL]
----- Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes | Сообщение посчитали полезным: |
Ранг: 38.7 (посетитель) Активность: 0.02↘0 Статус: Участник
|
Создано: 19 августа 2008 01:10 · Личное сообщение · #3
Если shl получает невалидное значение второго операнда (вне 1..31), то истинное значение, на которое команда сдвинет значение первого операнда будет вычислено путем вычитания из некорректного операнда числа 32 (для 32битной машины) до тех пор, пока остаток не ляжет в промежуток 1..31.
Конкретно в нашем случае из cx число 32 вычтется семь раз, тогда количество сдвигаемых битов будет равно 9, что удовлетворяет нужному промежутку, на столько shl и сдвинет значение в ax. Вроде так.
| Сообщение посчитали полезным: |
 Ранг: 1288.1 (!!!!), 273thx Активность: 1.29↘0 Статус: Участник
|
Создано: 19 августа 2008 07:47 · Личное сообщение · #4
нифига не так
| Сообщение посчитали полезным: |
Ранг: 30.5 (посетитель), 5thx Активность: 0.01↘0 Статус: Участник
|
Создано: 19 августа 2008 08:07 · Поправил: obfuskator · Личное сообщение · #5
[Edited]
Ara пишет:
cl - это 8 бит, E9 там и будет.
точняк, чет я не туда полез
| Сообщение посчитали полезным: |
 Ранг: 1288.1 (!!!!), 273thx Активность: 1.29↘0 Статус: Участник
|
Создано: 19 августа 2008 08:18 · Личное сообщение · #6
cl - это 8 бит, E9 там и будет.
| Сообщение посчитали полезным: |
 Ранг: 116.6 (ветеран), 8thx Активность: 0.05↘0 Статус: Участник
|
Создано: 19 августа 2008 08:51 · Поправил: dermatolog · Личное сообщение · #7
Количество битов для SHL вычисляется как CL mod 32.
Значение = 32 видимо обрабатываются отдельной веткой.
| Сообщение посчитали полезным: |
 Ранг: 116.6 (ветеран), 8thx Активность: 0.05↘0 Статус: Участник
|
Создано: 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.02↘0 Статус: Участник
|
Создано: 19 августа 2008 09:46 · Личное сообщение · #9
Ara пишет:
нифига не так
dermatolog пишет:
Количество битов для SHL вычисляется как CL mod 32.
Да я вроде то же самое и написал, только промежуток указал неверный, должен быть 0..31, чтобы при сдвиге на 32 бита ничего не происходило. Ткните где ошибся пожалуйста, не пойму.
| Сообщение посчитали полезным: |
 Ранг: 1288.1 (!!!!), 273thx Активность: 1.29↘0 Статус: Участник
|
Создано: 19 августа 2008 10:11 · Поправил: Ara · Личное сообщение · #10
как-то не по-дзенски смотрится твой алго получения числа 0..31 =) Ради получения операнда придется семь раз делать вычитание, не тру это...
А вот 0хE9 mod 32==9 как раз самое то...
| Сообщение посчитали полезным: |
Ранг: 38.7 (посетитель) Активность: 0.02↘0 Статус: Участник
|
Создано: 19 августа 2008 10:33 · Личное сообщение · #11
Понятно
| Сообщение посчитали полезным: |
Ранг: 159.1 (ветеран), 7thx Активность: 0.13↘0 Статус: Участник
|
Создано: 19 августа 2008 11:25 · Личное сообщение · #12
Всем спасибо за помощь
| Сообщение посчитали полезным: |