Melompat ke Label di Rakitan Sebaris
Khusus Microsoft
Seperti label C atau C++ biasa, label dalam __asm
blok memiliki cakupan di seluruh fungsi tempat label didefinisikan (tidak hanya di blok). Instruksi rakitan dan goto
pernyataan dapat melompat ke label di dalam atau di luar __asm
blok.
Label yang ditentukan dalam __asm
blok tidak peka huruf besar/kecil; pernyataan goto
dan instruksi perakitan dapat merujuk ke label tersebut tanpa memperhatikan kasus. Label C dan C++ hanya peka huruf besar/kecil saat digunakan oleh goto
pernyataan. Instruksi rakitan dapat melompat ke label C atau C++ tanpa memperhatikan kasus.
Kode berikut menunjukkan semua permutasi:
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()
{
}
Jangan gunakan nama fungsi pustaka C sebagai label dalam __asm
blok. Misalnya, Anda mungkin tergoda untuk digunakan exit
sebagai label, sebagai berikut:
; BAD TECHNIQUE: using library function name as label
jne exit
.
.
.
exit:
; More __asm code follows
Karena exit adalah nama fungsi pustaka C, kode ini dapat menyebabkan lompatan ke fungsi keluar alih-alih ke lokasi yang diinginkan.
Seperti dalam program MASM, simbol dolar ($
) berfungsi sebagai penghitung lokasi saat ini. Ini adalah label untuk instruksi yang saat ini sedang dirakit. Dalam __asm
blok, penggunaan utamanya adalah membuat lompatan bersyar panjang:
jne $+5 ; next instruction is 5 bytes long
jmp farlabel ; $+5
.
.
.
farlabel:
END Khusus Microsoft