Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Microsoft-specifieke
Over het algemeen moet u er niet van uitgaan dat een register een bepaalde waarde heeft wanneer een __asm blok begint. Registerwaarden worden niet gegarandeerd bewaard in afzonderlijke __asm blokken. Als u een blok inlinecode beëindigt en een andere code start, kunt u niet vertrouwen op de registers in het tweede blok om de waarden van het eerste blok te behouden. Een __asm blok neemt alle registerwaarden over van de normale controlestroom.
Als u de __fastcall aanroepconventie gebruikt, geeft de compiler functieargumenten door in registers in plaats van op de stack. Dit kan problemen veroorzaken in functies met __asm blokken, omdat een functie geen manier heeft om te zien in welke parameter zich in welk register bevindt. Als de functie een parameter in EAX ontvangt en onmiddellijk iets anders opslaat in EAX, gaat de oorspronkelijke parameter verloren. Bovendien moet u het ECX-register behouden in elke functie die is gedeclareerd met __fastcall.
Gebruik de __fastcall conventie niet voor functies die een __asm blok bevatten om dergelijke registerconflicten te voorkomen. Als u de __fastcall conventie globaal opgeeft met de optie /Gr compiler, declareert u elke functie met een __asm blok met __cdecl of __stdcall. (Het __cdecl kenmerk vertelt de compiler dat de C-aanroepconventie voor die functie moet worden gebruikt.) Als u niet met /Gr compileert, vermijdt u het declareren van de functie met het __fastcall kenmerk.
__asm Wanneer u assemblytaal schrijft in C/C++-functies, hoeft u de EAX-, EBX-, ECX-, EDX-, ESI- of EDI-registers niet te behouden. Bijvoorbeeld in power2. C-voorbeeld in Het schrijven van functies met Inline Assembly behoudt de power2 functie de waarde niet in het EAX-register. Het gebruik van deze registers heeft echter invloed op de codekwaliteit, omdat de register-allocator deze niet kan gebruiken om waarden in meerdere __asm blokken op te slaan. Bovendien, door EBX, ESI of EDI in inline assemblycode te gebruiken, dwingt u de compiler deze registers op te slaan en te herstellen in de functieproloog en epiloog.
Je moet andere registers behouden die je gebruikt (zoals DS, SS, SP, BP en het vlaggenregister) binnen het bereik van het __asm blok. U moet de ESP- en EBP-registers behouden, tenzij u een reden hebt om ze te wijzigen (bijvoorbeeld om te schakelen tussen stacks). Zie ook Inline Assembly Optimaliseren.
Sommige SSE-typen vereisen acht bytestackuitlijning, waardoor de compiler dynamische stack-uitlijningscode moet verzenden. De compiler onderhoudt twee frameaanwijzers om toegang te krijgen tot zowel de lokale variabelen als de functieparameters na de uitlijning. Als de compiler frame-pointerweglating (FPO) uitvoert, worden EBP en ESP gebruikt. Als de compiler geen FPO uitvoert, wordt EBX en EBP gebruikt. Als u wilt controleren of de code correct wordt uitgevoerd, wijzigt u EBX niet in asm-code als voor de functie dynamische stack-uitlijning is vereist, omdat deze de framepointer kan wijzigen. Verplaats de acht byte uitgelijnde typen uit de functie of vermijd het gebruik van EBX.
Opmerking
Als de inline-assemblycode de richtingsvlag wijzigt met behulp van de std- of CLD-instructies, moet u de vlag herstellen naar de oorspronkelijke waarde.
Microsoft-specifieke beëindigen