Current time: 20.04.2024, 02:26 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Исследование героев
» туториал(ы)
Author Message
Sav Offline

Posts: 2180
Post: #181

Частенько в коде Героев встречаются команды типа:
lea eax, [eax + 8*eax]
.

Я правильно понимаю, что они нужны для упрощения написания вычислений (вместо:
push ebx
push edx
mov ebx, eax
mov edx, 0
mov eax, 8
mul ebx
add eax, ebx
pop edx
pop ebx
)?

При выполнении есть ли разница между этими командами?


И такой тупой вопрос: можно ли в Иде изменять команды не через Hex-view и как?
04.10.2010 01:15
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #182

Да, примерно так и есть. Разница очевидна - с командой LEA ты не изменяешь другие регистры и не работаешь со стеком.
04.10.2010 01:39
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #183

А когда процессор одинаково быстро выполняет эту lea-команду и "нормальный" код?
04.10.2010 01:48
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #184

LEA-команды выполняются за один такт обычно или даже две-три такие команды за такт, а "нормальный код", который ты привёл, во много раз дольше, в лучшем случае в пять-десять раз.
04.10.2010 16:32
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #185

Но процессору всё равно же надо вычислить, чему равно, eax+8*eax, он что, как-то по-особому вычисляет это в lea-команде?
04.10.2010 17:49
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #186

Именно по-особому.
К тому же в твоём "нормальном" примере изменяются три регистра, а значит их нельзя использовать в других командах, что замедляет выполнение программы (регистры-то часто используемые). Используется стек, то есть идёт обращение к кеш-памяти, на что отводятся дополнительные такты процессора, а в случае с полным кешем, этот кеш нужно выгружать в оперативную память (десятки тактов). Используются три подряд команды mov, что полностью блокирует на несколько тактов блок ввода-вывода, хотя это и не важно, так как дальше идёт длительная команда MUL. Эта команда MUL сама по себе плохая, особенно если в твоём случае блокирует использование сразу трёх регистров и все конвееры процессора или ядра останавливаются, ожидая завершения этой команды.

А команда LEA специально оптимизирована для вычисления формул вида
REG = REG+REG*2N+CONST.
Современные процессоры вычисляют за такт несколько таких команд.
04.10.2010 19:38
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #187

Тогда понятно и то, почему там eax+8*eax вместо 9*eax.
Спасибо.
04.10.2010 20:08
Find all posts by this user Quote this message in a reply
ZVS Offline

Posts: 500
Post: #188

Если память мне не изменяет, то множители (2^N) могут быть только 2, 4 и 8. Этот модификатор команды появился только с i386. Ну и понятно, что умножение на 2^N суть сдвиг на N битов влево. Т.е. *9 и *8 две большие разницы (должно быть). Хотя современные процессоры и умножают уже за 1-2 такта.
05.10.2010 00:51
Find all posts by this user Quote this message in a reply
etoprostoya Offline

Posts: 1809
Post: #189

(05.10.2010 00:51)ZVS Wrote:  Если память мне не изменяет, то множители (2^N) могут быть только 2, 4 и 8.
Ну, может быть и 1. То есть РЕГ = РЕГ + РЕГ. Ноль не считается.

Не знаю как самые-самые последние процессоры, но пару лет назад умножение было не меньше 3-4 тактов. Правда могло проходить сразу два умножения параллельно. Это про 32-разрядное умножение.
05.10.2010 14:03
Find all posts by this user Quote this message in a reply
ZVS Offline

Posts: 500
Post: #190

РЕГ+РЕГ - это стандартный модификатор, который был еще в 80x86, а множители появились, начиная с i386 специально для быстрого обращения к элементам массивов.
05.10.2010 14:56
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #191

Может, кому-нибудь пригодится:

по адресу [6919480]+1170n+137020, где n - номер героя,
находится байт, в котором хранится 1, если герой спит (кнопка "Усыпить/разбудить героя" на карте приключений), иначе - 0.
(This post was last modified: 16.10.2010 17:02 by Sav.)
16.10.2010 17:02
Find all posts by this user Quote this message in a reply
SAG Offline

Posts: 173
Post: #192

(01.09.2010 15:15)MOP Wrote:  Вот длл с более подробным (откомментированным) исходником. Создаёт триггер на лечение Палаткой.
большая просьба прислать мне почтой на randommaps (@) yandex (.) ru. ибо период полураспада файлообменников очень мал и сцылка уже нерабочая
24.10.2010 12:36
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #193

Вот исходник:

Я уже отправил SAG-у файл на почту.
(This post was last modified: 24.10.2010 16:17 by Sav.)
24.10.2010 15:50
Find all posts by this user Quote this message in a reply
GhostManSD Offline

Posts: 1054
Post: #194

Подскажите, пожалуйста, как затереть/вызвать определенное диалоговое окно (алгоритм). Например, дабы вместо окна таверны вызывалось окно рынка.


Κακῆς ἀπ' ἀρχῆς γίγνεται τέλος κακόν.
24.10.2010 21:48
Visit this user's website Find all posts by this user Quote this message in a reply
Дьякон Offline

Posts: 392
Post: #195

Элементарно. Менять таблицу jmp-ов для case - а идентификатора зданий.


Страус труп (с) Бьерн
24.10.2010 22:57
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2024 MyBB Group