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