2014-02-05 3 views
1

Я читаю о реализации PIC на MIPS на Linux here. В нем говорится:

Глобальный указатель, который хранится в регистре $ gp (aka $ 28), является зарегистрированным регистром.

Wikipedia article about MIPS говорит то же самое.

Однако в соответствии с ними, когда в функциональном прологе используется директива .cpload, она сбрасывает предыдущее значение $ gp, не сохраняя его в первую очередь. Когда используется .cprestore, он сохраняет текущий $ gp в стек стека, в отличие от значения $ gp, которое было там при входе функции. То же самое касается эффекта .cprestore имеет на jal/jalr: он восстанавливает $ gp после возвращения вызываемого абонента - при условии, что вызываемая сторона могла его сбивать.

И, наконец, в функциональном эпилоге нет ничего о $ gp.

В целом, это не звучит как зарегистрированный мной реестр. Звучит как реестр, сохраненный для звонящего. Что я не понимаю здесь?

ответ

0

Программы Linux на MIPS могут быть скомпилированы как pic или нет. Если они скомпилированы как pic, тогда они должны использовать «abicalls», и его поведение немного отличается от поведения в no-abicalls.

Из «раздела переместимого пролога функции» в «SYSTEM V Application Binary Interface - MIPS процессора Дополнение 3-е издание» можно привести:

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

Код на следующем рисунке иллюстрирует пролог функции, не зависящий от позиции. _gp_disp представляет смещение между началом функции и глобальной таблицей смещения.

name: 
    la gp, _gp_disp 
    addu gp, gp, t9 
    addiu sp, sp, –64 
    sw gp, 32(sp) 

Таким образом, в целом, если вы используете -mabicalls затем gp рассчитывается в начале всех функций, требующих глобальных символов (с некоторыми исключениями), и, кроме того любой код (ABI или нет), что вызывает Код abi гарантирует, что адрес вызываемой функции сохраняется в t9.

+0

Итак, в основном, Linux/MIPS ABI отказывается от предложенного вендором соглашения :) Классный. –

Смежные вопросы