Перейти к содержанию
    

Соглашения по регистрам

В принципе, любой компилятор C для любого процессора должен при входе в функцию сохранить в стеке те регистры, которые используются в этой функции. Или переключиться на другой набор регистров.

Надеюсь, Вы понимаете, что это зависит от используемого соглашения о вызовах?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Надеюсь, Вы понимаете, что это зависит от используемого соглашения о вызовах?

Я считаю, что программист может об этом не думать при создании программы, разве что для расширения кругозора.

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

__asm void HardFault_Handler(void) {
  TST LR, #4 
  ITE EQ 
  MRSEQ R0, MSP            ; Main Stack was used, put MSP in R0
  MRSNE R0, PSP            ; Process Stack was used, put PSP in R0
  LDR R0,[R0, #24]        ; Get stacked PC from stack
  B .
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Просто, где это сказано? Где написано, что эти соглашения действуют для gcc с ключами "по умолчанию".

Поиск чертырех букв APCS - абревиатуры названия на сайте gnu ничего не даёт (только как часть имени ключа).

Ленивый поток ассоциаций…

APCS/соглашение о вызовах — часть EABI.

arm-*-eabi-gcc работает по eabi

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для примера, как выглядит соответствующая глава документации (цитата НЕ из GCC):

9.3 Calling Convention

In order to keep the binary compatibility with gcc and vc, ucc conforms to the calling convention of these compilers.

(1) When calling a function, the actual parameters will be pushed onto stack from right to left. The caller will pop the parameters.

(2) preserve registers:EBX, ESI and EDI which will be saved by the callee.

scratch registers:EAX, ECX and EDX which will be saved by the caller.

(3) function return value:

if the return value is integer type,EAX holds the return value.

if the return value is floating point type,ST(0) holds the return value.

if the return value is struct/union type in size 1, 2 or 4, EAX holds the return value.

if the return value is struct/union type in size 8, (EAX, EDX) holds the return value.

if the return value is struct/union type in other size, the function’s first parameter is implicit

which is the address of the function return value’s receiver, the function’s return type will be void.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уже указывали... Это документ фирмы под названием ARM Ltd, с гарантией на этом документе базируется компилятор KEIL фирмы ARM Ltd. Если GCC делали применяя этот документ, инфомация исчерпывающая. Просто явного указания на то, что gcc основывается на этом документе, нигде нет.

 

ps: всё, завязываю. Просьба тему закрыть.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...