Программирование (ASM, C++, и другое) - Форум
Вторник, 06.12.2016, 11:10
Качественные скрипты, моды и дополнения для GTA без регистрации
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Форум » Игры серии ГТА » Работа с памятью, exe » Программирование (ASM, C++, и другое) (Тема по программированию)
Программирование (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
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: 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
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: 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
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: 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
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: 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
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: 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
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: 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
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: 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)
---------------------------------------------
И да, по тем адрессам записаны целые.

 
Форум » Игры серии ГТА » Работа с памятью, exe » Программирование (ASM, C++, и другое) (Тема по программированию)
Страница 1 из 212»
Поиск: