Ассемблерные извращения - натягиваем стек


Повторное использование кадра стека


При входе внутрь функции, большое количество локальных переменных инициализируется константами или значениями, инвариантными по отношению к самой функции (т.е. другими переменными, как правило, глобальными). Причем инициализация обычно осуществляется командой MOV, а для обслуживания строковых переменных приходится прибегать к REP MOVSB. Все это медленно, громоздко и непроизводительно.

А почему бы не подготовить кадр стека еще на стадии трансляции?! В грубом приближении это будет выглядеть так:

 

.code

       MOV EBP, ESP

       MOV ESP, offset func_arg

       JMP my_func

       MOV ESP, EBP

       …

my_func:

       MOV EBP,ESP

       SUB ESP, offset func_locals - offset return_address

       …

       …

       …

       MOV ESP,EBP

       RETN

 

.data

func_locals:

       var_1  DB     66h

       var_2  DD     offset globalFlag

       var_s  DB     "hello",0

       var_x  DD     0

       var_y  DD     0

return_address:

       DD 00h

func_args:

       DD 696h, 999h, 669h




Начало  Назад  Вперед