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

Целочисленное Деление


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

Здравствуйте Геймхаклаберы. Возник вопрос по целочисленному делению. Читал инфу из статей и справочников, но вот как это применить в игре не получается.

 

Вот пример инструкции которая пишет обновленное количество жизней при ударе врага.

 

mov [esi+000000F1C],eax

 

Так вот вопрос. Как eax разделить на 2.

То есть

 

код

код

прилетает значение жизней противника в eax(к примеру 500)

потом 500 прилетает в [esi+000000F1C].

как тот же 500 разделить на 2 при обращении к инструкции.

 

пробовал так

pushad

mov edx,0

mov eax,eax

mov edi,2

div edi

mov [esi+000000F1C],eax

popad

 

Но происходит вылет... Прошу помощи исходя из моей инструкции.

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

Может как то так!  :mellow:

DIV

    Без знаковое деление

    •    если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah;

    •    если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx;

    •    если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx.

    mov ax,10234

    mov bl,154

    div bl ;ah=остаток, al=частное

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

Ну так а как это прикрутить к моей инструкции?

 

Используя подсказку krocki, возможно должно быть так

pushadmov bl,2div blmov [esi+000000F1C],alpopad

В этом случае делимое не должно быть больше чем 65535.

 

Хотя в первом варианте всё было правильно, делимое - 8 байт EDX:EAX, делитель - 4 байта edi. Инструкция точно не отвечает ни за что другое? Или быть может значение eax дальше не сходится с полученным значением в ячейке памяти.

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

Вроде делится но теперь такая трабла.

Жизни доходят до целого которое делится на 2 например до 3. И тут при следующем делении выскакивает 268435427 и потом оно делит делит весь цикл пока не дойдет до 0.(враг умирает). Как этот цикл убрать?

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

Вроде делится но теперь такая трабла.

Жизни доходят до целого которое делится на 2 например до 3. И тут при следующем делении выскакивает 268435427 и потом оно делит делит весь цикл пока не дойдет до 0.(враг умирает). Как этот цикл убрать?

Может чушь скажу, но попробуй в код добавить условия. Например:

if (iNum == 0 && iNum <= 3) {  // ничего не делаем} else {  // выполняем деление}
Или прыжки:

jmp // безусловный прыжок

jne // прыжок, если число не равно

je // прыжок, если равно (3 == 3)

ja // прыжок, если число больше (3 > 1)

jae // прыжок, если выше, или равно (3 >= 3)

Прыжков много в асме, поэтому лень все их переписывать - погугли, найдется быстро.
Ссылка на комментарий
Поделиться на другие сайты

Хорошая мысль. Игра XIII. Ниже скину сам скрипт. Суть в том что с 0 не получается сравнивать(условие не срабатывает).

Еще суть в том что сначала из eax вычитается урон из оружия потом делится. Пробывал перед вычитанием делить всеравно опускается ниже нуля(FFFFF0C) и начинает делить уже это число. Как бы это обойти? Вот такой чудо скрипт написал чтобы хоть как то это обойти.

[ENABLE]//code from here to '[DISABLE]' will be used to enable the cheatalloc(newmem,2048)label(returnhere)label(1hit)label(orig)label(origs)label(cont)                  // Инструкция вычитания жизней работает и с адресом врагов и с моим и еще с кучей разных адресовnewmem:cmp [ebx+38],0  // отсеиваем левые адреса(оставляем только мои ХП и ХП врагов)je contjmp origcont:cmp [ebx+80],0  //отсеиваем все адреса кроме адреса ХП враговje origjmp 1hit1hit:pushad  //стекем все регистрыmov edx,0  //обнуляем высший порядок для деленияmov eax,eax  // это для наглядности так как eax делимоеmov edi,2  // это делитель в нашем случае 2div edi // делим на 2//следующей строчкой идет сравнение так как жизни перемахивают через 0 и получаются числа (FFFFFXX и т.д.)cmp eax,1111111 //11111111 взял это число т.к. он успевает поделить FFFFFFFXXjg origs // если больше заданного прыгаем на обнулениеmov [ebx],eax //  оригинальная инструкцияpopad  //восстанавливаем регистрыmov ebx,eaxmov eax,[esp+14]jmp returnhereorig: // оригинальная инструкцияmov [ebx],eaxmov ebx,eaxmov eax,[esp+14]jmp returnhereorigs: // сюда прыгаем после сравнения результата деленияpopad //восстанавливаем регистрыmov eax,0 //обнуляем eaxmov [ebx],eaxmov ebx,eaxmov eax,[esp+14]jmp returnhere"Core.dll"+1959E:jmp newmemnopnopnopreturnhere:  [DISABLE]//code from here till the end of the code will be used to disable the cheatdealloc(newmem)"Core.dll"+1959E:mov [ebx],eaxmov ebx,eaxmov eax,[esp+14]//Alt: db 89 03 8B D8 8B 44 24 14

Как убрать эти костыли? Сделать так чтобы при невозможном делении на целое(1/2) выдавало 0 и остаток 1. Как-то так.

 

P.S. Или как то заменить умножением с дробными числами все куда проще нежели с целыми.

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

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

2 - делается сдвиг вправо на 1 бит

4 - сдвиг вправо на 2 бита

8 - 3 бита

16 - 4 бита и так далее.

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

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

2 - делается сдвиг вправо на 1 бит

4 - сдвиг вправо на 2 бита

8 - 3 бита

16 - 4 бита и так далее.

 

Спасибо огромное вроде разобрался.

sar eax,1

mov [ebx],eax

mov ebx,eax

mov eax,[esp+14]

Работает как надо.

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

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

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

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