Sdílet prostřednictvím


Overview of ARM ABI Conventions

Binární rozhraní aplikace (ABI) pro kód zkompilovaný pro systém Windows na ARM procesory je založena na standardní EABI ARM.Tento článek popisuje klíčové rozdíly mezi systému Windows na ARM a standardní.Další informace o standardní EABI ARM, naleznete v části aplikace binární rozhraní (ABI) pro architekturu arm..

Základní požadavky

Windows na ARM předpokládá, zda je spuštěna na architekturou ARMv7 po celou dobu.S plovoucí desetinnou čárkou podporu ve formě VFPv3 D32 nebo vyšší musí být k dispozici v hardwaru.VFP musí podporovat jednoduchá přesnost a dvojitou přesností s plovoucí desetinnou čárkou v hardwaru.Windows runtime nepodporuje emulaci s plovoucí desetinnou čárkou Chcete-li povolit provozovaného na jiný VFP hardwaru.

Rozšířená podpora SIMD rozšíření (NEÓNOVÁ) – jedná se o celé číslo a operace s plovoucí desetinnou čárkou – musí být k dispozici také v hardwaru.Je k dispozici žádné podporu runtime pro emulaci.

Podpora dělit celé číslo (UDIV/SDIV) je důrazně doporučeno, ale není nutné.Platformy, které nemají podporu dělit celé číslo může vést k snížení výkonu vzhledem k tomu, že tyto operace musí být zachycena a případně opatřit.

Endianness

Windows na ARM provede v malé endian režimu.Kompilátor Visual C++ a Windows runtime očekávat malé endian dat po celou dobu.Ačkoli sadu instrukcí SETEND v pokynech k ARM části architektura (ISA) umožňuje i uživatel – režim kódu, chcete-li změnit aktuální endianness, učiníte tak se nedoporučuje vzhledem k tomu, že je nebezpečné pro aplikaci.Pokud je výjimka generované v režimu big endian chování nepředvídatelné a může vést chybě aplikace v uživatelském režimu nebo kontroly chyb v režimu jádra.

Zarovnání

Zarovnání chyb stále může být generována v některých situacích přistupuje transparentně, i když systém Windows XP umožňuje ARM hardwaru pro zpracování chybně zarovnaných celé číslo.Postupujte podle těchto pravidel pro zarovnání:

  • Poloviční slovo velikosti (16 bitů) a načte slovo velikosti celé číslo (32bitová verze) a úložiště nemusí být zarovnáno.Hardware je zpracovává účinně a transparentně.

  • Je třeba sladit s plovoucí desetinnou čárkou zatížení a úložiště.Jádro zpracovává nezarovnané zatížení a ukládá transparentně, ale s výrazné nároky.

  • Zavedení nebo uložení dvojité (LDRD/STRD) a by mělo být zarovnáno více operací (Správce logických disků/STM).Jádro zpracovává většina z nich transparentně, ale s výrazné nároky.

  • Přístup ke všem bez vyrovnávací paměti paměti musí být zarovnáno i pro přístup k celé číslo.Zajišťuje přístup ke nezarovnané způsobit chybu zarovnání.

Sada instrukcí

Nastavit pro systém Windows na ARM pokyn je přísně omezena na 2 jezdce.Všechen kód provést na této platformě je očekáván ke spuštění a zůstat v režimu jezdce po celou dobu.Pokus o přepnutí do starší verze sady instrukcí ARM může být úspěšné, ale pokud ano, může vést všechny výjimky nebo přerušení, k nimž došlo chybě aplikace v uživatelském režimu nebo kontroly chyb v režimu jádra.

Efekt straně tohoto požadavku je, že všechny ukazatele kódu musí mít nízké bit nastaven.Toto je tak, aby při načíst a vytvořit větve do prostřednictvím BLX nebo MX, procesor zůstanou v režimu jezdce a není zkuste ke spouštění kódu cíl jako 32bitový ARM pokyny.

