Ассемблер - экстремальная оптимизация


демонстрация передачи аргументов cdecl-функциям через однократно выделяемый блок памяти


Очень похоже на адресацию локальных переменных, но это все-таки не переменные, а аргументы. Точнее, локальные переменные, лежавшие на самой вершине стека и с точки зрения вызываемой функции выглядевшие

как аргументы. Локальные переменные (если они есть) располагаются ниже их.

То есть, если мы резервируем 10h байт под все аргументы, то первый слева аргумент должен помещаться в ячейку [EBP-10h], второй — в [EBP-0Ch] и так далее. Главное не перепутать порядок засылки аргументов. По соглашению cdecl переменные передаются справа налево, следовательно, в момент вызова функции на вершине стека лежит крайний левый аргумент, а под ним — все остальные.

Выигрыш в скорости на самом деле очень значительный, а небольшое "раздутие" кода за счет отказа от инструкции PUSH это не такая уж значительная проблема.



Содержание раздела