Заставить gcc передать параметры в стек - PullRequest
6 голосов
/ 09 января 2011

Есть ли способ заставить gcc передать параметры функции в стеке?

Я не хочу использовать регистры для передачи параметров.

Обновление: я использую arm-gcc из CodeSourcery

Ответы [ 3 ]

2 голосов
/ 09 января 2011

Вы можете попробовать обернуть параметры в структуру;например, если ваша функция int calc_my_sum(int x, int y) {return x+y;}, вы можете изменить ее следующим образом (безобразно):

struct my_x_y {
    int x, y;
    my_x_y(): x(0), y(0) {} // a non-trivial constructor to make the type non-POD
};

int calc_my_sum(my_x_y x_and_y) {
    // passing non-POD object by value forces to use the stack
    return x_and_y.x + x_and_y.y;
}

В качестве альтернативы, вы можете просто добавить 4 фиктивных параметра, чтобы использовать регистры, чтобы другие параметры использовали стек:

struct force_stack_usage {
    int dummy0, dummy1, dummy2, dummy3;
}

int calc_my_sum(force_stack_usage, int x, int y) {
    return x + y;
}
0 голосов
/ 25 марта 2012

Где хранить локальную переменную, зависит от того, как вы будете ее использовать.Если вам нужно получить адрес локальной переменной, локальная переменная может храниться только в стеке.Поэтому, когда вы передаете подпрограмме указатель, этот параметр будет передаваться через стек.

0 голосов
/ 09 января 2011

Согласно: http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042d/IHI0042D_aapcs.pdf

Первые четыре регистра r0-r3 (a1-a4) используются для передачи значений аргумента в подпрограмму и для возврата значения результата из функции.Они также могут использоваться для хранения промежуточных значений внутри подпрограммы (но, как правило, только между вызовами подпрограммы).

В ARM нет других соглашений о вызовах, кроме используемых по умолчанию, которые я знаюиз.И вот почему:

  1. Зачем вам это нужно?Ваша функция не будет вызываться в скомпилированном виде другими функциями, что создает беспорядок совместимости.
  2. Ваши вызовы системных функций, которые соответствуют ABI, не будут работать, если компилятор не сможет различить соглашения о вызовах.Теперь я знаю, что в прошлом существовали разные соглашения о вызовах для x86-32 , но обратите внимание, что x64 проще (AMD64 по сравнению с тем, что делала Microsoft).Почему при разработке соглашения о вызовах ARM вы позволили бы так много различных соглашений о вызовах?Это создает беспорядок совместимости.
...