大域変数(グローバル変数 グローバルフィールド)を使ってみます。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
!
// アセンブリマニフェスト
.assembly x {}
 
// 大域変数の宣言
// 大域変数でstaticを省略するとアセンブル時に警告が出て自動的にstatic扱いになります。
.field static string str1
 
// エントリポイントとなる関数
.method static void main()
{
    // エントリポイントの宣言
    .entrypoint
 
    // 大域変数str1に文字列を格納
        ldstr    "deep blue morocco" // 文字列をスタックにpush
    stsfld    str1 // スタックからpopして大域変数str1に格納 - staticフィールドへの格納なのでstsfld。stfldでなく。
 
    // 大域変数str1の内容を標準出力に出力
        ldsfld    str1 // 大域変数str1をスタックにpush - staticフィールドからの読み込みなのでldsfld
    call    void class [mscorlib]System.Console::WriteLine(string) // 出力
 
    ret
}

実行結果:

deep blue morocco

大域変数の初期化について

大域変数は自動的に0で初期化されます。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
!
// アセンブリマニフェスト
.assembly x {}
 
// 大域変数の宣言
.field static int32 x
 
// エントリポイントとなる関数
.method static void main()
{
    // エントリポイントの宣言
    .entrypoint
 
    // 大域変数xの内容を標準出力に出力
        ldsflda   int32 x // staticフィールドなのでldsfld。そしてint32クラスのToStringメソッドを呼び出すために、オブジェクトのアドレスをpushしたいので、ldsflda。
        call      instance string class [mscorlib]System.Int32::ToString() // int32.ToString(); 
    call      void class [mscorlib]System.Console::WriteLine(string) // 標準出力に出力
    
    ret
}

実行結果:

0

stringの場合は""になります。

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 
 
 
 
 
 
 
 
-
|
|
|
|
|
|
|
|
!
// アセンブリマニフェスト
.assembly e{}
 
// 大域変数の宣言
.field static string x
 
// エントリポイントとなる関数
.method static void main()
{
    // エントリポイントの宣言
    .entrypoint
 
    // 大域変数xの内容を標準出力に出力
        ldsfld   string x // staticフィールドなのでldsfld。
    call      void class [mscorlib]System.Console::WriteLine(string) // 標準出力に出力
    
    ret
}

実行結果:

参照


トップ 編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード 新規 一覧 単語検索 最終更新 リンク元 ヘルプ 最終更新のRSS xenowire
Last-modified: Mon, 27 Jul 2009 03:06:22 JST