分享方式:


在 __asm 區塊中存取 C 或 C++ 資料

Microsoft 特定的

內嵌組譯碼的方便之處在於能夠依名稱參考 C 或 C++ 變數。 __asm 區塊可以在出現該區塊的範圍內參考任何符號,包括變數名稱。 例如,如果 C 變數 var 在範圍之內,指令

__asm mov eax, var

會將 var 的值儲存在 EAX 中。

如果類別、結構或等位成員具有唯一的名稱, __asm 區塊只能使用成員名稱來參考它,而不需在句號 ( . ) 運算子之前指定變數或 typedef 名稱。 不過,如果成員名稱不是唯一的,您必須在句號運算子之前加上變數或 typedef 名稱。 例如,下列範例中的結構類型共用 same_name 做為其成員名稱。

如果您宣告的變數類型為

struct first_type hal;
struct second_type oat;

same_name 成員的所有參考都必須使用變數名稱,因為 same_name 不是唯一的。 不過,weasel 成員具有唯一的名稱,因此您可以只使用其成員名稱參考它:

// 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;
}

請注意,省略變數名稱只是為了方便撰寫程式碼。 無論變數名稱是否存在,都會產生相同的組譯碼指令。

您可以存取 C++ 的資料成員,不需要考慮存取限制。 不過,您無法呼叫成員函式。

END Microsoft 特定的

另請參閱

在 __asm 區塊中使用 C 或 C++