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

Условия 0 или чётное при сложении.


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

Опять не справился.(эх ведь говорил один умный человек: "...учиться, учиться и учиться...")
  
Допустим у меня в игре есть участок памяти размером 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              // после использования
Ссылка на комментарий
Поделиться на другие сайты

Ну, для начала у меня вопрос: ты собираешься при каждом срабатывании инструкции делать цикл на проверку 1000 байт кода? Это ведь в разы снизит работу игры, или я ошибаюсь?

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

Хотел потом сказать, при выкладывании таблицы и скрипта.

 

Нашёл адреса "Тумана войны" для Героев 2 (которые раньше (ещё на Артемоне) не смог). Вот для того чтобы сделать карту полностью видимой и делаю скрипт.

 

Более эффективное средство... навряд ли. Там всё просто - нужно прибавить 1 ко всем байтам. Вручную участки карты открываются, значит можно сделать и программно.

 

А в чём проблема с моим решением: неужели процесс прибавления 1 более затратный, чем копирование участка памяти, чем мы с Вами совсем недавно занимались.

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

Хотел потом сказать, при выкладывании таблицы и скрипта.

 

Нашёл адреса "Тумана войны" для Героев 2 (которые раньше (ещё на Артемоне) не смог). Вот для того чтобы сделать карту полностью видимой и делаю скрипт.

 

Более эффективное средство... навряд ли. Там всё просто - нужно прибавить 1 ко всем байтам. Вручную участки карты открываются, значит можно сделать и программно.

 

А в чём проблема с моим решением: неужели процесс прибавления 1 более затратнЭлый, чем копирование участка памяти, чем мы с Вами совсем недавно занимались.

Элементарное решение -найди инструкцию, что работает с адресами тумана войны, и просто клади в адреса 1 (если нужно добавь пару условий).

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

Элементарное решение -найди инструкцию, что работает с адресами тумана войны, и просто клади в адреса 1 (если нужно добавь пару условий).

Coder, не думал что и ты не внимательно читаешь: инструкцию я нашёл и даже написал часть кода - всё описано в первом посте. 

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

Так карты разного размера бывают. Как ты определишь, сколько байт тебе заполнить надо?

С этим я справлюсь (уже давно продумал как).

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

Да действительно, криво прочитал.

Касательно твоего вопроса, могу дать совет.

Напиши нужный тебе код на C++ (выполняющий задачу перебора байт и заполнения их по условию), скомпилируй программу в Release сборку и собственно говоря запусти отладку, поставь бряк на своем участке кода и скопируй дизассемблерный код да и все.

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

Да действительно, криво прочитал.

Касательно твоего вопроса, могу дать совет.

Напиши нужный тебе код на C++ (выполняющий задачу перебора байт и заполнения их по условию), скомпилируй программу в Release сборку и собственно говоря запусти отладку, поставь бряк на своем участке кода и скопируй дизассемблерный код да и все.

Спасибо Coder за совет, я конечно начал изучать C# (выбрал его), но я только в самом, самом начале (и даже прошёл в Интуите курс для школьников правда хреновый курс мне не понравился, хотя и сдал на 4), но пока в программировании я 0 и тем более на C++.

 

Код написанный мной работает, но открывает (так как нет условия проверки "Чётности"), только свободную от монстров, строений, кустов ну и т.д. карту (т.е. после активирования моего скрипта - Карта кусками открыта, кусками нет.)

 

Кое что нашёл по условию чётности, т.е. для моего случая это примерно так:  

test byte ptr [esi],1je ...... // если чётноеjne...... // если нечётное

буду пробовать этот вариант.

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

Что ж пробуй, удачи :)

C# исполняется на виртуальной машине со своим ассемблером, поэтому даже если ты напишешь на нем код решающий твою задачу, воспользоваться им не сможешь)

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

Что ж пробуй, удачи :)

C# исполняется на виртуальной машине со своим ассемблером, поэтому даже если ты напишешь на нем код решающий твою задачу, воспользоваться им не сможешь)

Код пишу на CE-шном ассемблере, до написания чего-нибудь на C# мне ещё очень и очень далеко. С# - начал изучать, чтобы поучиться делать трейнеры, а то я в генераторе трейнера назначения окон не знаю (перевода то нет, жаль что SER(G)ANT и там не перевёл).

test byte ptr [esi],1je ...... // если чётноеjne...... // если нечётное

буду пробовать этот вариант.

Супер - сработало как часы - карта открылась полностью.

Теперь осталось только добавить то, о чём писал Xipho в этом сообщении и можно выкладывать готовый скрипт.

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

Эмм. Это вообще-то сравнение с единицой, причем тут четность?


Можно попробовать так на четность проверить, например:

bt [esi],0jnc ... // нечетноеjc ... // четное

bt - перенос выбранного бита во флаг переноса (CF)

и далее сравнение этого флага.

В данном случае переносим младший бит. А он равен 1, если число четное (вспоминаем двоичную систему счисления), и 0, если четное.

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

Эмм. Это вообще-то сравнение с единицой, причем тут четность?

Это именно проверка условия чётности.

 

Добавил в скрипт все размеры карт - супер - открывает карты любого размера. Проверил и  в Обычных играх и в Компаниях.

 

Осталось добавить Аобскан.

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

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

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

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