Pokyny IT

Použití IT pokyny v kódu jezdce-2 je zakázáno s výjimkou tyto zvláštní případy:

  • Instrukce IT lze použít pouze k úpravě jedné instrukce cíl.

  • Cíl pokyn musí být instrukci 16 bitů.

  • Cíl pokyn musí být jedna z těchto:

    16bitové operační kódy

    Třída

    Omezení

    MOV, MVN

    Přesunout

    Správce prostředků! = PC VP! = PC

    LDR, B LDR [S], H LDR [S]

    Načíst z paměti

    Ale není LDR literálu formuláře

    STR STRB, STRH

    Ukládání do paměti

    PŘIDAT, ADC, RSB, SBC, SUB

    Přidat nebo odebrat

    Ale není přidat/SUB SP, SP, imm7 formuláře

    Správce prostředků! = PC Rdn! = PC Rdm! = PC

    CMP, CMN

    Porovnat

    Správce prostředků! = PC Rn! = PC

    MUL

    Násobení

    FUNKCI AUTOMATICKÉ OBNOVENÍ SYSTÉMU, DOLNÍ LIMIT, LSR, ROR

    Bit shift

    A BIC, EOR, ORR TST

    Bitová aritmetické operace

    MX

    Větev k registraci

    Správce prostředků! = PC

Přestože aktuální ARMv7 procesory nelze sestavy použití zakázaných pokyn formuláře se očekává budoucí generace.Pokud nejsou zjištěny tyto formuláře, může být jakýkoli program, který je používá ukončeno s výjimkou nedefinované instrukcí.

Pokyny SDIV/UDIV

Použití celé číslo rozdělit pokyny SDIV a UDIV je plně podporuje, dokonce i na platformách bez nativní hardwaru k jejich zpracování.Nároky na výkon za SDIV nebo UDIV dělení na mozkové A9 procesoru je přibližně 80 cykly kromě celkového času dělit 20 250 cyklů, v závislosti na vstupy.

Zaregistruje celé číslo

Procesor ARM podporuje 16 registrů celé číslo:

Registr

Těkavé?

Role

r0

Těkavé

Parametr, výsledek pomocné registr 1

R1

Těkavé

Parametr, výsledek pomocné registru 2

R2

Těkavé

Parametr, pomocné registrovat 3

R3

Těkavé

Parametr, pomocné registrovat 4

R4

Bez volatile

R5

Bez volatile

R6

Bez volatile

R7

Bez volatile

R8

Bez volatile

R9

Bez volatile

R10

Bez volatile

R11

Bez volatile

Ukazatel rámce

r 12

Těkavé

Zaregistrujte se pomocné uvnitř volání procedury

R13 (SP)

Bez volatile

Ukazatel na zásobník

R14 (LR)

Bez volatile

Zaregistrujte se odkaz

R15 (PC)

Bez volatile

Čítač programu

Podrobnosti o tom, jak použít parametr a zaregistruje návratovou hodnotu naleznete v části předávání parametr v tomto článku.

Systém Windows používá r11 pro rychlé procházení zásobníku.Další informace naleznete v části procházení zásobníku.Vzhledem k tomuto požadavku r11 musí odkazovat na nejhornější odkaz v řetězci po celou dobu.Nepoužívejte r11 pro obecné účely – váš kód nevygeneruje správný zásobníku během analýzy.

Zaregistruje VFP

Systém Windows podporuje pouze ARM variant, které mají VFPv3 D32 koprocesoru podporu.To znamená, že registrů s plovoucí desetinnou čárkou jsou vždy k dispozici a mohou být spoléhali na pro předávání parametru a že celý nastavena 32 registrů je k dispozici pro použití.Zaregistruje VFP a jejich použití je uveden v této tabulce:

Singly

Double – prvky

Quads

Těkavé?

Role

S0 s3

