ПредишенСледващото

Като цяло, в началото __asm ​​блок не трябва да се предположи, че регистърът ще има особено значение. Запиши се регистрирате стойности между различните блокове не __asm ​​гарантирана. Когато един блок завършва вграден код и започва следващия блок не трябва да се приема, че в регистрите на втория блок запазват стойностите си от първия блок. __asm ​​единица наследява стойности регистърните получени по конвенционален контрол на процеса поток.

Ако използвате конвенция за __fastcall обажда. съставител преминава аргументи на функция в регистрите вместо стека. Това може да доведе до проблеми с функции с блокове __asm. защото функцията няма начин да се определи колко параметри са подредени в регистрите. Ако параметърът функция, получени през EAX регистър и веднага записват в регистър EAX някаква друга стойност, първоначалната параметър се губи. Освен това е необходимо да се поддържа регистър ECX стойност на всяка функция, декларирана с __fastcall атрибут.

За да се избегнат подобни конфликти, регистри, не използват Конвенцията на __fastcall за функции, които съдържат блок __asm. Ако споразумение __fastcall дефинирани в световен мащаб с компилатор / параметър Gr декларират всеки функционален блок като __asm. атрибут __cdecl или __stdcall. (__cdecl атрибут указва на компилатора да се използва за тази функция се обадите конвенции на езика С) При съставяне на с / Гр не се прави, не се декларира функция с __fastcall атрибут.

При използване на __asm ​​блок да пишат код в асемблер в C / C ++ функции, не е необходимо да се запазят ценностите на EAX, EBX, ECX, EDX, ESI и EDI. Така например, в примера на раздел POWER2.C функции за писане във вградения код на асемблер функция Пауър2 не запазва стойност в регистъра на EAX. Въпреки това, използването на тези регистри се отрази на качеството на кода, защото за заделяне на регистър не може да ги използва за съхраняване на стойности между блокове __asm. Освен това, ако вграденият код на асемблер език използва регистрирате EBX, ESI и EDI, компилаторът трябва да спаси и възстановяване на стойностите на тези регистри във функцията пролог и епилог.

Необходимо е да се съхранява стойностите на регистри, използвани от други (например, DS, SS, SP, BP и регистри на флага) в единица площ __asm. Необходимо е да се съхраняване на стойности ESP и ЕВР регистри, освен ако няма конкретна причина да ги промени (смяна на комин, например). Вижте. Също раздела Оптимизиране вграденият код на асемблер.

За някои видове SSE изисква 8-байт подравняване на стека, в резултат на което компилаторът за генериране на код динамично приведе стека. За да можете да получите достъп до локалните променливи и функционални параметри, след привеждането компилаторът поддържа два показалки рамки. Ако компилаторът извършва понижаване на рамка показалеца на (FPO), тя ще се използва ЕВР и ESP регистри. Ако компилаторът не извършва FPO, че ще използва EBX регистри и ЕВР. За да се гарантира правилното изпълнение на кода, не се променят стойността на кода на регистър EBX в асемблер, ако функцията изисква динамично изравняване комин, тъй като това може да се промени показалеца на рамката. Преместване на видовете 8-байт-изравнени извън функция или да използвате регистър EBX.

Ако вграденият код на асемблер се променя посоката на флага, като се използва инструкция STD или CLD, трябва да се възстанови първоначалната стойност на този флаг.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!