Это:
Int main() {
subr2(subr);
}
Int subr2(Int() myfn) {
return myfn();
}
Int subr() {
return 1;
}
Будет (без какой-либо оптимизации и при условии, что соглашение о вызовах не ужасно) станет:
main:
mov eax, subr
call subr2
ret
subr2:
call eax
ret
subr:
mov eax,1
ret
С оптимизацией;сначала вы должны вставить subr2()
в main()
, чтобы получить это:
Int main() {
temp = subr;
return temp();
}
Int subr() {
return 1;
}
Затем вы бы сделали "постоянное распространение", чтобы получить это:
Int main() {
return subr();
}
Int subr() {
return 1;
}
Затемвы бы вставили subr()
в main()
, чтобы получить это:
Int main() {
return 1;
}
Затем вы получите следующее:
main:
mov eax,1
ret
Обратите внимание, что main()
это простонормальная функция.Обычно есть стартовый код, который компоновщик вставляет в исполняемый файл, который инициализирует вещи (стандартная библиотека, куча и т. Д.), Вызывает main()
, а затем выполняет exit()
, если main()
возвращает.