D0 d1

q0

Těkavé

Parametry, výsledek, scratch registru

S4 s7

d2 d3

1.

Těkavé

Parametry, pomocné registrace

s8 s.11

d5 d 4

2. čtvrtletí

Těkavé

Parametry, pomocné registrace

S12 s.15

D6 d7

3

Těkavé

Parametry, pomocné registrace

s 16 s19

D8 d9

4.

Bez volatile

S20 s23

D10 d11

Dotaz č. 5

Bez volatile

s24 s27

D12 d13

6

Bez volatile

s28 s31

D14 d15

Dotaz č. 7

Bez volatile

D16 d31

Otázka č. Dotaz 8 15

Těkavé

Následující tabulka ukazuje stav s plovoucí desetinnou čárkou a ovládací prvek zaregistrovat bitová pole (FPSCR):

Bity

Význam

Těkavé?

Role

31-28

NZCV

Těkavé

Příznaky stavu

27

QC

Těkavé

Kumulativní sytost

26

AHP

Bez volatile

Alternativní kontrolní poloviční přesnost

25

ROZLIŠUJÍCÍ NÁZEV

Bez volatile

Výchozí NaN režimu ovládací prvek

24

FZ

Bez volatile

Ovládací prvek vyprázdnit nula režim

23-22

RMode

Bez volatile

Ovládací prvek zaokrouhlení režim

21-20

Mezery

Bez volatile

Vektorové Stride, musí být vždy 0

18-16

Délka

Bez volatile

Vektorové délka, musí být vždy 0

15, 12-8

Integrované vývojové prostředí, IXE, atd.

Bez volatile

Výjimka depeše bitů povolit, musí být vždy 0

7, 4-0

IDC, IXC, atd.

Těkavé

Příznaky kumulativní výjimky

S plovoucí desetinnou čárkou výjimky

Většina ARM hardware nepodporuje IEEE s plovoucí desetinnou čárkou výjimky.Jádro systému Windows na variant procesoru, které nemají hardwarové s plovoucí desetinnou čárkou výjimky, bez upozornění zachytí výjimku a implicitně je zakáže v registru FPSCR.To zajistí normalizovaný chování napříč variant procesoru.Jinak kód vytvořené na platformě, která není zaškrtnuta možnost výjimky, které podporují obdržet neočekávané výjimky spuštěná na platformě, která nemá výjimky, které podporují.

Předávání parametrů

Pro jiné variadic funkce systému Windows na ARM ABI dodržovat ARM pravidla pro předávání parametru – to zahrnuje VFP a rozšířené SIMD rozšíření.Postupujte podle těchto pravidel postupu volání Standard pro architekturu arm., sloučeného s rozšířeními VFP.Ve výchozím nastavení je první čtyři celočíselné argumenty a až osm s plovoucí desetinnou čárkou nebo vektorové argumenty jsou předány v registrech a další argumenty jsou předávány v zásobníku.Argumenty jsou přiřazeny registry nebo zásobníku pomocí tohoto postupu:

Fáze A – inicializace

Inicializace se provádí pouze jednou před zahájením zpracování argumentu:

  1. Další jádro zaregistrovat číslo (NCRN) je nastavena na r0.

  2. Zaregistruje VFP jsou označeny jako volné.

  3. Další skládaný Argument adresa (NSAA) je nastavena na aktuální SP.

  4. Pokud je volána funkce, která vrátí výsledek v paměti, je adresa pro výsledek je umístěno do r0 a NCRN je nastavena na r1.

Fáze B – předběžného odsazení a rozšíření argumentů

Pro každý argument v seznamu se použije první odpovídající pravidlo z následujícího seznamu:

  1. Pokud je argumentem složeného typu, jejichž velikost nelze určit staticky volající i volaný, argument je zkopírovat do paměti a nahrazuje ukazatel na kopii.

  2. Pokud je argumentem bajtové nebo 16bitové poloviční word, je rozšířený nula nebo s rozšířeným úplná slova 32-bit a považován za argumentem 4 bajtů.

  3. Pokud je argumentem složený typ, velikost zaokrouhleno nahoru na nejbližší násobek 4.

