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:
Další jádro zaregistrovat číslo (NCRN) je nastavena na r0.
Zaregistruje VFP jsou označeny jako volné.
Další skládaný Argument adresa (NSAA) je nastavena na aktuální SP.
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:
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.
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ů.
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:
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ů.
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.
Pokud argument vyžaduje 8-byte zarovnání, NCRN zaokrouhleno nahoru na nejbližší číslo sudé registru.
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é.
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.
Pokud argument vyžaduje 8-byte zarovnání, NSAA zaokrouhleno nahoru na další adresu zarovnanými 8-byte.
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++