タグ

ブックマーク / 7shi.hateblo.jp (2)

  • メモリ書き込み構文 - 七誌の開発日記

    対象環境を限定できる場合、バイト配列にリトルエンディアンで32bit値を書き込むときに、私は以下のように書いていました。 char buf[32]; *(int *)&buf[6] = 0x12345678; 非常に分かりにくいとご指摘を受けて色々と変形しましたが、どれもしっくり来ません。 ポインタ演算 *(int *)(buf + 6) = 0x12345678; 記述を分割 int *p = (int *)&buf[6]; *p = 0x12345678; アドレスをポインタで表現しているため、キャストに惑わされてメモリ操作のイメージが湧きにくいのではないかと思いました。そこで敢えて即値だけを使い、理屈抜きで基構文として覚えてもらおうという趣旨のスライドを作ってみました。 アセンブリ言語 まずアセンブリ言語でメモリに書き込むコードを提示します。 MOV BYTE PTR[0x0000

    メモリ書き込み構文 - 七誌の開発日記
  • void *とintptr_t - 七誌の開発日記

    今まで何度かvoid *の説明を求められましたが、なかなか納得してもらえませんでした。説明を工夫するだけでは限界があると感じたので、別の方法でどうにかならないかを考えてみました。 前回の記事の延長線上で説明します。サンプルコードを再掲します。 mov byte ptr [0x00000001], 0x12 mov word ptr [0x00000004], 0xfeca mov dword ptr [0x0000000a], 0xefbeadde これを機械的にC言語に書き換えます。 *(char *)0x00000001 = 0x12; *(short *)0x00000004 = 0xfeca; *(long *)0x0000000a = 0xefbeadde; これを提示した意図は、ポインタの意味に深入りしないで、出発点になる基構文を覚えてもらおうということです。 レジスタ アド

    void *とintptr_t - 七誌の開発日記
  • 1