varargs работает в мипс - PullRequest
       13

varargs работает в мипс

1 голос
/ 08 марта 2011

Согласно mips abi, вызывающая сторона помещает первые несколько аргументов в GPR для производительности и не помещает эти аргументы в кадр стека. но когда я использую varargs api (stdarg.h) для определения функции с переменным списком аргументов, например, void func (int type, ...) ;, API работает.

Я обнаружил, что stdarg.h apis ищет только аргументы в стеке, Если компилятор вставляет только первые несколько аргументов в GPR, почему работает stdarg.h? я что-то упустил из-за ABI?

1 Ответ

2 голосов
/ 14 марта 2011

Условные обозначения для функций вариации описаны в MIPS ELF ABI , стр. 3-46.В основном, когда вызываемая функция является переменной (ее объявленный список аргументов заканчивается на '...'), тогда компилятор добавляет некоторый код, который записывает первые аргументы (переданные в регистрах) в стек.Кадр стека всегда включает некоторое пространство для первых четырех аргументов (точнее, для четырех слов, которые передаются в регистрах от $4 до $7).Таким образом, вызывающей стороне не нужно знать, была ли функция переменной или нет (за исключением, возможно, аргументов с плавающей запятой; в любом случае, лучше, чтобы и вызывающая сторона, и вызываемая сторона видели и использовали один и тот же прототип).

Если вы скомпилируете функцию с переменным числом C и посмотрите на созданную сборку, в начале функций вы увидите строки типа:

sw      $5,52($sp)
sw      $6,56($sp)
sw      $7,60($sp)

, которые соответствуют этому процессу аргумент в стек.

...