Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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.
Если что еще заметишь, не стесняйся - не безгрешен.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)