Fáze C – přiřazení argumenty, které mají registrů a zásobníku

Pro každý argument v seznamu jsou tato pravidla uplatněna zase, dokud byla přidělena argument:

  1. Je-li tento argument je typu VFP a nejsou k dispozici dostatek po sobě jdoucích nepřidělené registry VFP příslušného typu, argument přidělování do posloupnosti nejnižší číslovaný takové registrů.

  2. Pokud tento argument je typu VFP, všechny zbývající volné registry jsou označeny jako nedostupná.NSAA je upraveno směrem nahoru, dokud je správně zarovnán pro typ argumentu a argument bude zkopírován do zásobníku na upravenou NSAA.NSAA se pak zvýší velikostí argumentu.

  3. Pokud argument vyžaduje 8-byte zarovnání, NCRN zaokrouhleno nahoru na nejbližší číslo sudé registru.

  4. Pokud není velikost argumentu v 32-bit slova více než r4 minus NCRN, argument zkopírován do registrů jádro, počínaje NCRN, s nejméně významné bity zabírá registry nižšími čísly.NCRN se zvýší počtem registry použité.

  5. Pokud NCRN je menší než r4 a SP rovná NSAA, argument je rozděleno mezi registry jádro a zásobníku.První část argumentu zkopírován do registrů jádro, počínaje NCRN, až do a včetně r3.Zbývající část argument bude zkopírován do zásobníku, počínaje NSAA.NCRN je nastavena na r4 a NSAA se zvýší velikostí argument minus částka předány v registrech.

  6. Pokud argument vyžaduje 8-byte zarovnání, NSAA zaokrouhleno nahoru na další adresu zarovnanými 8-byte.

  7. Argument bude zkopírován do paměti při NSAA.NSAA se zvýší velikostí argumentu.

Zaregistruje VFP nejsou použity pro funkce variadic a pravidla fáze C 1 a 2 jsou ignorovány.To znamená, že variadic funkce lze začínat volitelné push {r0-r3} k připojte registrovat argumenty, které mají libovolné další argumenty předaná volající funkcí a poté získáte přístup k seznamu celého argumentu přímo ze zásobníku.

Hodnoty typu integer, jsou vráceny v r0, volitelně rozšířeno na r1 pro 64bitové vrácené hodnoty.VFP/NEÓNOVÁ s plovoucí desetinnou čárkou nebo SIMD typ hodnoty jsou vráceny v s0, d0 nebo q0, podle potřeby.

Rámec

Zásobník musí zůstat 4 bajtů zarovnán po celou dobu a musí být 8-byte zarovnán na libovolné funkce ohraničení.Toto je nezbytné pro podporu časté používání voláno operací na proměnné 64bitové zásobníku.ARM EABI uvádí, že zásobníku je 8-byte zarovnán na libovolné veřejné rozhraní.Konzistence systému Windows na ARM ABI považovat všechny funkce předěl, který má být veřejné rozhraní.

Funkce, které mají používat ukazatel rámce – například funguje toto volání alloca nebo které dynamicky změnit ukazatel na zásobník – nutné nastavit ukazatel myši nad rámec v r11 v prologu funkce a nechat ji nezměněné až epilogu.Funkce, které nevyžadují ukazatel rámce musíte provádět všechny aktualizace zásobníku v prologu a nechejte beze změny, dokud epilogu ukazatel myši nad zásobníku.

