Bagikan melalui


Mengakses Data C atau C++ di Blok __asm

Khusus Microsoft

Kenyamanan besar rakitan sebaris adalah kemampuan untuk merujuk ke variabel C atau C++ berdasarkan nama. Blok __asm dapat merujuk ke simbol apa pun, termasuk nama variabel, yang berada dalam cakupan tempat blok muncul. Misalnya, jika variabel var C berada dalam cakupan, instruksi

__asm mov eax, var

menyimpan nilai var dalam EAX.

Jika anggota kelas, struktur, atau serikat memiliki nama unik __asm , blok hanya dapat merujuknya menggunakan nama anggota, tanpa menentukan variabel atau typedef nama sebelum operator periode (.). Namun, jika nama anggota tidak unik, Anda harus menempatkan variabel atau typedef nama segera sebelum operator periode. Misalnya, jenis struktur dalam contoh berbagi same_name berikut sebagai nama anggota mereka:.

Jika Anda mendeklarasikan variabel dengan jenis

struct first_type hal;
struct second_type oat;

semua referensi ke anggota same_name harus menggunakan nama variabel karena same_name tidak unik. Tetapi anggota weasel memiliki nama yang unik, sehingga Anda hanya dapat merujuknya menggunakan nama anggotanya:

// InlineAssembler_Accessing_C_asm_Blocks.cpp
// processor: x86
#include <stdio.h>
struct first_type
{
   char *weasel;
   int same_name;
};

struct second_type
{
   int wonton;
   long same_name;
};

int main()
{
   struct first_type hal;
   struct second_type oat;

   __asm
   {
      lea ebx, hal
      mov ecx, [ebx]hal.same_name ; Must use 'hal'
      mov esi, [ebx].weasel       ; Can omit 'hal'
   }
   return 0;
}

Perhatikan bahwa menghilangkan nama variabel hanyalah kenyamanan pengkodian. Instruksi rakitan yang sama dihasilkan apakah nama variabel ada atau tidak.

Anda dapat mengakses anggota data di C++ tanpa memperhatikan pembatasan akses. Namun, Anda tidak dapat memanggil fungsi anggota.

END Khusus Microsoft

Baca juga

Menggunakan C atau C++ di Blok __asm