Что такое соглашение о вызовах собственного кода Windows RT на ARM?

Я не смог найти никакой документации по Windows RT для соглашения о вызовах ARM, используемого Visual Studio C ++. Microsoft использует ARM AAPCS?

Если Microsoft использует AAPCS / EABI для Windows RT на ARM, она также использует ARM в C ++ ABI (который является производным от Itanium C ++ ABI)? Может быть, даже ARM обработка исключений ABI?

Отличается ли соглашение о вызовах, используемое Windows RT в ARM, от других (встроенных) вариантов Windows ARM?

Есть ли надежный способ обнаружения Windows RT на ARM через предопределенные макросы компилятора?

Обновление: добавлен вопрос относительно C ++ ABI.

4

Решение

В отличие от Windows CE (который использует оригинальные APCS aka Old ABI), Windows RT на ARM использует EABI. Более конкретно, вариант, который использует регистры с плавающей запятой для передачи данных с плавающей запятой и 8-байтового выравнивания стека / аргумента.

Если я возьму следующую функцию:

int g(float x) {
return x;
}

и скомпилировать его с ARM-компилятором VS2012, я получаю следующую сборку:

|g| PROC
vcvt.s32.f32 s0,s0
vmov        r0,s0
bx          lr
ENDP  ; |g|

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

Один из VS2008 (который может быть использован для более старых версий Windows CE) производит это:

str     lr, [sp,#-4]!
ldr     r3, =__imp___stoi
ldr     r3, [r3]
mov     lr, pc
bx      r3
ldr     pc, [sp],#4

Этот код вызывает вспомогательную функцию для выполнения преобразования.

Компилятор Windows CE, поставляемый с Windows Compact 7, поддерживает как старое соглашение о вызовах (называемое MS «cdecl»), так и EABI. Увидеть Что нового в Platform Builder 7.

РЕДАКТИРОВАТЬ: только сейчас заметил, что вы добавили вопрос о C ++. Microsoft не использует C ++ ABI в стиле Itanium, так как их реализация предшествует этому. Вы можете прочитать о реализации Microsoft в моих статьях OpenRCE (1, 2) и последующие Повторная презентация. Смотрите также оригинальное описание от дизайнера Яна Грея: PDF.

8

Другие решения

Я могу только ответить на 2й вопрос.

Отличается ли соглашение о вызовах, используемое Windows RT в ARM, от других (встроенных) вариантов Windows ARM?

Есть на самом деле три концепции, которые следует понимать. Одним из них является Стандарт вызова процедур ARM, другой это Язык ABI и третий это системный вызов условность. Вкратце Стандарт вызова процедур ARM описывает использование регистра в прологе / эпилоге. Язык ABI опишите, как передаются языковые переменные. То есть двойной, долго долго, этот указатель, dynamic_cast<>и т. д. Первый необходим для взаимодействия ассемблера с компилятором, 2й необходим для совместимости компилятора. 3й это как ОС звонки.

Стандарт вызова процедур ARM

apcs.txt Документ помогает понять некоторые варианты ARM. Есть 16 вариантов, основанных на четырех разных вариантах.

  1. 32-битный или 26-битный ПК — все версии после 2000 будут использовать 32-битные.
  2. проверка предела стека — возможно, перефразированная как MMU или без MMU.
  3. с плавающей запятой — поддерживается на большинстве процессоров примерно после 2005 года.
  4. Re-entrant против non-re-entrant — чистый выбор программного обеспечения; общие библиотеки?

Таким образом, хотя существует 16 теоретических вариантов, для современных систем, использующих MMU, их всего два. Debian ARM hard float Вики дают информацию о том, что некоторые дистрибутивы Linux / gcc прошли. Я думаю, что Window RT использует жесткий поплавок поскольку они не хотели бы платить цену производительности за поддержку устаревшего оборудования. Наконец, трудно думать, что общая библиотека или же DLL поддержка не будет присутствовать в Window RT. Итак Стандарт вызова процедур ARM кажется идентичным Linux с плавающей точкой ABI.

‘C / C ++’ ABI

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

OABI / EABI

Встроенный ARM Вики дает некоторую информацию по этому стандарту. ОС, использующая MMU, будет использовать некоторые вызовы для перехода из пользовательский режим в режим системы. Как правило, это библиотека только функции и не являются частью компилятора. Тем не менее, вы можете найти некоторые системы ARM, которые используют OABI условность. Поскольку Microsoft опаздывает на игру ARM, они либо будут использовать EABI или изобрел что-то новое. Например, позвонив malloc() с gcc linux hard-float Компилятор не будет работать, так как системные вызовы будут совершенно другими. Как правило, вам придется скомпилировать с -nostdlib и придумать свой C-библиотека.

Я немного погуглил, чтобы найти особенности Visual C ++.

Итак, чтобы ответить на ваши 2й вопрос, есть много компиляторов / систем, которые будут генерировать аналогичные пролог / эпилог. Если Visual C ++ использует AAPCS, тогда он может взаимодействовать с другими AAPCS компиляторы. Возможно, вам придется создать обычай библиотеки, чтобы получить другой компилятор для вызова Windows RT системные вызовы. Другие вопросы должно быть ответил в мануале.

Редактировать: GCC ARM -Mabi выбирает ABI. aapcs-линукс является AAPCS / EABI, АРС-гну это OABI определяющий пролог / эпилог и сопоставления аргументов. Конфигурация компилятора: выберите целевую ОС и инструкцию / бэкэнд / тип процессора; поэтому у нас есть компиляторы с разными именами, как arm-linux-eabi-gcc, arm-linux-gnueabi-gcc` и др.

3