Funkce, které přidělit 4 KB nebo více v zásobníku musí zajistit, že je v pořadí dotýkal každé stránce před poslední stránku.To zajistí, že žádný kód můžete "Přejít nad" ochrana stránky, které systém Windows používá k rozbalení zásobníku.Obvykle to provádí __chkstk pomocníka, který je předán přidělení celkové zásobníku v bajtech vydělí čtyřmi v r4 a která vrátí částku přidělení finální zásobníku v bajtech zpět do r4.

Červená zóny

Oblast 8-byte bezprostředně pod aktuální ukazatel na zásobník je vyhrazen pro analýzu a dynamické opravy.To umožňuje má být vložen pečlivě vygenerovaný kód, který ukládá 2 registry na adrese [sp #-8] a používá je dočasně pro libovolný účely.Jádro systému Windows zaručuje, že tyto 8 bajtů nedojde k přepsání, pokud dojde výjimce nebo přerušení v uživatelském režimu a režimu jádra.

Zásobníku jádra

Výchozí zásobník režimu jádra v systému Windows je tři stránky (12 KB).Dejte pozor, abyste vytvořit funkce, které mají velký zásobníku vyrovnávací paměti v režimu jádra.Přerušení může pocházet pomocí velmi malé prostor zásobníku a způsobit zásobníku tísňový kontroly chyb.

Podrobnosti C/C++

Výčty jsou typy 32bitové celé číslo, pokud alespoň jednu hodnotu ve výčtu vyžaduje 64bitové dvojité slovo úložiště.V takovém případě je výčet zvýšit na typ 64bitové celé číslo.

wchar_t je definován jako rovnocenné unsigned short, chcete-li zachovat kompatibilitu s jinými platformami.

Procházení zásobníku

Kód systému Windows je kompilována s rámec ukazatele povoleno (/Oy (vynechání ukazatele na rámec)) umožňující rychlé zásobníku procházení.Obecně platí, r11 zaregistrovat v řetězci, který je {r11, lr} odkazuje na odkaz na další pár, který určuje ukazatel na předchozí snímek v zásobníku a adresu odesílatele.Doporučujeme, aby váš kód také povolit rámec ukazatele lepší profilování a trasování.

Výjimka unwind

Zásobník unwind během zpracování výjimek je povoleno za použití unwind kódy.Unwind kódy jsou sekvenci bajtů, které jsou uloženy v sekci .xdata spustitelného souboru obrázku.Operace kódu prologu a epilogu funkce popisují abstraktní způsobem tak, aby účinky prologu funkce mohou být vráceny zpět k přípravě unwind do zásobníku volajícího.

ARM EABI určuje unwinding modelu výjimky, která používá odvíjejí kódy.Tato specifikace však není dostatečné pro unwind v systému Windows, který musí zpracovat případech, kdy je procesor uprostřed prologu nebo epilogu funkce.Další informace o systému Windows na data ARM výjimky a unwind naleznete v tématu ARM Exception Handling.

Doporučujeme, aby dynamicky generovaného kódu popsána pomocí funkce dynamické tabulky zadané ve volání RtlAddFunctionTable a související funkce, tak, aby generovaný kód se mohou účastnit zpracování výjimek.

Čítač cyklu

Procesory ARM systémem Windows jsou vyžadována pro podporu čítač cyklus, ale přímo pomocí čítač může způsobit problémy.Nechcete-li tyto problémy, použije systém Windows na ARM nedefinované opcode s žádostí o normalizovanou hodnotu čítače cyklu 64 bitů.Z C nebo C++, použijte __rdpmccntr64 vnitřní k vydávání odpovídající opcode; ze sestavení, používejte __rdpmccntr64 instrukcí.Čtení čítač cyklu trvá přibližně 60 cykly na mozkové-A9.

Čítač je true cyklu čítače, není clock; proto inventury frekvence se liší podle frekvence procesoru.Pokud chcete k měření času uplynulá hodin, použijte QueryPerformanceCounter.

Viz také

Referenční dokumentace

Běžné problémy s migrací ARM v prostředí Visual C++

Koncepty

ARM Exception Handling