Freigeben über


Springen zu Bezeichnungen in der Inlineassembly

Microsoft-spezifisch

Wie eine gewöhnliche C- oder C++-Bezeichnung hat eine Bezeichnung in einem __asm-Block Raum in der Funktion, in der er definiert wurde (nicht nur im Block). Sowohl Assemblyanweisungen als auch goto-Anweisungen können zu den Bezeichnungen innerhalb oder außerhalb des __asm-Blocks springen.

Bei Bezeichnungen, die in __asm-Blöcken definiert sind, wird die Groß-/Kleinschreibung nicht beachtet. goto-Anweisungen und Assemblyanweisungen können gleichermaßen ohne Berücksichtigung der Groß-/Kleinschreibung auf diese Bezeichnungen verweisen. Bei C- und C++-Bezeichnungen wird die Groß-/Kleinschreibung nur dann beachtet, wenn sie von goto-Anweisungen verwendet werden. Assemblyanweisungen können ohne Berücksichtigung der Groß-/Kleinschreibung zu einer C- oder C++-Bezeichnung wechseln.

Der folgende Code zeigt alle Permutationen:

void func( void )
{
   goto C_Dest;  /* Legal: correct case   */
   goto c_dest;  /* Error: incorrect case */

   goto A_Dest;  /* Legal: correct case   */
   goto a_dest;  /* Legal: incorrect case */

   __asm
   {
      jmp C_Dest ; Legal: correct case
      jmp c_dest ; Legal: incorrect case

      jmp A_Dest ; Legal: correct case
      jmp a_dest ; Legal: incorrect case

      a_dest:    ; __asm label
   }

   C_Dest:       /* C label */ 
   return;
}
int main()
{
}

Verwenden Sie C-Bibliotheksfunktionsnamen nicht als Bezeichnungen in __asm-Blöcken. Beispielsweise können es Sie reizen, exit als Bezeichnung wie folgt zu verwenden:

; BAD TECHNIQUE: using library function name as label
jne exit
   .
   .
   .
exit:
   ; More __asm code follows

Da exit der Name der C-Bibliotheksfunktion ist, kann dieser Code einen Sprung zur exit-Funktion statt an die gewünschte Position auslösen.

Wie in MASM-Programmen dient das Dollar-Symbol ($) als Zähler der aktuellen Position. Es handelt sich um eine Bezeichnung für die Anweisung, die gerade assembliert wird. In __asm-Blöcken ist die wichtigste Verwendung, lange bedingte Sprünge auszuführen:

jne $+5 ; next instruction is 5 bytes long
jmp farlabel
; $+5
   .
   .
   .
farlabel:

END Microsoft-spezifisch

Siehe auch

Referenz

Inlineassembler