Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

mov [edx*8+lines+0x04],ecx

3.3K
24 августа 2006 года
ShadyMan
191 / / 15.07.2006
Может кто-то внятно сказать, инструкция "mov [edx*8+lines+0x04],ecx" (где lines - некоторая переменная) действительно представляет собой одну инструкцию или всё-таки несколько? Будет ли она выполняться так же быстро, как "mov [edx+0x04],ecx"?
551
24 августа 2006 года
Pavia
357 / / 22.04.2004
Да также быстро. Это похожие инструкции.
mov [edx*8+lines+0x04],ecx
Если lines это глобальная переменная, то в данном случае при компиляции подставится его смещение и получим
mov [edx*8+0xНННН],ecx
0xНННН - где некоторый адрес.
349
25 августа 2006 года
Phantom-84
656 / / 27.10.2005
На древних процах, может и дольше, потому что там, где есть множитель, обязательно используется SIB-составляющая инструкции, а отсюда уже следует, что данная инструкция будет в любом случае еще и на байт длиннее...
16K
26 августа 2006 года
aragaer
25 / / 28.07.2006
Этот множитель это на самом деле просто сдвиг на 3 бита.
551
26 августа 2006 года
Pavia
357 / / 22.04.2004
Ну так это 386 и 486. Да и то не ясно на сколько там медленее
349
26 августа 2006 года
Phantom-84
656 / / 27.10.2005
aragaer, спасибо за ценную инфу :)

Pavia, так этот вопрос можно уточнить, только зачем это сейчас? Я просто придерживаюсь принципа не использовать сложные адресные конструкции, если они могут быть заменены простыми... В любом случае множители более эффективны для вычисления сложного смещения, чем дополнительные инструкции...
16K
27 августа 2006 года
aragaer
25 / / 28.07.2006
Это я к тому, что видя множитель, являющийся степенью двойки, процессор (умный, гад) не будет нчиего умножать, а просто сдвинет. Получится медленнее, чем предыдуший вариант, но ровно на этот самый сдвиг.
551
27 августа 2006 года
Pavia
357 / / 22.04.2004
Начиная с Pentium в архетектуру вводится конвеерная обработка. И адрес вычисляется в блоке декадирования, что ни как не сказывается на производительности. А в 486 появляется кэш, что компенсирует затраты на длину. Но я в этом слабо разбираюсь.
16K
27 августа 2006 года
aragaer
25 / / 28.07.2006
Ну да, примерно так. Сложную адресацию сложно декодировать, но все-таки это происходит одновременно с "осмысленной" деятельностью, так что реально эти команды будут выполняться совсем одинаково по времени.

Увеличение размера ... а его может и не быть вовсе. Со времен моторолы осталось безумное количество страшных способов адресации, так что я не удивлюсь, если там имеется и "обратиться по адресу, который равен такому-то регистру, сдвинутому на 3 бита и плюс еще что-то".

То есть даже наверняка такое есть. Может быть восьмерка и не зафиксирована, но точно был там способ адресации со сдвигом.
17K
28 августа 2006 года
Yar4
15 / / 10.07.2006
В руководстве по i486 всё это описано (пункт 2.5.3.2)! Этот метод адресации называется (Индекс*Коэффициент масштабирования)+Смещение, коэффициент может равняться 2, 4 или 8. А вообще линейный эффективный адрес вычисляется так - Сегмент (точнее его база) (cs, ss, ds, es, fs или gs) + База (ничего, eax, ecx, edx, ebx, esp, ebp, esi или edi) + (Индекс (eax, ecx, edx, ebx, ничего, ebp, esi или edi) * Коэффициент (1, 2, 4 или 8)) + Смещение (ничего, 8-разрядное целое или 32-разрядное целое).
3.3K
28 августа 2006 года
ShadyMan
191 / / 15.07.2006
Всем большое спасибо за ответы.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог