lamalamaz Опубликовано 2 ноября, 2014 Поделиться Опубликовано 2 ноября, 2014 (изменено) Здравствуйте Геймхаклаберы. Возник вопрос по целочисленному делению. Читал инфу из статей и справочников, но вот как это применить в игре не получается. Вот пример инструкции которая пишет обновленное количество жизней при ударе врага. mov [esi+000000F1C],eax Так вот вопрос. Как eax разделить на 2.То есть кодкодприлетает значение жизней противника в eax(к примеру 500)потом 500 прилетает в [esi+000000F1C].как тот же 500 разделить на 2 при обращении к инструкции. пробовал такpushadmov edx,0mov eax,eaxmov edi,2div edimov [esi+000000F1C],eaxpopad Но происходит вылет... Прошу помощи исходя из моей инструкции. Изменено 2 ноября, 2014 пользователем lamalamaz Ссылка на комментарий Поделиться на другие сайты Поделиться
krocki Опубликовано 2 ноября, 2014 Поделиться Опубликовано 2 ноября, 2014 Может как то так! DIV Без знаковое деление • если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah; • если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx; • если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx. mov ax,10234 mov bl,154 div bl ;ah=остаток, al=частное Ссылка на комментарий Поделиться на другие сайты Поделиться
lamalamaz Опубликовано 2 ноября, 2014 Автор Поделиться Опубликовано 2 ноября, 2014 Ну так а как это прикрутить к моей инструкции? Ссылка на комментарий Поделиться на другие сайты Поделиться
A1t0r Опубликовано 2 ноября, 2014 Поделиться Опубликовано 2 ноября, 2014 (изменено) Ну так а как это прикрутить к моей инструкции? Используя подсказку krocki, возможно должно быть такpushadmov bl,2div blmov [esi+000000F1C],alpopadВ этом случае делимое не должно быть больше чем 65535. Хотя в первом варианте всё было правильно, делимое - 8 байт EDX:EAX, делитель - 4 байта edi. Инструкция точно не отвечает ни за что другое? Или быть может значение eax дальше не сходится с полученным значением в ячейке памяти. Изменено 2 ноября, 2014 пользователем A1t0r Ссылка на комментарий Поделиться на другие сайты Поделиться
lamalamaz Опубликовано 2 ноября, 2014 Автор Поделиться Опубликовано 2 ноября, 2014 (изменено) Вроде делится но теперь такая трабла.Жизни доходят до целого которое делится на 2 например до 3. И тут при следующем делении выскакивает 268435427 и потом оно делит делит весь цикл пока не дойдет до 0.(враг умирает). Как этот цикл убрать? Изменено 2 ноября, 2014 пользователем lamalamaz Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 2 ноября, 2014 Поделиться Опубликовано 2 ноября, 2014 Вроде делится но теперь такая трабла.Жизни доходят до целого которое делится на 2 например до 3. И тут при следующем делении выскакивает 268435427 и потом оно делит делит весь цикл пока не дойдет до 0.(враг умирает). Как этот цикл убрать?Может чушь скажу, но попробуй в код добавить условия. Например:if (iNum == 0 && iNum <= 3) { // ничего не делаем} else { // выполняем деление}Или прыжки:jmp // безусловный прыжокjne // прыжок, если число не равноje // прыжок, если равно (3 == 3)ja // прыжок, если число больше (3 > 1)jae // прыжок, если выше, или равно (3 >= 3)Прыжков много в асме, поэтому лень все их переписывать - погугли, найдется быстро. Ссылка на комментарий Поделиться на другие сайты Поделиться
lamalamaz Опубликовано 3 ноября, 2014 Автор Поделиться Опубликовано 3 ноября, 2014 (изменено) Хорошая мысль. Игра 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. Или как то заменить умножением с дробными числами все куда проще нежели с целыми. Изменено 3 ноября, 2014 пользователем lamalamaz Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 3 ноября, 2014 Поделиться Опубликовано 3 ноября, 2014 Какой див, вы что? Целочисленное деление на числа, кратные двум делаются побитовым сдвигом вправо. Например, если число нужно разделить на2 - делается сдвиг вправо на 1 бит4 - сдвиг вправо на 2 бита8 - 3 бита16 - 4 бита и так далее. Ссылка на комментарий Поделиться на другие сайты Поделиться
lamalamaz Опубликовано 3 ноября, 2014 Автор Поделиться Опубликовано 3 ноября, 2014 (изменено) Какой див, вы что? Целочисленное деление на числа, кратные двум делаются побитовым сдвигом вправо. Например, если число нужно разделить на2 - делается сдвиг вправо на 1 бит4 - сдвиг вправо на 2 бита8 - 3 бита16 - 4 бита и так далее. Спасибо огромное вроде разобрался.sar eax,1mov [ebx],eaxmov ebx,eaxmov eax,[esp+14]Работает как надо. Изменено 3 ноября, 2014 пользователем lamalamaz Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения