Aracılığıyla paylaş


__asm Bloklarını C Makroları olarak tanımlama

Microsoft'a Özgü

C makroları, kaynak kodunuz içine derleme kodu eklemek için kullanışlı bir yol sunar, ancak makro tek bir mantıksal satıra genişlediğinden ek bakım isterler. Sorunsuz makrolar oluşturmak için şu kuralları izleyin:

  • __asm Bloğu ayraç içine alın.

  • Anahtar sözcüğünü __asm her derleme yönergesinin önüne yerleştirin.

  • Eski stil C açıklamalarını (/* comment */), derleme stili açıklamalar (; comment) veya tek satırlı C açıklamaları (// comment) yerine kullanın.

Aşağıdaki örnekte basit bir makro gösterilmektedir:

#define PORTIO __asm      \
/* Port output */         \
{                         \
   __asm mov al, 2        \
   __asm mov dx, 0xD007   \
   __asm out dx, al       \
}

İlk bakışta, son üç __asm anahtar sözcük gereksiz görünüyor. Ancak makro tek bir satıra genişlediğinden bunlar gereklidir:

__asm /* Port output */ { __asm mov al, 2  __asm mov dx, 0xD007 __asm out dx, al }

Üçüncü ve dördüncü __asm anahtar sözcükler deyim ayırıcıları olarak gereklidir. Bloklarda __asm tanınan tek deyim ayırıcıları yeni satır karakteri ve __asm anahtar sözcüktür. Makro olarak tanımlanan bir blok tek bir mantıksal çizgi olduğundan, her yönergeyi ile __asmayırmanız gerekir.

Ayraçlar da gereklidir. Bunları atlarsanız, derleyici makro çağırmasının sağındaki aynı satırdaki C veya C++ deyimleriyle karıştırılabilir. Kapanış ayracı olmadan, derleyici derleme kodunun nerede durduğundan bahsedemez ve blok sonrasında __asm derleme yönergeleri olarak C veya C++ deyimlerini görür.

Noktalı virgülle (;) başlayan derleme stili açıklamalar satırın sonuna kadar devam eder. Derleyici, açıklamadan sonra mantıksal satırın sonuna kadar her şeyi yoksaydığından bu, makrolarda sorunlara neden olur. Aynı durum tek satırlı C veya C++ açıklamaları ( için de// comment geçerlidir). Hataları önlemek için, makro olarak tanımlanan bloklarda /* comment */ eski stil C açıklamalarını (__asm) kullanın.

__asm C makro olarak yazılmış bir blok bağımsız değişken alabilir. Ancak, normal bir C makros un aksine, makro __asm bir değer döndüremez. Bu nedenle bu tür makroları C veya C++ ifadelerinde kullanamazsınız.

Bu türdeki makroları ayrım gözetmeden çağırmamaya dikkat edin. Örneğin, kuralla bildirilen bir işlevde derleme dili makrosunun çağrılmasına __fastcall beklenmeyen sonuçlar neden olabilir. (Bkz. Satır İçi Derlemede Yazmaçları Kullanma ve Koruma.)

END Microsoft'a Özgü

Ayrıca bkz.

Satır İçi Assembler