Обычно платформы, где ABI использует регистры для передачи аргументов, переключаются на другое соглашение о вызовах для функций с переменными числами, при котором все передается в стеке. Вот почему стандарт C назначил неопределенное поведение для вызова функции с переменными параметрами без прототипа; без прототипа на таких платформах компилятор сгенерирует неверный вызов.
Следует отметить, что некоторые платформы используют более сложные (я бы сказал, бесполезно сложные) методы передачи аргументов в функции с переменными числами, такие как создание своего рода связанного списка и передача скрытого указателя на этот список, реализация которого va_start
тогда как-то способен получить. Как программист, вы должны просто относиться ко всему stdarg.h
как к черному ящику, который делает то, что ожидается, и молиться, чтобы вам никогда не приходилось видеть мрачные детали некоторых из уродливых реализаций ...