Garik66 Опубликовано 12 января, 2015 Поделиться Опубликовано 12 января, 2015 Опять не справился.(эх ведь говорил один умный человек: "...учиться, учиться и учиться...") Допустим у меня в игре есть участок памяти размером 1000 байт.Мне нужно к каждому байту этого участка равному 0 или чётному прибавить 1. Мастера помогите написать код. Заранее - СПАСИБО!!!Вот примерно что я написал:push esi // Сохраняем регистрыpush ecx // перед использованиемmov ecx,3e8 // 1000 байтlea esi,[adres] // Загружаем адрес первого байтаCikl: // метка "Цикл"cmp byte ptr [esi],0 // Сравниваем с 0jne @F // Если не равно 0, то перепрыгиваем следующую инструкцию add byte ptr [esi],1 // +1@@: // Промежуточная безымянная меткаdec ecx // Уменьшаем счетчик циклаinc esi // Переходим к следующему байтуcmp ecx,0 // Достигли ли конца цикла?je @F // Если да, выходим из циклаjmp Cikl // Если нет - прыгаем на метку Cikl, то есть, переходим к следующей итерации цикла@@: // Безымянная метка для указания местоположения выхода из циклаpop ecx // Восстанавливаем регистры pop esi // после использования Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 12 января, 2015 Поделиться Опубликовано 12 января, 2015 Ну, для начала у меня вопрос: ты собираешься при каждом срабатывании инструкции делать цикл на проверку 1000 байт кода? Это ведь в разы снизит работу игры, или я ошибаюсь? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 января, 2015 Автор Поделиться Опубликовано 12 января, 2015 Для моего случая (для каждой новой игры) прибавление 1 будет разовой операцией. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 12 января, 2015 Поделиться Опубликовано 12 января, 2015 Что за игра и чего именно ты хочешь добиться скажи, может, придумаем более эффективное решение. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 января, 2015 Автор Поделиться Опубликовано 12 января, 2015 Хотел потом сказать, при выкладывании таблицы и скрипта. Нашёл адреса "Тумана войны" для Героев 2 (которые раньше (ещё на Артемоне) не смог). Вот для того чтобы сделать карту полностью видимой и делаю скрипт. Более эффективное средство... навряд ли. Там всё просто - нужно прибавить 1 ко всем байтам. Вручную участки карты открываются, значит можно сделать и программно. А в чём проблема с моим решением: неужели процесс прибавления 1 более затратный, чем копирование участка памяти, чем мы с Вами совсем недавно занимались. Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 12 января, 2015 Поделиться Опубликовано 12 января, 2015 Хотел потом сказать, при выкладывании таблицы и скрипта. Нашёл адреса "Тумана войны" для Героев 2 (которые раньше (ещё на Артемоне) не смог). Вот для того чтобы сделать карту полностью видимой и делаю скрипт. Более эффективное средство... навряд ли. Там всё просто - нужно прибавить 1 ко всем байтам. Вручную участки карты открываются, значит можно сделать и программно. А в чём проблема с моим решением: неужели процесс прибавления 1 более затратнЭлый, чем копирование участка памяти, чем мы с Вами совсем недавно занимались.Элементарное решение -найди инструкцию, что работает с адресами тумана войны, и просто клади в адреса 1 (если нужно добавь пару условий). Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 января, 2015 Автор Поделиться Опубликовано 12 января, 2015 Элементарное решение -найди инструкцию, что работает с адресами тумана войны, и просто клади в адреса 1 (если нужно добавь пару условий).Coder, не думал что и ты не внимательно читаешь: инструкцию я нашёл и даже написал часть кода - всё описано в первом посте. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 12 января, 2015 Поделиться Опубликовано 12 января, 2015 Так карты разного размера бывают. Как ты определишь, сколько байт тебе заполнить надо? Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 января, 2015 Автор Поделиться Опубликовано 12 января, 2015 Так карты разного размера бывают. Как ты определишь, сколько байт тебе заполнить надо?С этим я справлюсь (уже давно продумал как). Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 12 января, 2015 Поделиться Опубликовано 12 января, 2015 Да действительно, криво прочитал.Касательно твоего вопроса, могу дать совет.Напиши нужный тебе код на C++ (выполняющий задачу перебора байт и заполнения их по условию), скомпилируй программу в Release сборку и собственно говоря запусти отладку, поставь бряк на своем участке кода и скопируй дизассемблерный код да и все. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 января, 2015 Автор Поделиться Опубликовано 12 января, 2015 Да действительно, криво прочитал.Касательно твоего вопроса, могу дать совет.Напиши нужный тебе код на C++ (выполняющий задачу перебора байт и заполнения их по условию), скомпилируй программу в Release сборку и собственно говоря запусти отладку, поставь бряк на своем участке кода и скопируй дизассемблерный код да и все.Спасибо Coder за совет, я конечно начал изучать C# (выбрал его), но я только в самом, самом начале (и даже прошёл в Интуите курс для школьников правда хреновый курс мне не понравился, хотя и сдал на 4), но пока в программировании я 0 и тем более на C++. Код написанный мной работает, но открывает (так как нет условия проверки "Чётности"), только свободную от монстров, строений, кустов ну и т.д. карту (т.е. после активирования моего скрипта - Карта кусками открыта, кусками нет.) Кое что нашёл по условию чётности, т.е. для моего случая это примерно так: test byte ptr [esi],1je ...... // если чётноеjne...... // если нечётноебуду пробовать этот вариант. Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 12 января, 2015 Поделиться Опубликовано 12 января, 2015 Что ж пробуй, удачи C# исполняется на виртуальной машине со своим ассемблером, поэтому даже если ты напишешь на нем код решающий твою задачу, воспользоваться им не сможешь) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 января, 2015 Автор Поделиться Опубликовано 12 января, 2015 Что ж пробуй, удачи C# исполняется на виртуальной машине со своим ассемблером, поэтому даже если ты напишешь на нем код решающий твою задачу, воспользоваться им не сможешь)Код пишу на CE-шном ассемблере, до написания чего-нибудь на C# мне ещё очень и очень далеко. С# - начал изучать, чтобы поучиться делать трейнеры, а то я в генераторе трейнера назначения окон не знаю (перевода то нет, жаль что SER(G)ANT и там не перевёл).test byte ptr [esi],1je ...... // если чётноеjne...... // если нечётноебуду пробовать этот вариант.Супер - сработало как часы - карта открылась полностью.Теперь осталось только добавить то, о чём писал Xipho в этом сообщении и можно выкладывать готовый скрипт. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 12 января, 2015 Поделиться Опубликовано 12 января, 2015 Эмм. Это вообще-то сравнение с единицой, причем тут четность?Можно попробовать так на четность проверить, например:bt [esi],0jnc ... // нечетноеjc ... // четноеbt - перенос выбранного бита во флаг переноса (CF)и далее сравнение этого флага.В данном случае переносим младший бит. А он равен 1, если число четное (вспоминаем двоичную систему счисления), и 0, если четное. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 января, 2015 Автор Поделиться Опубликовано 12 января, 2015 Эмм. Это вообще-то сравнение с единицой, причем тут четность?Это именно проверка условия чётности. Добавил в скрипт все размеры карт - супер - открывает карты любого размера. Проверил и в Обычных играх и в Компаниях. Осталось добавить Аобскан. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 12 января, 2015 Поделиться Опубликовано 12 января, 2015 А, стоп, ну да. test же ) А меня что-то на cmp заело ) Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 января, 2015 Автор Поделиться Опубликовано 12 января, 2015 Небольшую статью и скрипт выложил в этой теме.таблицу выложил здесь. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения