Программирование (ASM, C++, и другое)
|
|
DK22Pac | Дата: Воскресенье, 13.11.2011, 17:23 | Сообщение # 1 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Будет тема для обсуждения нюансов программирования.
Добавлено (13.11.2011, 17:08) --------------------------------------------- Немножко разобрался с переводом 2-х-байтового целого в float... Code float fCoordX; float flt_0125 = 0.125; ... __asm { mov ax, wordCoordX movzx eax, ax mov fCoordX, eax fild fCoordX fmul ds:flt_0125 fstp fCoordX } Вообще, в C++ есть специальная инструкция для этого Code fCoordX = (float)wordCoordX Но у меня с ней какие-то проблемы... Игра начинает лагать.
Добавлено (13.11.2011, 17:23) --------------------------------------------- А вот пока что код поворотников, с ошибками... http://pastebin.com/Npgt0e2g
Написано ламером))
Сообщение отредактировал DK22Pac - Воскресенье, 13.11.2011, 17:25 |
|
| |
Den_spb | Дата: Воскресенье, 13.11.2011, 17:44 | Сообщение # 2 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Для записи целого значения с учётом его знака в переменную большего размера в asm есть специальный опкод - movsx. Поэтому вместоCode mov ax, word ptr [CurrX] movzx eax, ax mov CurrX, eax } if(CurrX >= 0x8000) { CurrX += 0xFFFF0000; } можно написатьCode movsx eax, word ptr [CurrX] mov CurrX, eax или ещё прощеCode movsx CurrX, word ptr [CurrX]
|
|
| |
DK22Pac | Дата: Воскресенье, 13.11.2011, 17:55 | Сообщение # 3 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Спасибо, код намного стал компактней. Удивительно, но компилятор не стал ругаться)
|
|
| |
Den_spb | Дата: Воскресенье, 13.11.2011, 18:10 | Сообщение # 4 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Это по-моему лишнее:Code } if(Angle2>360.0) { Angle2 -= 360.0; } else { if(Angle2<0.0) { Angle2 += 360.0; } }
|
|
| |
DK22Pac | Дата: Воскресенье, 13.11.2011, 21:46 | Сообщение # 5 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Спасибо, подправил. http://pastebin.com/pZ5xFZDq Ломаю голову... Не работает... Проверки убирал, короны создавались (они для теста)
|
|
| |
Den_spb | Дата: Воскресенье, 13.11.2011, 22:52 | Сообщение # 6 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (DK22Pac) Проверки убирал, короны создавались (они для теста) О каких проверках идёт речь? Значение TractorStruct проверяется правильно.
|
|
| |
DK22Pac | Дата: Воскресенье, 13.11.2011, 22:55 | Сообщение # 7 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Я убирал проверки с углом (Angle1). В самом конце. Ещё раз сверился с твоим скриптом - вроде бы всё идеально так же. Конструкцию For...To я рассписал (отдельно считал для Prev, Curr, Next)
Сообщение отредактировал DK22Pac - Воскресенье, 13.11.2011, 22:57 |
|
| |
Den_spb | Дата: Воскресенье, 13.11.2011, 23:08 | Сообщение # 8 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Если не работает проверка угла, то, возможно, есть ошибки в вычислениях арктангенсов или углов.
|
|
| |
DK22Pac | Дата: Понедельник, 02.01.2012, 16:34 | Сообщение # 9 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Вот код
fld dword ptr [esi+4] push 0FFh fmul ds:dword_858B90 ; 4.0f (flt_esi+4 *= 4.0f) push 0FFh lea eax, [esp+0D0h+var_90] push eax ; RGB pointer fstp [esp+0D4h+var_B8] fild [esp+0D4h+var_7C] mov eax, [esp+0D4h+var_B8] fild [esp+0D4h+var_6C] push eax ; (flt_esi+4 * 4.0f) fld [esp+0D8h+var_A4] push eax ; (flt_esi+4 * 4.0f) fsub st, st(2) sub esp, 8 fmul dword ptr [esi] fadd st, st(2) fstp [esp+0E4h+var_E0] fld [esp+0E4h+var_A8] fsub st, st(1) fmul dword ptr [esi] fadd st, st(1) fstp [esp+0E4h+var_E4] fstp st fstp st call sub_70F440 add esp, 1Ch
Вызываемая процедура берёт со стека 7 параметров (float, float, float, float, dword* pRGB, word, word). Push'ем туда передано 5 параметров. Где эти 2 параметра? Знаю, что это связано с sub esp, 8.
Сообщение отредактировал DK22Pac - Понедельник, 02.01.2012, 16:38 |
|
| |
Den_spb | Дата: Понедельник, 02.01.2012, 16:53 | Сообщение # 10 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Quote (DK22Pac) Знаю, что это связано с sub esp, 8. Верно мыслишь. Указатель на вершину стека всегда записан в esp, поэтому кроме команды push можно использовать и другой способ передачи параметров на стек: Code mov [esp+смещение], передаваемое значение Предварительно надо сдвинуть указатель на стек, чтобы не затёрлись уже переданные значения (здесь для этого используется sub esp, 8). Оставшиеся два параметра в данном случае загружаются командами: fstp [esp+0E4h+var_E0] fstp [esp+0E4h+var_E4] П.С.Если используется этот способ передачи параметров, то обычно можно сделать вывод, что тип параметра - float.
|
|
| |
DK22Pac | Дата: Понедельник, 09.01.2012, 00:31 | Сообщение # 11 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Спасибо! Очень помогло. Насколько я щас понимаю, это 4 координаты на скрине (возможно, x,y,w,h). Буду дальше разбирать.Добавлено (08.01.2012, 23:54) --------------------------------------------- Ошибки на каждом шагу... Теперь понятно, почему не получалось перевести код поворотников на С++/асм... Вот так правильно писать надо было. Code fild [0xC17044] // RsGlobal.MaximumWidth fmul [fHalf] fstp [dispX] Добавлено (09.01.2012, 00:31) --------------------------------------------- Ден, как думаешь, правильно ли написал нахождение гипотенузы? (Диагональ экрана) Code fild [0xC17044] // RsGlobal.MaximumWidth fmul st(0), st(0) fild [0xC17048] // RsGlobal.MaximumHeigth fmul st(1), st(1) fadd st(0), st(1) fsqrt fstp [fHypot] fstp st
|
|
| |
Den_spb | Дата: Понедельник, 09.01.2012, 01:21 | Сообщение # 12 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| После загрузки второго числа первое смещается в st(1) - в результате ты его умножаешь на себя ещё раз. Code mov eax, 0xC17044 fild [eax] fmul st, st mov eax, 0xC17048 fild [eax] fmul st, st faddp st(1), st fsqrt fstp fHypot fild [0xC17044] возьмёт число по адресу, записанному в 0xC17044 (возможно ошибаюсь, но если я прав, то надо предварительно записать адрес в регистр, как я написал в своём варианте). В 0xC17044 и 0xC17048 должны быть записаны целые числа, т.к. fild - команда загрузки целых чисел (аналог для дробных - fld).
|
|
| |
DK22Pac | Дата: Четверг, 19.01.2012, 04:11 | Сообщение # 13 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| И то, и то работает...
Сообщение отредактировал DK22Pac - Четверг, 19.01.2012, 04:15 |
|
| |
Den_spb | Дата: Четверг, 19.01.2012, 17:48 | Сообщение # 14 |
Создатель сайта
Группа: Администраторы
Сообщений: 1595
Статус: Offline
| Ты про fild [0xC17044] / fild [eax] ?
|
|
| |
DK22Pac | Дата: Пятница, 20.01.2012, 20:37 | Сообщение # 15 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Code fstp fFloat fstp [fFloat] Может, компилятор такой (у меня C++ Builder 2002).Добавлено (20.01.2012, 20:37) --------------------------------------------- И да, по тем адрессам записаны целые.
|
|
| |