Автор
|
Тема: И ещё один
|
MishaZ |
опубликован 20-01-2002 14:13 MSK
Работает ли SHL с ячеёками памяти ???
|
rivitna
|
опубликован 20-01-2002 14:19 MSK
Естественно |
rivitna
|
опубликован 20-01-2002 14:47 MSK
Я тут ознакомился для чего тебе этого: http://www.sources.ru/NonCGI/Forum9/HTML/000124.htmlЭто сильно! :))))))) Процессоры i486 и выше при операциях сдвига (sal, shl, rol и т.д.) используют только первые пять бит счетчика (то есть до 31). Так, как ты делаешь, тебе как минимум нужны 128 разрядные регистры или операнды, чтоб битик, который ты двигаешь, остался в пределах видимости :))) Так что и здесь лучше использовать команды сопроцессора f2xm1 (2^x - 1)
|
MishaZ
|
опубликован 20-01-2002 15:30 MSK
Ну совсем ваыручиллл =) |
MishaZ
|
опубликован 20-01-2002 15:30 MSK
Ну совсем ваыручиллл =)
|
rivitna
|
опубликован 20-01-2002 15:55 MSK
Не торопись, я не до конца объяснил. f2xm1 - хитрая команда, -1 < x < 1Вычислять надо по формуле y^x = 2 ^ (x * log2(y)) Пусть x, y - числа типа integer, z - типа extended, тогда fild [y] fyl2x fild [x] fmul st,st(1) f2xm1 fld1 fadd st,st(1) fst [z] Надеюсь, ничего не напутал! :) |
rivitna
|
опубликован 20-01-2002 17:00 MSK
Мало того, что с кодом облажался :( fild x fild y fyl2x f2xm1 fld1 fadd st,st(1) fst z Да и толку нет от этого кода! На промежуточном этапе число выходит за диапазонМожно втупую сделать: y := 2; x := 100; asm fild y mov cx,x sumloop: fadd sp,sp(0) loop sumloop fst z end
|
MishaZ
|
опубликован 20-01-2002 17:02 MSK
Брьььь а все ли процессоры у которых математический сопроцессор есть енто поддерживают ? |
NOPIK
|
опубликован 20-01-2002 20:05 MSK
Операции у всех практически одинаковые (это стандарт IEE), но состав операндов и мнемоника могут различаться |
rivitna
|
опубликован 20-01-2002 20:55 MSK
Если хочешь, чтоб совсем было хорошо (хотя сейчас это дело ненужное) и если ты эстет, проверь наличие сопроцессора.Наиболее корректный и простой способ: FPU_Test PROC finit mov cx,0Ch @@WaitLoop1: loop @@WaitLoop1 mov ax,5A5Ah push ax fstcw WORD PTR [sp] mov cl,0FFh @@WaitLoop2: loop @@WaitLoop2 pop ax and ax,1F3Fh cmp ax,33Fh ret FPU_Test ENDP Если в результате ZF=1, как минимум 8087 есть |
rivitna
|
опубликован 20-01-2002 21:14 MSK
Поторопился отослать, потом обратил внимание, что адресацию сделал через SP, то есть в 16-размерном коде и на процессорах ниже 386 работать не будет. :(Исправляюсь: FPU_Test PROC push bp mov bp,sp mov ax,5A5Ah push ax finit mov cx,0Ch @@WaitLoop1: loop @@WaitLoop1 fstcw WORD PTR [bp-2] mov cl,0FFh @@WaitLoop2: loop @@WaitLoop2 mov ax,[bp-2] and ax,1F3Fh cmp ax,33Fh mov sp,bp pop bp ret FPU_Test ENDP
|
7in
|
опубликован 20-01-2002 23:51 MSK
2 rivitna: Пять первых бит счётчика использует уже 80186 |
rivitna
|
опубликован 21-01-2002 00:13 MSK
2 7in: Согласен! Спасибо за поправку!Даже использовал этот факт, чтобы отличать 8086 от 80186. Если что еще заметишь, не стесняйся - не безгрешен. |