Bagikan melalui


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

Lihat juga

Perakitan Sebaris