Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Assembler > И ещё один |
Автор: MishaZ 20.01.02, 11:13 |
Работает ли SHL с ячеёками памяти ??? |
Автор: rivitna 20.01.02, 11:19 |
Естественно |
Автор: rivitna 20.01.02, 11:47 |
Я тут ознакомился для чего тебе этого: http://www.sources.ru/NonCGI/Forum9/HTML/000124.html Это сильно! )))))) Процессоры i486 и выше при операциях сдвига (sal, shl, rol и т.д.) используют только первые пять бит счетчика (то есть до 31). Так, как ты делаешь, тебе как минимум нужны 128 разрядные регистры или операнды, чтоб битик, который ты двигаешь, остался в пределах видимости )) Так что и здесь лучше использовать команды сопроцессора f2xm1 (2^x - 1) |
Автор: MishaZ 20.01.02, 12:30 |
Ну совсем ваыручиллл =) |
Автор: MishaZ 20.01.02, 12:30 |
Ну совсем ваыручиллл =) |
Автор: rivitna 20.01.02, 12:55 |
Не торопись, я не до конца объяснил. 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.02, 14:00 |
Мало того, что с кодом облажался 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.02, 14:02 |
Брьььь а все ли процессоры у которых математический сопроцессор есть енто поддерживают ? |
Автор: NOPIK 20.01.02, 17:05 |
Операции у всех практически одинаковые (это стандарт IEE), но состав операндов и мнемоника могут различаться |
Автор: rivitna 20.01.02, 17:55 |
Если хочешь, чтоб совсем было хорошо (хотя сейчас это дело ненужное) и если ты эстет, проверь наличие сопроцессора. Наиболее корректный и простой способ: 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.02, 18:14 |
Поторопился отослать, потом обратил внимание, что адресацию сделал через 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 |
Автор: Jin X 20.01.02, 20:51 |
2 rivitna: Пять первых бит счётчика использует уже 80186 |
Автор: rivitna 20.01.02, 21:13 |
2 7in: Согласен! Спасибо за поправку! Даже использовал этот факт, чтобы отличать 8086 от 80186. Если что еще заметишь, не стесняйся - не безгрешен. |