169 похожих чатов

Есть ли какой-то простой способ загрузить в FPU число 0xFFFFFFFFFFFFFFFF

?
Проблема в том что это UINT64, а FILD интерпретирует числа как INT64, и в st0 получается число "-1".

47 ответов

51 просмотр

Так загружай через fld.

Вообще, для такого уже лучше SSE.

Евгений- Автор вопроса
КТ315
Вообще, для такого уже лучше SSE.

Не понял суть идеи. Как SSE тут поможет работать с 64-битными числами в FPU? Мне надо умножать целые 64-битные числа, и ошибки переполнения (если будут) обнаруживать. В SSE вроде ничего для этого нет.

Евгений- Автор вопроса
КТ315
SSE умеет работать с FPU.

Ну вот есть в памяти dq-число (0xFFFFFFFFFFFFFFFF). Как при помощи SSE его положить в регистры FPU? Не нашёл подходящих команд. Через MMX - MOVQ - получается в FPU не число а qnan-значение.

Евгений
Ну вот есть в памяти dq-число (0xFFFFFFFFFFFFFFFF)...

Причём тут FPU? Забудь про него, через SSE всё делай.

Евгений- Автор вопроса

Мне надо умножение 64-битного числа. В SSE, насколько я понимаю, такой возможности нет (там предполагают только умножение за 4 захода, перемножать по 32 бита).

fldz fld1 fsubp st0,st1

а вообще смотри пределы fpu по числам. какое б целое ты не загрузил оно в дальнейшем переводится в 80bit. входит ли твое число, которое фпу может в себе хранить?

a dt $7FFF+63:$FFFFFFFFFFFFFFFF; fld [a]

Я вообще не пойму, кто так числа записывает? Почему нельзя было написать "1.0"? a dt 1.0 fld tword[a]

Евгений- Автор вопроса
The Bird of Hermes
fld1 fchs

FPU вроде бы не понимает такого способа, там просто -1 получается, и это не равно 0xFFFFFFFFFFFFFFFF.

Евгений
FPU вроде бы не понимает такого способа, там прост...

Если тебе нужно тупо загрузить туда 0xFFFFFFFFFFFFFFFF, т.е. без преобразования из целого числа в дробное, то так и загружай

КТ315
Я вообще не пойму, кто так числа записывает? Почем...

А, это не 1.0. Запутался из-за сообщений выше. Это 6. Но всё равно можно просто сделать dq 0xFFFFFFFFFFFFFFFF И так и загрузить. В чём проблема вообще...

Евгений- Автор вопроса
КТ315
А, это не 1.0. Запутался из-за сообщений выше. Это...

fild dq - грузит только как int, а надо uint. fld dq - qnan fld dt - не позволяет написать 0xFFFFFFFFFFFFFFFF, надо неочевидное десятичное число писать (18446744073709551615.0).

Евгений
fild dq - грузит только как int, а надо uint. fld ...

У меня всё позволяет. Ты на каком компиляторе пишешь?

Евгений- Автор вопроса
КТ315
screenshot У меня всё позволяет. Ты на каком компиляторе пише...

fasm. Для dt - только десятичные числа с точкой, hex-числа не хочет...

Евгений
fasm. Для dt - только десятичные числа с точкой, ...

Вот тебе фокус-покус: val: db 0xFF, 0xFF, 0xFF,\ 0xFF, 0xFF, 0xFF, 0xFF,\ 0xFF, 0, 0 start: fld tword[val]

КТ315
6.724206286224187012e-4932

вот, а ему надо максимальное беззнаковое 64 битное

КТ315
Не, ему надо как раз 0xFFFFFFFFFFFFFFFF

это исходное целое число максимальное беззнаковое 64 битное

Aiwan \ (•◡•) / _bot
это исходное целое число максимальное беззнаковое ...

Ничего не понял. Человеку надо в st0 чтобы было 0xFFFFFFFFFFFFFFFF. Как оно будет в десятичном, двоичном и других - без разницы. Число одно и то же.

Стикер

Стикер

КТ315
6.724206286224187012e-4932

это не соответствует максимальному uint64

Aiwan \ (•◡•) / _bot
это не соответствует максимальному uint64

А причём тут максимальный UINT64? Вопрос был о том, чтобы загрузить конкретное значение. Как его интерпретировал в плавающей точке x64dbg - дело вообще левое.

дальше читай, со слово "проблема"

Aiwan \ (•◡•) / _bot
это не соответствует максимальному uint64

"Проблема в том, что это UINT64, а fild загружает его как -1". Вот я и показал, как его можно загрузить не как -1, а как конкретное значение - 0xFFFFFFFFFFFFFFFF.

Евгений- Автор вопроса
КТ315
Вот тебе фокус-покус: val: db 0xFF, 0xFF, 0xFF,...

В итоге там в FPU получается какое-то специальное значение, не равное 18446744073709551615, и алгоритм рушится...

КТ315
"Проблема в том, что это UINT64, а fild загружает ...

0xFFFFFFFFFFFFFFFF - переведи в десятичку и посмотри является ли это max uint64? вот эту десятичку ему и надо загрузить, но представил он ее в хексе

Aiwan \ (•◡•) / _bot
screenshot

Но не в представлении FPU.

Евгений
Мне надо умножение 64-битного числа. В SSE, наскол...

А чем mul плох? Целые числа. 64 бита. Ответ в два регистра.

The Bird of Hermes
mulsd вроде умножает только одно число

Тоже хочу перемножить пару чисел целых. На c++ перемножение двух 256 битных чисел занимает удивительных 400 тактов классическим математическим методом. На одном из Компов есть sse2

🦝 Katowski Kotovsky
Попробуй с библиотекой GMP

Habr пишет 30000 тактов на умножение в gmp. Мои 400 тактов лучше.

Septim
Habr пишет 30000 тактов на умножение в gmp. Мои 40...

Не верю. Слишком большая разница.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта