Alex2411 Опубликовано 26 февраля, 2020 Поделиться Опубликовано 26 февраля, 2020 привет. помогите разобраться с регистром хмм . это код игры movaps xmm1,[esp+000000D0] movaps xmm0,[esp+00000140] fld dword ptr [esp+00000080] fsub dword ptr [esp+000000F0] addps xmm0,xmm1 movaps [esp+00000140],xmm0 перед интсрукцией addps xmm0,xmm1 мне надо умножить xmm1 на мое число . вроде надо применить команду mulps , но я пробовал разные способы , но игра все время крашиться . научите как это правильно нужно умножить ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 26 февраля, 2020 Поделиться Опубликовано 26 февраля, 2020 1 час назад, Alex2411 сказал: научите как это правильно нужно умножить ? Думаю так: 1. Поместить твое число в любой свободный регистр movaps xmm....,[твоё число] 2. Умножить mulps xmm1,xmm.... Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 26 февраля, 2020 Автор Поделиться Опубликовано 26 февраля, 2020 (изменено) 30 минут назад, Garik66 сказал: Поместить твое число в любой свободный регистр а сразу из памяти как можно умножить ? инструкция mulps разрешает это делать . я смотрел в игре там есть инструкции типа mulps xmm0, [ebp+10] такая инструкия берет float числа из [ebp+10] [ebp+14] [ebp+18] [ebp+1С] и умножаиет на все части хмм0 . но как сделать то же самое с памятью которую я задал сам ? я пробовал сделать _multX: db 00 00 80 3F 00 00 80 3F 00 00 80 3F 00 00 80 3F 00 00 80 3F а потом умножить mulps xmm1,[_multX] но получил краш . что здесь не так сделано ? upd. игра 32 бит Изменено 26 февраля, 2020 пользователем Alex2411 Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 26 февраля, 2020 Поделиться Опубликовано 26 февраля, 2020 27 минут назад, Alex2411 сказал: что здесь не так сделано ? Попробуй сперва умножить на одно число mulps xmm1,[_multX] Да и где ты _multX объявляешь? Проверь _multX: dd (float)1 Правда не понимаю зачем умножать на 1? Если не будет вылета. то потом можно будет разобраться и с умножением на несколько чисел. Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 26 февраля, 2020 Автор Поделиться Опубликовано 26 февраля, 2020 10 минут назад, Garik66 сказал: Попробуй сперва умножить на одно число mulps xmm1,[_multX] 10 минут назад, Garik66 сказал: Проверь _multX: dd (float)1 я уже так делал. сразу вылет . мне кажеться надо выделить памяти 128 бит , а не dd 32 бит . поэтому я пробовал объявить _multX: db 00 00 80 3F 00 00 80 3F 00 00 80 3F 00 00 80 3F но так то же крашиться . на 1 умножаю для проверки . потом числа поставлю другие . Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 26 февраля, 2020 Поделиться Опубликовано 26 февраля, 2020 1 час назад, Alex2411 сказал: я уже так делал тогда попробуй как я изначально предложил Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 26 февраля, 2020 Автор Поделиться Опубликовано 26 февраля, 2020 33 минуты назад, Garik66 сказал: попробуй как я изначально предложил как сделать через свободный регитр я знаю , но как умножить на числа сразу из памяти которую я выделил ? команда умеет умножить на память , а не понятно как . бывает когда нет свободного регистра или когда не понятно какой свободный. я знаю можно если занят сохранить регистр куда то , а потом обратно записать , но это медленно и лишнее действия. жалко уроков нет про эти регистры .про fpu есть , а про хмм вроде аддмин собирался записать , но так и не записал . самому мне сложно разбираться . простые команды я вроде не много разобрался , а с этими пакетами путаюсь . Ссылка на комментарий Поделиться на другие сайты Поделиться
Hack Опубликовано 27 февраля, 2020 Поделиться Опубликовано 27 февраля, 2020 addps и mulps работают сразу с четырьмя float значениями. alloc(memory, 0x400) label(float_4) memory: //... mulps xmm0,[float_4] //... align 10 CC float_4: dd (float)5.0 dd (float)1.0 dd (float)1.0 dd (float)1.0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 27 февраля, 2020 Автор Поделиться Опубликовано 27 февраля, 2020 6 часов назад, Hack сказал: align 10 CC спасибо . сделал как у тебя тогда все работает . объясни пожалуйста эту строку align 10 CC что она делает ? я первый раз вижу . с ней скрипт работает , а без нее краш . Ссылка на комментарий Поделиться на другие сайты Поделиться
Hack Опубликовано 27 февраля, 2020 Поделиться Опубликовано 27 февраля, 2020 1 час назад, Alex2411 сказал: спасибо . сделал как у тебя тогда все работает . объясни пожалуйста эту строку align 10 CC что она делает ? я первый раз вижу . с ней скрипт работает , а без нее краш . http://konishchevdmitry.blogspot.com/2010/01/blog-post.html Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 27 февраля, 2020 Автор Поделиться Опубликовано 27 февраля, 2020 56 минут назад, Hack сказал: http://konishchevdmitry.blogspot.com/2010/01/blog-post.html слишком сложно я не програмер . Garik66 ты мог бы объяснить для чайника ? ты умеешь я знаю )) как это align применять в скрипте чит енжин ? Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 28 февраля, 2020 Поделиться Опубликовано 28 февраля, 2020 (изменено) Это работа с массивами вообще, тут ps, mulps умножает массив, когда ты пишешь mulps [что то тут], у тебя не 4 байта умножаются, а все 16, потому если тебе надо первое значение (4 байта) из xmm умножить, то просто напиши mulss xmm, [на что умножить, float], и будет всё работать без аллигнов. Вот например: Спойлер code: mulss xmm1,[muller] muller: dd (float)5 А вылетает потому что movaps и тому подобные команды работы с массивами, кроме movups должны быть выравнены по шестнадцетиричным границам, то есть число должно ровно делиться на 4, число адреса из которого берутся значения, иначе будет ошибка и исключение. Изменено 28 февраля, 2020 пользователем imaginary 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 28 февраля, 2020 Автор Поделиться Опубликовано 28 февраля, 2020 3 часа назад, imaginary сказал: число должно ровно делиться на 4, число адреса из которого берутся значения, иначе будет ошибка и исключение. спасибо теперь я понял почему были краши с моим числом , а когда умножение на стек то не было. объясни пожалуйста как правильно применить align в скрипте чит енжин ? в какое место скрипта надо записывать align на что он влияет и еще что значит числа после align 10 CC ? я смотрел в вике по чит енжин про align , но там не чего нет и вообще не понятноhttps://wiki.cheatengine.org/index.php?title=Auto_Assembler:align про mulss я знаю , но мне надо умножить 4 числа в хмм . в xmm1 там коордиинаты надо умножить каждое число . Ссылка на комментарий Поделиться на другие сайты Поделиться
Hack Опубликовано 28 февраля, 2020 Поделиться Опубликовано 28 февраля, 2020 1 час назад, Alex2411 сказал: спасибо теперь я понял почему были краши с моим числом , а когда умножение на стек то не было. объясни пожалуйста как правильно применить align в скрипте чит енжин ? в какое место скрипта надо записывать align на что он влияет и еще что значит числа после align 10 CC ? я смотрел в вике по чит енжин про align , но там не чего нет и вообще не понятноhttps://wiki.cheatengine.org/index.php?title=Auto_Assembler:align про mulss я знаю , но мне надо умножить 4 числа в хмм . в xmm1 там коордиинаты надо умножить каждое число . align ставится перед меткой с данными, которые нужно выровнить. 10 = 16 байт CC этим значением заполняет пустоту. Можно поставить любое значение, на работу это не повлияет. xmm 128bit 16byte = 4 младших бита адреса - должны быть в 0. ymm 256bit 32byte = 5 младших бита адреса - должны быть в 0. zmm 512bit 64byte = 6 младших бита адреса - должны быть в 0. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 28 февраля, 2020 Автор Поделиться Опубликовано 28 февраля, 2020 19 минут назад, Hack сказал: align ставится перед меткой с данными, которые нужно выровнить. 10 = 16 байт получаеться если адрес должен делиться на 4 значит можно было поставить align 4 ? или обязательно надо ставить align 10 потому что метка целиком занимает 16 байт ? как понять ? 20 минут назад, Hack сказал: CC этим значением заполняет пустоту. не совсем понял какую пустоту . если я сделаю align 8 CC metka: dd (float)1 то память получиться 00 00 80 3F CC CC CC CC ? а если я напишу align 8 CC metka: dq (double)1 то CC вообще получаеться не где не будет ? или я не так понял ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Hack Опубликовано 29 февраля, 2020 Поделиться Опубликовано 29 февраля, 2020 16 часов назад, Alex2411 сказал: align 8 CC metka: dd (float)1 то память получиться 00 00 80 3F CC CC CC CC ? как ты так мог получить? 16 часов назад, Alex2411 сказал: получаеться если адрес должен делиться на 4 значит можно было поставить align 4 ? или обязательно надо ставить align 10 потому что метка целиком занимает 16 байт ? как понять ? Зависит от инструкции. Есть инструкции работающие с 1,2,4,8,16,32,64 блок данных. Некоторые инструкции требуют выравнивание, по их размеру. Ссылка на комментарий Поделиться на другие сайты Поделиться
imaginary Опубликовано 29 февраля, 2020 Поделиться Опубликовано 29 февраля, 2020 (изменено) 16 часов назад, Alex2411 сказал: получаеться если адрес должен делиться на 4 значит можно было поставить align 4 ? или обязательно надо ставить align 10 потому что метка целиком занимает 16 байт ? как понять ? Зависит от кода до метки, если не хочешь выравнивать ничего, то занеси массив умножаемый в другой xmm, например: movups xmm2,[metka] или если у тебя все заняты xmm, то сохрани сначала из xmm какого то, например: Спойлер movups [metka],xmm2 //Сохранение movups xmm2,[muller] mulps xmm1,xmm2 //умножение movups xmm2,[metka] //Восстановление metka: //место сохранения dq 0 0 muller: //твой множитель dd (float)2 (float)5 (float)3 (float)2 или считай байты в инструкциях, и добавляй allign сколько не хватает до нужного адреса, но тогда при изменении скрипта его нужно будет менять, если размер изменился. А ещё есть вариант, выделить память отдельную для твоего множителя, тогда всё будет всегда выравнено: Спойлер alloc(code,200) //то что уже у тебя подставлено в скрипте alloc(muller,200) //любое число, выделится всё рано страница code: mulps xmm0,[muller] jmp returnhere // muller: dd (float)2 (float)4 (float)3 (float)5 Изменено 29 февраля, 2020 пользователем imaginary 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 29 февраля, 2020 Автор Поделиться Опубликовано 29 февраля, 2020 спасибо за объяснения . теперь вроде бы понял . пысы. я стараюсь разобраться как работает что бы понимать что для чего я пишу в своем скрипте , а не просто копировать в скрипт что мне подсказали . и что бы в друго раз уже не спрашивать .))) Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 15 июля, 2020 Автор Поделиться Опубликовано 15 июля, 2020 объясните пожалуйста как отличаеться команда movaps и movups когда применяеться с регистрами , а не памятью . чем отличаеться инструкция movaps xmm1,xmm2 от инструкции movups xmm1,xmm2 ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Hack Опубликовано 15 июля, 2020 Поделиться Опубликовано 15 июля, 2020 37 минут назад, Alex2411 сказал: объясните пожалуйста как отличаеться команда movaps и movups когда применяеться с регистрами , а не памятью . чем отличаеться инструкция movaps xmm1,xmm2 от инструкции movups xmm1,xmm2 ? ничем Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 июля, 2020 Поделиться Опубликовано 16 июля, 2020 15 часов назад, Alex2411 сказал: как отличаеться команда movaps и movups 1) movaps приёмник, источник – переслать выравненные упакованные числа. Копирует 128 бит из источника в приёмник. Каждый из аргументов может быть регистром SSE, или 128-битной переменной. Например: movaps XMM1, XMM2; или movaps XMM1, y, где y – переменная. Если адрес переменной некратен 16 байтам, программа вылетает. Предупреждение: во всех командах расширения SSE, кроме movups 16-байтные операнды из памяти должны быть выровнены по 16-байтным границам! 2) movups приёмник, источник – переслать невыравненные упакованные числа. Отличие в том, что если адрес некратен 16 байтам, команда выполняется нормально. Если можно достичь выравнивания, то лучше пользоваться командой movaps, так как она быстрее Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 июля, 2020 Поделиться Опубликовано 16 июля, 2020 PS: Кстати тебе уже отвечали на этот же вопрос выше: В 28.02.2020 в 12:27, imaginary сказал: А вылетает потому что movaps и тому подобные команды работы с массивами, кроме movups должны быть выравнены по шестнадцетиричным границам, то есть число должно ровно делиться на 4, число адреса из которого берутся значения, иначе будет ошибка и исключение. Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex2411 Опубликовано 16 июля, 2020 Автор Поделиться Опубликовано 16 июля, 2020 6 часов назад, Garik66 сказал: Кстати тебе уже отвечали на этот же вопрос выше не отвечали . ты не внимательно прочитал вопрос . я спросил не чем отличаються две эти команды , а 22 часа назад, Alex2411 сказал: как отличаеться команда movaps и movups когда применяеться с регистрами , а не памятью про выравнивание адресов памяти я знаю , а как влияет когда два регистра я не знал . откуда ты процитировал про команды этот сайт я уже давно скачал целиком весь и применяю когда нужно узнать справку про команды ассемблера )))) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 июля, 2020 Поделиться Опубликовано 16 июля, 2020 2 минуты назад, Alex2411 сказал: не отвечали . Как это не отвечали? Просто ответ дали раньше поставленного тобой вопроса :))) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 16 июля, 2020 Поделиться Опубликовано 16 июля, 2020 В 15.07.2020 в 18:14, Alex2411 сказал: как отличаеться команда movaps и movups когда применяеться с регистрами , а не памятью . Как с памятью - так и срегистрами - теже отличия: Спойлер // Ответ не правильный: при применении к регистрам - отличий нет, отчет см. далее Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения