Можете ли вы помочь с этим кодом на ассемблере? - PullRequest
2 голосов
/ 30 сентября 2009

Я просматривал фрагмент кода игры для ПК, который я пытаюсь «улучшить». (Хорошо, так что, может быть, я сосу в игре, но я все еще хочу играть в нее). Не могли бы вы посмотреть следующий код:

fld dword ptr[ebp+00007B1C]
fsub dword ptr[esp+64]
fst dword ptr[ebp+00007B1C]
call 004A2E48

Этот код вызывается каждую секунду для таймера обратного отсчета уровня. Мне нужно оставаться на определенном уровне в течение нескольких минут. Если я смогу изменить приведенный выше код так, чтобы значение, введенное в адрес [ebp + 00007B1C], равнялось 0, тогда уровень игры всегда будет зависать, и это спасет меня от игры в эти безумные мини-игры на выживание.

Я объясню, что я понимаю из этого кода. Не волнуйтесь, вам не нужно углубляться в это. В первой строке мы получаем значение таймера. Например, если осталось 97 секунд, то именно здесь загружается это значение.
Во второй строке значение (1 секунда) вычитается из 97.
В третья строка 96 снова перемещается в память. И, наконец, у нас есть вызов функции, которая будет выполнять другую обработку в зависимости от оставшегося времени.

Теперь все, что мне нужно сделать, это как-то исправить этот фрагмент кода, чтобы выдаваемое значение было равно 0 (на третьем шаге).
Не могли бы вы помочь мне с этим?

Ответы [ 3 ]

4 голосов
/ 30 сентября 2009

Заменить

fld dword ptr[ebp+00007B1C]
fsub dword ptr[esp+64]

с

fldz ; Push zero on to top of floating point stack
nop ; From the end of the fldz to the beginning of the store instruction
2 голосов
/ 01 октября 2009

Еще один патч:
замена

fld dword ptr[ebp+00007B1C]

с

fld dword ptr[esp+64]
NOP
NOP
1 голос
/ 30 сентября 2009

Просто пропустите вторую команду. То есть выясните, сколько байт занимает команда fsub, и перезапишите ее с таким количеством безоперационных байт-кодов (0x90).

...