Garik66 Опубликовано 9 февраля, 2016 Поделиться Опубликовано 9 февраля, 2016 (изменено) Мне нужно выделить целую часть значения, после деления. fild dword ptr [value] // value - имеет изначально тип integer fdiv [Coeff] // Coeff - имеет тип float fisttp dword ptr [value] // Мне нужно получить целую часть в integer, но СЕ (: не хочет компилировать этот вариант Если кто знает где у меня ошибка, или знает почему СЕ не хочет компилировать это, или знает другой способ получения целой части (не округления, а именно целой части), прошу совета. Изменено 9 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 9 февраля, 2016 Поделиться Опубликовано 9 февраля, 2016 (изменено) С cvttss2si(Converts the lower single-precision, floating-point value of a to a 32-bit integer with truncation) не пробовал? Вот эта команда в большинстве игр используется для округления. Изменено 9 февраля, 2016 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 9 февраля, 2016 Автор Поделиться Опубликовано 9 февраля, 2016 7 минут назад, partoftheworlD сказал: используется для округления. Читай внимательно 53 минуты назад, Garik66 сказал: (не округления, а именно целой части) А для округления просто - fild dword ptr [value] // value - имеет изначально тип integer fdiv [Coeff] // Coeff - имеет тип float fistp dword ptr [value] // тогда получаем округлённую часть. Но мне нужно именно целая часть, а не округление. Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 9 февраля, 2016 Поделиться Опубликовано 9 февраля, 2016 Не правильно написал, вот определение с книжки "CVTTSS2SI приемник, источник F3 0F 2C /r CVTTSS2SI r32, rxmm/m32 Скалярное преобразование (путем отбрасывания дробной части) вещественного целого в знаковое целое" Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 9 февраля, 2016 Автор Поделиться Опубликовано 9 февраля, 2016 (изменено) Я в самом скрипте конечно обошёл округление, используя именно fistp и добавив ещё не много кода, сравнивая полученные значения, ну т.е. получил что хотел. Пример в теме Работа с игровыми таймерами. 4. Скрипт по заданию "Timer Mission v. Sound" Но мне всё равно интересно почему СЕ не хочет компилировать fisttp, хотя про этот опкод везде и всюду пишут. Изменено 10 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 9 февраля, 2016 Поделиться Опубликовано 9 февраля, 2016 (изменено) Возможно, авто-ассемблер не поддерживает sse3, fisttp это же x87 инструкция, fistp хватает для скриптов я так думаю. Изменено 9 февраля, 2016 пользователем partoftheworlD Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 9 февраля, 2016 Автор Поделиться Опубликовано 9 февраля, 2016 (изменено) 4 минуты назад, partoftheworlD сказал: Возможно, авто-ассемблер не поддерживает sse3 fisttp это же x87 инструкция, fistp хватает для скриптов я так думаю. Возможно, если так, то жаль - вместо одной строчки в коде, пришлось добавить ещё 6 строчек. Ну да ладно. Для интересу попробую и cvttss2si, но пока получаю только хрень. Изменено 9 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 9 февраля, 2016 Автор Поделиться Опубликовано 9 февраля, 2016 (изменено) ЗЫ: cvttss2si - возвращает почему-то только 0. хотя целая часть равна 20. Делал так: fild dword ptr [value] fdiv [Coeff] fstp dword ptr [value] // Здесь получаем в [value] дробное значение push ebx cvttsd2si ebx,[value] // в ebx при отладке у меня получается 0. pop ebx Изменено 9 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 10 февраля, 2016 Поделиться Опубликовано 10 февраля, 2016 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 Опубликовано 10 февраля, 2016 Автор Поделиться Опубликовано 10 февраля, 2016 (изменено) MasterGH, сенк! Как я понял - можно использовать только регистр EAX? (Всё-таки пло_хо Гугл переводит не вся инфа в голову сразу лезит с его переводом.) Изменено 10 февраля, 2016 пользователем Garik66 Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 11 февраля, 2016 Поделиться Опубликовано 11 февраля, 2016 тот случай когда: ЗАБЕЙ НА СЕ, ЮЗАЙ FASM lulz какие там значения value/Coeff/out.. вроде можно в 2-3 инстр на sse Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 11 февраля, 2016 Автор Поделиться Опубликовано 11 февраля, 2016 6 часов назад, gmz сказал: тот случай когда: ЗАБЕЙ НА СЕ gmz, если бы прочитал весь топик, то увидел (выше давал ссылку), что решение именно для СЕ я нашёл - используя fistp и добавив ещё 6 строчек в код. Повторю ссылку на сообщение В этом сообщении ниже выложенного скрипта пишу как раз об этом. А почему пока не отхожу от СЕ, хочу по максимум выжать из него, а он на многое способен. Я ещё многие опции не изучал, не говорю ещё про плагины от MasterGH, которые расширяют возможности СЕ. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 11 февраля, 2016 Автор Поделиться Опубликовано 11 февраля, 2016 18 час назад, MasterGH сказал: fisttp инструкция MasterGH, хотя и поставленная мною задача решена, всё-таки пытаюсь разобраться с той статьёй. что из неё понял с помощью Гугла, что из 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) для СЕ. Помоги пожалуйста доразобраться. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 11 февраля, 2016 Поделиться Опубликовано 11 февраля, 2016 Скрытый текст /* Пример округления числа с инструкций 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 11 февраля, 2016 Автор Поделиться Опубликовано 11 февраля, 2016 11 минуту назад, MasterGH сказал: Подставь свои числа по метками MasterGH, спасибо!!! Настолько не нужно было себя утруждать, мне нужна была только запись db DB 08 а то я по дурости вставлял, прямо так db 0DBh,8 и у меня запись не компилировалась. Ещё раз большее спасибо. Сейчас проверю у себя, как работает. И если сработает правильно, то дополню свою статью новым скриптом. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 11 февраля, 2016 Автор Поделиться Опубликовано 11 февраля, 2016 59 минут назад, MasterGH сказал: Подставь свои числа по метками MasterGH, всё проверил - работает. Выложил уже рабочий скрипт в статье. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения