Springen zu Bezeichnungen in der Inlineassembly

Microsoft-spezifisch

Wie bei einer normalen C- oder C++-Bezeichnung verfügt eine Bezeichnung in einem __asm Block über einen Bereich in der gesamten Funktion, in der sie definiert ist (nicht nur im Block). Sowohl Assemblyanweisungen als goto auch Anweisungen können zu Beschriftungen innerhalb oder außerhalb des __asm Blocks springen.

Bei Bezeichnungen, die in __asm Blöcken definiert sind, wird die Groß-/Kleinschreibung nicht beachtet. Sowohl Anweisungen als auch goto Assemblyanweisungen können auf diese Bezeichnungen ohne Beachtung der Groß-/Kleinschreibung verweisen. Bei C- und C++-Bezeichnungen wird die Groß-/Kleinschreibung nur beachtet, wenn sie von goto Anweisungen verwendet wird. Assemblyanweisungen können ohne Beachtung der Groß-/Kleinschreibung zu einer C- oder C++-Bezeichnung springen.

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 keine C-Bibliotheksfunktionsnamen als Bezeichnungen in __asm Blöcken. Sie können z. B. versucht sein, wie folgt als Bezeichnung zu verwenden exit :

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

Da exit der Name einer C-Bibliotheksfunktion ist, kann dieser Code einen Sprung zur Ausgangsfunktion anstelle des gewünschten Speicherorts verursachen.

Wie bei MASM-Programmen dient das Dollarsymbol ($) als aktueller Positionszähler. Es handelt sich um eine Beschriftung für die Anweisung, die gerade zusammengestellt wird. In __asm Blöcken besteht ihre Standard darin, lange bedingte Sprünge vorzunehmen:

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

Ende Microsoft-spezifisch

Siehe auch

Inlineassembler