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

Siehe auch

Verwenden von C oder C++ in __asm-Blöcken