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

СЕ не хочет компилировать fisttp dword ptr [value]


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

Мне нужно выделить целую часть значения, после деления.

fild dword ptr [value]   // value - имеет изначально тип integer
fdiv [Coeff]             // Coeff - имеет тип float
fisttp dword ptr [value] // Мне нужно получить целую часть в integer, но СЕ (: не хочет компилировать этот вариант

Если кто знает где у меня ошибка, или знает почему СЕ не хочет компилировать это, или знает другой способ получения целой части (не округления, а именно целой части), прошу совета.

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

С cvttss2si(Converts the lower single-precision, floating-point value of a to a 32-bit integer with truncation) не пробовал? Вот эта команда в большинстве игр используется для округления. 

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, partoftheworlD сказал:

используется для округления.

Читай внимательно

53 минуты назад, Garik66 сказал:

(не округления, а именно целой части)

А для округления просто - 

fild dword ptr [value]   // value - имеет изначально тип integer
fdiv [Coeff]             // Coeff - имеет тип float
fistp dword ptr [value]  // тогда получаем округлённую часть.

Но мне нужно именно целая часть, а не округление.

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

Не правильно написал, вот определение с книжки "CVTTSS2SI приемник, источник F3 0F 2C /r CVTTSS2SI r32, rxmm/m32 Скалярное преобразование (путем отбрасывания дробной части) вещественного целого в знаковое целое"

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

Я в самом скрипте конечно обошёл округление, используя именно fistp и добавив ещё не много кода, сравнивая полученные значения, ну т.е. получил что хотел. Пример в теме  4. Скрипт по заданию "Timer Mission v. Sound"

Но мне всё равно интересно почему СЕ не хочет компилировать fisttp, хотя про этот опкод везде и всюду пишут.

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

Возможно, авто-ассемблер не поддерживает sse3,  fisttp это же x87 инструкция, fistp хватает для скриптов я так думаю.

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, partoftheworlD сказал:

Возможно, авто-ассемблер не поддерживает sse3  fisttp это же x87 инструкция, fistp хватает для скриптов я так думаю.

Возможно, если так, то жаль - вместо одной строчки в коде, пришлось добавить ещё 6 строчек. Ну да ладно.

Для интересу попробую и cvttss2si, но пока получаю только хрень.

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

ЗЫ:  cvttss2si  - возвращает почему-то только 0. хотя целая часть равна 20.

Делал так:

fild dword ptr [value]
fdiv [Coeff]
fstp dword ptr [value] // Здесь получаем в [value] дробное значение 
push ebx
cvttsd2si ebx,[value]  // в ebx при отладке у меня получается 0.
pop ebx

 

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

fisttp инструкция была добавлена позже других из x86. Многие ассемблеры и дизассемблеры не могут её понять. Тем не менее процессор знает её )) Поэтому можешь попробовать вписывая опкоды.
 


Опкоды

Encoding      Description
 DF 08     Store as a truncated WORD
 DB 08     Store as a truncated DWORD
 DD 08     Store as a truncated QWORD

 

Пример

Examples of using the hand-coding to store the value of ST(0) as a truncated DWORD could be as follows, assuming that int_var would be used as a DWORD integer variable (or [edi+ecx*4] is pointing into an integer DWORD array):


   lea   eax,int_var
   db    0DBh,8

or

   lea   eax,[edi+ecx*4]
   dw    8DBh


Источник

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Изменено пользователем Garik66
Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, gmz сказал:

тот случай когда: ЗАБЕЙ НА СЕ

Повторю ссылку на сообщение 

В этом сообщении ниже выложенного скрипта пишу как раз об этом.

А почему пока не отхожу от СЕ, хочу по максимум выжать из него, а он на многое способен. Я ещё многие опции не изучал, не говорю ещё про плагины от MasterGH, которые расширяют возможности СЕ.

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

18 час назад, MasterGH сказал:

fisttp инструкция

что из неё понял с помощью Гугла, что из st(0), в котором лежит вещественное число, можно получить в какой-нибудь адрес, передав в EAX (здесь не уверен, только ли EAX можно использовать или другие регистры) этот адрес с помощью инструкции - db    0DBh,8.

Попытался сделать этот финт у себя с помощью СЕ.

 

fild dword ptr [value]   // value - имеет изначально тип integer
fdiv [Coeff]             // Coeff - имеет тип float

Получили в st(0) дробное число.

Далее загружаю в EAX адрес, куда я хочу закинуть целую часть дробного числа.

 lea   eax,[Value]

А дальше у меня затык, не знаю как записать инструкцию  (db    0DBh,8) для СЕ.

Помоги пожалуйста доразобраться.

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


 

Скрытый текст

/*
  Пример округления числа с инструкций fisttp
  20/6 = 3.33333
  После округления получить 3

  // Добавить код как АА и смотреть в табличку на answer
  // Меняем адреса и снова активируем или деактивируем скрипт
*/

globalalloc(globalMem, $1000) // создаем для того чтобы много раз ассемблероивать без повтороно выделения памяти

label(value)
label(coeff)
label(answer)

label(code)

registersymbol(value)
registersymbol(coeff)
registersymbol(answer)

createthread(code)

globalMem:
  // Метки
  value:
        dd (int)20
  coeff:
        dd (float)6.0
  answer:
       dd 0
code:

  fild [value]      // грузим целое 20 в ST0
  fdiv [coeff]      // ST0 = ST0 / 6.0 = 20 / 6.0 = 3.3333333
  lea  eax,[answer]  // в eax кладем адрес
  db DB 08          // fisttp [eax] -> теперь в answer лежит "3"
  ret


// Чуть-чуть побалуемся c LUA
// Добавляем записи в таблицу с регистрационными метками
{$LUA}
if(not once) then
  once = true
  local addressList = getAddressList()

  local mr_value = addressList.createMemoryRecord()
  mr_value.Description = 'value'
  mr_value.Address = 'value'

  local mr_coeff = addressList.createMemoryRecord()
  mr_coeff.Description = 'coeff'
  mr_coeff.Address = 'coeff'
  mr_coeff.Type = vtSingle

  local mr_answer = addressList.createMemoryRecord()
  mr_answer.Description = 'answer'
  mr_answer.Address = 'answer'
end

[Enable]
[Disable]


 


Подставь свои числа по метками, чтобы подсчитать что-то другое. Но только не в таблице CE, а в скрипте. В таблице перезаписывает на дефолтные указанные в скрипте.

Также под отладкой можешь пройтись и посмотреть







 

  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

11 минуту назад, MasterGH сказал:

Подставь свои числа по метками

спасибо!!! Настолько не нужно было себя утруждать, мне нужна была только запись 

db DB 08 

а то я по дурости вставлял, прямо так

db    0DBh,8

и у меня запись не компилировалась.

Ещё раз большее спасибо. Сейчас проверю у себя, как работает. И если сработает правильно, то дополню свою статью новым скриптом. 

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

59 минут назад, MasterGH сказал:

Подставь свои числа по метками

всё проверил - работает. Выложил уже рабочий скрипт в статье. 

 

 

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

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

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

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