На нашем форуме вы можете получить приватный чит для игры Euro Truck Simulator 2. Подробности по ссылке ниже:
Тема с читом на Euro Truck Simulator 2
Alex2411

действия с регистром xmm

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

привет.  помогите разобраться с регистром хмм .
это код игры

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 , но я пробовал  разные способы , но игра все время крашиться . научите как это  правильно нужно умножить ?

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


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

научите как это  правильно нужно умножить ?

Думаю так:

1. Поместить твое число в любой свободный регистр 
movaps xmm....,[твоё число]
2. Умножить

mulps xmm1,xmm....

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


Ссылка на сообщение
Поделиться на другие сайты
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 бит

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

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


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

что здесь не так сделано ?

Попробуй сперва умножить на одно число


mulps xmm1,[_multX]

 

Да и где ты _multX объявляешь? Проверь

_multX:
 dd (float)1
Правда не понимаю зачем умножать на 1?
 

Если не будет вылета. то потом можно будет разобраться и с умножением на несколько чисел.

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


Ссылка на сообщение
Поделиться на другие сайты
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 умножаю для проверки . потом числа поставлю другие .

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


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

я уже так делал

тогда попробуй как я изначально предложил

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


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

попробуй как я изначально предложил

 

 

как сделать через  свободный регитр я знаю ,  но как умножить на числа  сразу  из памяти  которую я выделил ? команда  умеет умножить  на память , а не понятно как . бывает когда нет свободного  регистра  или когда  не понятно какой свободный. я знаю можно если занят  сохранить регистр куда то , а потом обратно записать , но это  медленно и лишнее действия.

 

 жалко уроков нет  про эти регистры .про fpu  есть , а про хмм  вроде  аддмин собирался записать , но так и не записал . самому  мне сложно  разбираться . простые команды  я вроде не много  разобрался  , а с этими   пакетами  путаюсь .

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


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

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

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


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

align 10 CC

 

 

спасибо . сделал как у тебя  тогда все работает .
объясни пожалуйста эту строку

align 10 CC

что она делает ? я первый раз вижу . с ней скрипт  работает , а без нее краш .

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


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

 

1 час назад, Alex2411 сказал:

 

 

спасибо . сделал как у тебя  тогда все работает .
объясни пожалуйста эту строку


align 10 CC

что она делает ? я первый раз вижу . с ней скрипт  работает , а без нее краш .

http://konishchevdmitry.blogspot.com/2010/01/blog-post.html

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


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

http://konishchevdmitry.blogspot.com/2010/01/blog-post.html

 

слишком  сложно я не програмер .

 

Garik66  ты мог бы  объяснить  для чайника ? ты умеешь  я знаю )) как это  align применять  в скрипте чит енжин ?

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


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

Это работа с массивами вообще, тут ps, mulps умножает массив, когда ты пишешь mulps [что то тут], у тебя не 4 байта умножаются, а все 16, потому если тебе надо первое значение (4 байта) из xmm умножить, то просто напиши mulss xmm, [на что умножить, float], и будет всё работать без аллигнов.

Вот например:

Спойлер

code:
mulss xmm1,[muller]

muller:
dd (float)5

 


А вылетает потому что movaps и тому подобные команды работы с массивами, кроме movups должны быть выравнены по шестнадцетиричным границам, то есть число должно ровно делиться на 4, число адреса из которого берутся значения, иначе будет ошибка и исключение.

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

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


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

число должно ровно делиться на 4, число адреса из которого берутся значения, иначе будет ошибка и исключение.

 

 

спасибо  теперь  я понял  почему были краши с моим числом , а когда умножение  на стек  то не было.
 объясни пожалуйста  как правильно применить align в скрипте чит енжин ? в какое место скрипта  надо записывать align  на что он влияет и еще  что значит числа после align 10 CC ? я смотрел в вике по чит енжин про align , но там не чего нет и вообще не понятно
https://wiki.cheatengine.org/index.php?title=Auto_Assembler:align

 

про  mulss я знаю , но мне надо  умножить 4 числа в хмм . в xmm1 там коордиинаты  надо умножить каждое число .

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


Ссылка на сообщение
Поделиться на другие сайты
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.
 

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


Ссылка на сообщение
Поделиться на другие сайты
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 вообще получаеться не где не будет ? или я не так понял ?

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


Ссылка на сообщение
Поделиться на другие сайты
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 блок данных. Некоторые инструкции требуют выравнивание, по их размеру.

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


Ссылка на сообщение
Поделиться на другие сайты
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

 

 

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

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


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

спасибо за объяснения . теперь  вроде бы понял .

 

пысы. я стараюсь разобраться  как работает  что бы  понимать что для чего  я пишу в своем скрипте , а не  просто копировать  в скрипт  что мне подсказали . и что бы  в друго раз уже не спрашивать .)))

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


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

объясните пожалуйста  как отличаеться команда  movaps и movups  когда применяеться с регистрами , а не памятью .

чем отличаеться инструкция
movaps xmm1,xmm2
от инструкции
movups xmm1,xmm2
?

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


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

объясните пожалуйста  как отличаеться команда  movaps и movups  когда применяеться с регистрами , а не памятью .

чем отличаеться инструкция
movaps xmm1,xmm2
от инструкции
movups xmm1,xmm2
?

ничем

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


Ссылка на сообщение
Поделиться на другие сайты
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, так как она быстрее

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


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

PS: Кстати тебе уже отвечали на этот же вопрос выше:

В 28.02.2020 в 12:27, imaginary сказал:

А вылетает потому что movaps и тому подобные команды работы с массивами, кроме movups должны быть выравнены по шестнадцетиричным границам, то есть число должно ровно делиться на 4, число адреса из которого берутся значения, иначе будет ошибка и исключение.

 

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


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

Кстати тебе уже отвечали на этот же вопрос выше

 

 

не отвечали . ты не внимательно  прочитал вопрос . я спросил  не чем отличаються  две эти команды , а

22 часа назад, Alex2411 сказал:

как отличаеться команда  movaps и movups  когда применяеться с регистрами , а не памятью

про выравнивание адресов  памяти я знаю , а как  влияет  когда два регистра  я не знал .

 

откуда ты процитировал про команды  этот сайт я уже  давно скачал  целиком весь  и применяю когда нужно узнать  справку про команды ассемблера ))))

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


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

не отвечали .

Как это не отвечали? 
Просто ответ дали раньше поставленного тобой вопроса :)))

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


Ссылка на сообщение
Поделиться на другие сайты
В 15.07.2020 в 18:14, Alex2411 сказал:

как отличаеться команда  movaps и movups  когда применяеться с регистрами , а не памятью .

Как с памятью - так и срегистрами - теже отличия:
 

Спойлер

image.thumb.png.a38852fcfa5372c0546def95b3f49e7f.png

// Ответ не правильный: при применении к регистрам - отличий нет, отчет см. далее 

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


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

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 эмодзи.

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

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

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

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