Сейчас на форуме: igorcauret, Rio (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Как передать в movss число?
Посл.ответ Сообщение

Ранг: 10.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 18 сентября 2014 20:10
· Личное сообщение · #1

Имеется код

Code:
  1. .text:00833F8D                 xorps   xmm0, xmm0
  2. .text:00833F90                 fmul    ds:dbl_98F970
  3. .text:00833F96                 mov     eax, [esp+84h+arg_0]
  4. .text:00833F9D                 movss   [esp+84h+var_5C], xmm0
  5. .text:00833FA3                 movss   [esp+84h+var_58], xmm0
  6. .text:00833FA9                 movss   [esp+84h+var_54], xmm0


Который в писевдокоде иды соответствует

Code:
  1. v17 = 0;
  2. v18 = 0;
  3. v19 = 0;


Но в старом исходнике этой программы более ранней версии эти 0 являются типом float

Code:
  1. float Pos_X = 0.0f;
  2. float Pos_Y = 0.0f;
  3. float Pos_Z = 0.0f;


Вопрос - как в

Code:
  1. .text:00833FA3                 movss   [esp+84h+var_58], xmm0


записать 16 байтный float, но не 0, а новое значение? к пример 16.0f

Изначально я подозреваю есть 2 самых простых варианта:

1. непосредственно в той же строке заменить xmm0 на новое значение

вопрос: как? указание использовать регистр xmm0 ведь занимает меньше 16 байт

2. на месте movss разместить jmp в конец экзешника где есть пустое место, там засунуть в [esp+84h+var_58] нужное значение и вернуться обратно на следующую команду идущей за замененной

вопрос: не понимаю как в принципе с помощью movss это сделать, в интернете не могу найти описание movss, есть movs и прочие четырех символьные, а вот про movss непосредственно есть лишь небольшая статья на единственном сайте и там даже нет примера с ассемблером http://www.club155.ru/x86cmdsimd/MOVSS




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 18 сентября 2014 21:08
· Личное сообщение · #2

Берёшь открываешь ман интела (2 том)/амд (4 том) и читаешь про movss. Им же можно в xmm загрузить из памяти. Либо просто впиши дворд в нужную память.




Ранг: 164.6 (ветеран), 65thx
Активность: 0.120
Статус: Участник
Волшебник

Создано: 18 сентября 2014 23:26
· Личное сообщение · #3

Как-то так:
Code:
  1.     .data
  2. x1      dd  1.0
  3. y1      dd  2.0
  4. z1      dd  3.0
  5.  
  6.     .data?
  7. x2      dd  ?
  8. y2      dd  ?
  9. z2      dd  ?
  10.  
  11.     .code
  12. start:
  13.         movss XMM0, x1
  14.         movss XMM1, y1
  15.         movss XMM2, z1
  16.  
  17.         movss x2, XMM0
  18.         movss y2, XMM1
  19.         movss z2, XMM2
  20. end start


-----
Следуй за белым кроликом




Ранг: 10.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 19 сентября 2014 03:30
· Личное сообщение · #4

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



Ранг: 2.3 (гость)
Активность: 0=0
Статус: Участник

Создано: 19 сентября 2014 08:30
· Личное сообщение · #5

Это чистейший ассемблерный код, исполнить его поможет любой компилятор, будь то MASM, FASM, NASM. Тебе уже сказали, где искать информацию, читай маны, друг мой



Ранг: 53.9 (постоянный), 33thx
Активность: 0.050
Статус: Участник

Создано: 19 сентября 2014 11:37
· Личное сообщение · #6

Набросал вам пример, компилируйте в --> FASM<--.
Code:
  1. format PE console 4.0
  2. include 'win32ax.inc'
  3. entry start
  4. section 'data' data readable writeable
  5. resultStr db  'Result:'  ,0
  6. fmt db '%s %f',0
  7. result dq 0.0
  8. align 16
  9. fl dd 16.0
  10. tf dd 3.33
  11. section 'code' code executable readable
  12. start:
  13. movss xmm1,[fl]
  14. movss xmm2,[tf]
  15. addss xmm1,xmm2
  16. cvtss2sd xmm1,xmm1
  17. movsd [result],xmm1
  18. cinvoke printf, fmt, resultStr, dword [result], dword [result+4]
  19. cinvoke getchar
  20. ret
  21.  
  22. section '.idata' import data readable writeable
  23. library msvcrt, 'msvcrt.dll'
  24. import msvcrt,\
  25. getchar,'getchar',\
  26. printf,'printf'


| Сообщение посчитали полезным: ohos

Ранг: 10.4 (новичок)
Активность: 0.020
Статус: Участник

Создано: 19 сентября 2014 21:42
· Личное сообщение · #7

colorblind пишет:
Это чистейший ассемблерный код, исполнить его поможет любой компилятор, будь то MASM, FASM, NASM. Тебе уже сказали, где искать информацию, читай маны, друг мой


На счет мануалов согласен, они полезны, просто не знал, что подобный код можно скомпилировать такими программами, т.к. прибегаю к ассемблеру крайне редко и на счету фактически только одна рабочая более-менее существенная и не примитивная правка


 eXeL@B —› Вопросы новичков —› Как передать в movss число?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати