説明

メモリブロックのコピーを行います。

配列の内容をコピーする時はArray.CopyTo()などを使用するので、cpblkって用途不明・・・。

書式

 cpblk 


手順

  1. コピー先をpush
  2. コピー元をpush
  3. コピーするバイト数をpush
  4. cpblk

Encoding...GetBytes()を使わずcpblkを使ってstringをunsigned int8(byte)配列に無理やりコピー

すべてを展開すべてを収束
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
!
.assembly test{}
 
.method static void Main()
{
        .entrypoint
 
        .locals( string moo, unsigned int8[] baa )
 
        // moo = "I see a ladybug Hello lady ladybug";
        ldstr "I see a ladybug Hello lady ladybug"
    stloc moo
 
        // baa = new byte[ 20 ];
            ldc.i4 20
        newarr unsigned int8
    stloc baa
 
        // System.Console.WriteLine( System.BitConverter.ToString( baa ) );
            ldloc baa
        call string [mscorlib]System.BitConverter::ToString( unsigned int8[] )
    call void class [mscorlib]System.Console::WriteLine( string )
 
        // memcpy( baa, moo, 30 );
        ldloc baa         ldloc moo         ldc.i4 30     cpblk
 
        // System.Console.WriteLine( System.BitConverter.ToString( baa ) );
            ldloc baa
        call string [mscorlib]System.BitConverter::ToString( unsigned int8[] )
    call void class [mscorlib]System.Console::WriteLine( string )
 
    ret
}

実行結果
24〜28行目による出力

 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00

baaは要素数20のunsigned int8(byte)配列なので、20バイト分の16進文字列となっています。

37〜41行目による出力

 49-00-20-00-73-00-65-00-65-00-20-00-61-00-20-00-6C-00-00-00-00-00-00-00-00-00-00
 -00-00-00-00-00-00-00-00

コピーするバイト数として指定したのは30バイトですが、Unicodeで「I see a l」までしか格納されていません。
またbaaの要素数が20から35に増えました。

詳しく調べていませんが、mooの中の文字列だけでなく、stringオブジェクトとしての情報までコピーされたため、
baaの内容が破壊されたのかも。

参照


トップ 編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード 新規 一覧 単語検索 最終更新 ヘルプ 最終更新のRSS xenowire
Last-modified: 2018-01-25 (木) 15:09:01