В стандарте C нет обязательного порядка, в котором должны оцениваться аргументы функций.Это полностью зависит от реализации / ABI.
Если вы используете вездесущий x86-32 с переменной функцией, такой как printf
, вы почти наверняка используете соглашение о вызовах cdecl
, в котором аргументы выдвигаютсясправа налево.Это означает, что ассемблерный код рядом с сайтом вызовов для printf
, скорее всего, будет выглядеть примерно так (псевдо-ассемблерный код):
push @s
call _dernier
push <ret val from _dernier>
push @s
push @s
call _debut
push <ret val from _debut>
push @format_string
call _printf
Обратите внимание, однако, что даже с cdecl
соглашением о вызовах вседиктуется порядок, в котором должны быть выдвинуты аргументы.Они по-прежнему могут оцениваться в любом порядке, если они помещаются в стек справа налево;вам нужно посмотреть на сгенерированный код сборки из вашего собственного компилятора, чтобы точно знать.