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

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


Alex2411

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

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

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

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

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

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.
 

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

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

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

 

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

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

  • 4 месяца спустя...

объясните пожалуйста  как отличаеться команда  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  когда применяеться с регистрами , а не памятью

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

 

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

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

В 15.07.2020 в 18:14, Alex2411 сказал:

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

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

Спойлер

image.thumb.png.a38852fcfa5372c0546def95b3f49e7f.png

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

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

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

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

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