Перейти к содержанию
Garik66

Ассемблер СЕ - как быстрее integer перевести во float?

Рекомендуемые сообщения

Собственно вопрос в названии темы.

1. Могу я допустим записать просто так:

i: dd 0mov i, dword ptr [eax+08] // Допустим в [eax+08] лежит integer значениеmov [eax+04],(float)i     // А в [eax+04] нужно записать это значение во float.

2. Если нет, то как правильно?

3. Если да, то могу ли я использовать вместо i регистр? Допустим так: 

push ebxmov ebx, dword ptr [eax+08] // Допустим в [eax+08] лежит integer значениеmov [eax+04],(float)ebx     // А в [eax+04] нужно записать это значение во float.pop ebx

4. Если да, то может есть всё-таки короче запись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Привет! Если я не ошибаюсь, то:
fild [eax+8] ; Грузим значение в ST(0), конвертируя его во floatfistp [eax+4] ; Выгружаем из ST(0), конвертируя в int, выталкивая заодно это значение из FPU-стэка

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

keng, Большой СЕНК!!!

Т.е. для моего случая, который я описал нужно будет сделать так:

fild [eax+08] // Допустим в [eax+08] лежит integer значение, переводим его во floatfstp [eax+04] // А в [eax+04] нужно записать это значение во float. Просто выгружаем без изменений. 

Правильно?

Изменено пользователем garik66

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я проснулся 5 минут назад, так что не соображаю толком. Проверь в отладчике. Штука в том, что CPU не обучен работать с дробными числами - для этой задачи есть FPU, маленький "процессор" с отдельным "стеком". И набор f-инструкций под это дело. CPU оперирует типом integer, FPU - float. Для взаимодействия есть несколько инструкций. Подробнее можно почитать [тут].

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще есть решение без использования FPU-стэка, почитать можно [тут]. Автор - Mikl___.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ой, да, я тупой. Сначала делаем fild, чтобы загрузить int в ST(0), а затем fstp, чтобы выгрузить float и вытолкнуть его из ST(0).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ой, да, я тупой.

:-D Не тупой, а спросонья.

keng, ещё раз спасибо. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

keng, отлично всё сработало, переделал скрипты, сделал более правильными.

Если кому интересно, то скрипт здесь.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на sse так:

cvtsi2ss xmm0,dword[eax+8]
movss dword[eax+4],xmm0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

gmz, а чем твоя запись:

cvtsi2ss xmm0,dword[eax+8]movss dword[eax+4],xmm0 

короче этой:

fild [eax+08]fstp [eax+04] 

или она быстрее?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

gmz, а чем твоя запись:

cvtsi2ss xmm0,dword[eax+8]movss dword[eax+4],xmm0 

короче этой:

fild [eax+08]fstp [eax+04] 

или она быстрее?

Прочитай - http://stackoverflow.com/questions/8847429/sse-slower-than-fpu

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Прочитай

К сожалению с английским плохо, но что понял через Гугл-переводчик - эта запись:

fild [eax+08]fstp [eax+04] 

быстрее, чем эта:

cvtsi2ss xmm0,dword[eax+8]movss dword[eax+4],xmm0 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На самом деле, я слабо верю, что в скрипте СЕ разница будет сколько-нибудь заметна. То есть если некоторый код занимается только расчетом чисел с плавающей точкой (сотни миллионов раз) - тогда да, но и то обычно компилятор умнее человека и лучше может решить, какой набор инструкций нужно использовать. Если же (в редких случаях) компилятор ошибается - тогда да, ассемблер в руки и вперед, оптимизировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как то писал float rand генератор на fpu и sse. sse был почти в 2 раза быстрее fpu (примерный замер через rdtsc)

в даном случае наверно все равно так как слишком мало действий

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 30.03.2015 в 17:34, Garik66 сказал:

Если кому интересно, то скрипт здесь.  

Где?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Серьезно? Теме 5 лет! Форум два раза менял дислокацию и естесно что-то могло похериться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 30.03.2015 в 17:34, Garik66 сказал:

здесь.  

в этом месте нет ссылки

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, Pitronic сказал:

в этом месте нет ссылки

 

В 10.09.2020 в 09:12, Kvazimado сказал:

Форум два раза менял дислокацию и естесно что-то могло похериться.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, Garik66 сказал:

что-то могло похериться.

Тогда может вспомните что вы там предлагали? Мне интересно!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
20 минут назад, Pitronic сказал:

Тогда может вспомните что вы там предлагали? Мне интересно!

я не помню. что было сегодня. а ты - 5,5 лет назад :(((( (склероз однако)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Предпросмотр

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.