Пожалуй стоит пояснить подробнее, раз выделили в специальную тему.
Ситуация с одним и даже двумя массивами не интересна, что указатели, что индексы, всё едино в плане скорости. Возьмём для определённости сразу 100 массивов и будем считать что адресация к ним идёт не в произвольном порядке, а согласовано, но допустимы небольшие постоянные смещения для каждого массива. Да, это ограничивает круг задач, однако он остаётся ещё весьма и весьма объёмным.
Итак, 100 указателей в регистры не поместится, они будут в лучшем случае в стеке, адресация к ним будет по
[EBP-const]. Посмотрим во что выльется код к примеру суммирования элементов массивов типа
a[i]=b[i]+c[i-1]-d[i+10] (показываю всего 4 указателя, но в стеке, лень больше набирать, и так идея видна):
;инициализацию указателей не показываю, суть не в ней, положим она правильная для начального значения i
mov EBX,[EBP-const2];указатель на b[i]
mov EAX,[EBX];b[i]
add EBX,4
mov [EBP-const2],EBX
mov EBX,[EBP-const3];указатель на c[i-1]
add EAX,[EBX]
add EBX,4
mov [EBP-const3],EBX
mov EBX,[EBP-const4];указатель на d[i+10]
sub EAX,[EBX]
add EBX,4
mov [EBP-const4],EBX
mov EBX,[EBP-const1];указатель на a[i]
mov [EBX],EAX
add EBX,4
mov [EBP-const1],EBX
А теперь посмотрим на тот же код, но с индексацией по
i:
;i хранится в EBX
mov EAX,[EBX*4+const2];читаем сразу b[i]
add EAX,[EBX*4+const3-1*4];добавляем сразу c[i-1]
sub EAX,[EBX*4+const4+10*4];добавляем сразу d[i+10]
mov [EBX*4+const1],EAX
inc EBX
Разница налицо.
Что будет со скоростью выполнения — вопрос. В первом коде загрузка EBX и чтение данных по [EBX] и увеличение EBX и запись его обратно в стек могут и будут параллелиться, плюс буфера отложенной записи и методика предвыборки последовательных данных, и в принципе если все указатели в кэше L1, то скорость может быть и одинаковой. Но, в первом коде заметно больше инструкций, в том числе и микроопераций, а очереди и глубина просмотра в процессорах не бесконечные.
С другой стороны, второй способ подходит только для статических массивов, когда их адреса известны на этапе компиляции. И незначительно замедляется загрузка exe файла в память из-за увеличения списка коррекции адресов при размещении сегментов данных в памяти.
И наоборот, если все нужные указатели влезают в регистры, то использование плюс к ним ещё и индекса тратит лишний регистр не давая выигрыша в скорости:
;указатели на массивы: EAX,EBX,ECX,EDX
mov ESI,[EBX]
add EBX,4
add ESI,[ECX]
add ECX,4
sub ESI,[EDX]
add EDX,4
mov [EAX],ESI
add EAX,4
Вариант с индексом в EDI:
;указатели на массивы: EAX,EBX,ECX,EDX
mov ESI,[EBX+EDI*4]
add ESI,[ECX+EDI*4-1*4]
sub ESI,[EDX+EDI*4+10*4]
mov [EAX+EDI*4],ESI
inc EDI
И снова код меньше, но скорость может быть и одинаковой из-за параллельности операций в первом варианте. Зато нужно на один регистр больше. Зато уже не обязательно статические массивы.
В этом случае выбор затруднён, смотря что ещё есть вокруг этого кода в цикле, может лишний свободный регистр пересилит увеличение длины кода этого куска.
PS. Всё написано из головы без проверки, могут быть опечатки. Что вместо этого нагеренит компилятор ЯВУ — даже не спрашивайте, боюсь заранее.