本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[MSC]データをコードセグメントに確保する方法

文書番号: 402443

最終更新日: 2004/04/27


この資料は以下の製品について記述したものです。


概要

この資料は、データをコードセグメントに確保する一つの方法を紹介したものです。

詳細

__based と __segname 2つのキーワードにより、データをコードセグメントに確
保できます。
データへのアクセス時には、__segname で指定したセグメントが結合されます。
<例 1-1> は、「_CODE セグメントに属する int 型の変数 data1 」の宣言です。 <例 1-2> は、「_CODE セグメントに属する 文字列 data2 」の宣言です。
このように宣言した変数へのポインタや、ポインタそのものをコードセグメントに
確保する際には、十分に注意する必要があります。
<例 2-1> は、「"_CODE セグメントに属する int 型の変数" への 16bit のポイン タ ptr1 」の宣言です。
<例 2-2> は、「"_CODE セグメントに属する int 型の変数 data1" への 16bit のポインタ ptr1 」の宣言です。
この場合、重要なのは、ポインタ (ptr1) がどこに確保されているか(データセグメ ントに確保されます)ではなく、このポインタを伴う全ての処理において _CODE
セグメントが (演算の有効なアドレスとして) 使用されることです。
<例 3-1> は、「_CODE セグメントに属する"int 型へのポインタ"」の宣言です。 この場合、ポインタそのものがコードセグメントに確保される事に意味があり、
ポインタがどこに確保されている変数を参照しているかは重要でありません。
どちらもコードセグメントに置く場合、ポインタの宣言は <例 3-2> です。
  <例 1-1> int   __based(__segname("_CODE")) data1;
  <例 1-2> char  __based(__segname("_CODE")) data2[] = "code-based data";
  <例 2-1> int   __based(__segname("_CODE")) *ptr1;
  <例 2-2> int   __based(__segname("_CODE")) *ptr2=&data1;
  <例 3-1> int * __based(__segname("_CODE")) ptr2;
  <例 3-2> int   __based(__segname("_CODE")) *  __based(__segname("_CODE"))
                                                                 ptr3=&data1;
以下のサンプルのアセンブルリスト、マップファイルもご参照ください。

サンプルプログラム

  // test.c
  int   __based(__segname("_DATA")) ddata1 =10;
  int   __based(__segname("_CODE")) dcode2 =20;
  int   __based(__segname("_DATA")) *pdata1 =&ddata1;
  int   __based(__segname("_CODE")) *pcode2 =&dcode2;
  int * __based(__segname("_CODE"))  pcode3;
  int   __based(__segname("_CODE")) * __based(__segname("_CODE")) pcode4
  =&dcode2;
  int *p5;
  void main()
  {
    int i=5, j=6;
     pcode3 = &i;
     p5 = &j;
    *pdata1 = 10;
    *pcode2 = 20;
    *pcode3 = 30;
    *pcode4 = 40;
    *p5 = 50;
  }

詳細

  • Visual C++ は、米国 Microsoft Corporation の商標です。

Keywords: C7 KBHOWTO KB402443
Technology: kbAudDeveloper kbCCompPDS600DOS kbCCompSearch kbVCsearch kbZNotKeyword3 kbZNotKeyword8

inserted by FC2 system