Verwenden von Operatoren in __asm-Blöcken
Microsoft-spezifisch
Ein __asm
Block kann keine C- oder C++-spezifischen Operatoren verwenden, z. B. den << Operator. Operatoren, die von C und MASM, z. B. dem *-Operator, gemeinsam genutzt werden, werden jedoch als Assemblysprachenoperatoren interpretiert. Außerhalb eines __asm
Blocks werden z. B. eckige Klammern ([ ]) als eingeschlossene Arrayunterstellungen interpretiert, die C automatisch auf die Größe eines Elements im Array skaliert. Innerhalb eines Blocks werden sie als MASM-Indexoperator angesehen, der einen nicht skalierten Byte-Offset von einem Beliebigen Datenobjekt oder einer __asm
Beschriftung (nicht nur ein Array) liefert. Der folgende Code veranschaulicht den Unterschied:
int array[10];
__asm mov array[6], bx ; Store BX at array+6 (not scaled)
array[6] = 0; /* Store 0 at array+24 (scaled) */
Der erste Verweis, auf array
den verwiesen wird, ist nicht skaliert, aber die zweite ist. Beachten Sie, dass Sie den TYPE-Operator verwenden können, um die Skalierung basierend auf einer Konstante zu erzielen. Beispielsweise sind die folgenden Anweisungen äquivalent:
__asm mov array[6 * TYPE int], 0 ; Store 0 at array + 24
array[6] = 0; /* Store 0 at array + 24 */
Ende Microsoft-spezifisch