mov [edx*8+lines+0x04],ecx
Может кто-то внятно сказать, инструкция "mov [edx*8+lines+0x04],ecx" (где lines - некоторая переменная) действительно представляет собой одну инструкцию или всё-таки несколько? Будет ли она выполняться так же быстро, как "mov [edx+0x04],ecx"?
mov [edx*8+lines+0x04],ecx
Если lines это глобальная переменная, то в данном случае при компиляции подставится его смещение и получим
mov [edx*8+0xНННН],ecx
0xНННН - где некоторый адрес.
На древних процах, может и дольше, потому что там, где есть множитель, обязательно используется SIB-составляющая инструкции, а отсюда уже следует, что данная инструкция будет в любом случае еще и на байт длиннее...
Этот множитель это на самом деле просто сдвиг на 3 бита.
Ну так это 386 и 486. Да и то не ясно на сколько там медленее
Pavia, так этот вопрос можно уточнить, только зачем это сейчас? Я просто придерживаюсь принципа не использовать сложные адресные конструкции, если они могут быть заменены простыми... В любом случае множители более эффективны для вычисления сложного смещения, чем дополнительные инструкции...
Это я к тому, что видя множитель, являющийся степенью двойки, процессор (умный, гад) не будет нчиего умножать, а просто сдвинет. Получится медленнее, чем предыдуший вариант, но ровно на этот самый сдвиг.
Начиная с Pentium в архетектуру вводится конвеерная обработка. И адрес вычисляется в блоке декадирования, что ни как не сказывается на производительности. А в 486 появляется кэш, что компенсирует затраты на длину. Но я в этом слабо разбираюсь.
Увеличение размера ... а его может и не быть вовсе. Со времен моторолы осталось безумное количество страшных способов адресации, так что я не удивлюсь, если там имеется и "обратиться по адресу, который равен такому-то регистру, сдвинутому на 3 бита и плюс еще что-то".
То есть даже наверняка такое есть. Может быть восьмерка и не зафиксирована, но точно был там способ адресации со сдвигом.
В руководстве по 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-разрядное целое).
Всем большое спасибо за ответы.