SSブログ

メモリ・ダンプ・プログラム [ColdFire V2]このエントリーを含むはてなブックマーク#

1990557

マイコンのプログラムを作成するんだったら、このツールははずせないでしょう。 メモリ・ダンプを作成するプログラムをSilentCで書きました。

いきなり、プログラム

まずは、プログラムの公開。

d(char *addr){
 int i,j;
 addr&=0xFFFFFFF0;
 for(i=0;i<16;i++){
  PrHex(addr);PrStr("  ");
  for(j=0;j<16;j++){PrHexByte(addr[j]);PrChar(' ');}
  PrChar(' ');
  for(j=0;j<16;j++){
  PrChar(((addr[j]<32)||(addr[j]>=127))?'.':addr[j]);
  }
  PrStr("\r\n");SystemSleep();
  addr+=16;
 }
}

インタプリタで操作することを考えて、引数ひとつだけの関数としました。 引数で指定されたアドレスから256バイトの領域を表示します。 また、最初のアドレスは、16バイト境界から始まるようにしてあります。

使い方

この関数をmというファイルに保存して、使用します。

OK
m::d(0x00014100)
00014100  0d 0a 3c 42 4f 44 59 3e 0d 0a 3c 43 45 4e 54 45  ..<BODY>..<CENTE
00014110  52 3e 0d 0a 3c 48 31 3e 3c 46 4f 4e 54 20 73 69  R>..<H1><FONT si
00014120  7a 65 3d 22 36 22 20 66 61 63 65 3d 22 41 72 69  ze="6" face="Ari
00014130  61 6c 20 42 6c 61 63 6b 22 3e 45 2d 6d 61 69 6c  al Black">E-mail
00014140  20 73 65 6e 64 20 74 65 73 74 3c 2f 46 4f 4e 54   send test</FONT
00014150  3e 3c 2f 48 31 3e 0d 0a 3c 46 4f 52 4d 20 61 63  ></H1>..<FORM ac
00014160  74 69 6f 6e 3d 22 4d 61 69 6c 45 6e 64 2e 68 74  tion="MailEnd.ht
00014170  6d 22 3e 0d 0a 3c 49 4e 50 55 54 20 74 79 70 65  m">..<INPUT type
00014180  3d 22 74 65 78 74 22 20 73 69 7a 65 3d 22 33 30  ="text" size="30
00014190  22 20 6e 61 6d 65 3d 22 45 58 45 43 27 4d 61 69  " name="EXEC'Mai
000141a0  6e 3a 3a 6d 61 69 6e 27 22 20 76 61 6c 3d 22 22  n::main'" val=""
000141b0  3e 0d 0a 3c 49 4e 50 55 54 20 74 79 70 65 3d 22  >..<INPUT type="
000141c0  73 75 62 6d 69 74 22 20 76 61 6c 75 65 3d 22 67  submit" value="g
000141d0  6f 22 3e 0d 0a 3c 2f 46 4f 52 4d 3e 0d 0a 3c 2f  o">..</FORM>..</
000141e0  43 45 4e 54 45 52 3e 0d 0a 3c 2f 42 4f 44 59 3e  CENTER>..</BODY>
000141f0  0d 0a fc 00 01 29 53 65 74 45 6e 64 2e 68 74 6d  .....)SetEnd.htm

ファイル領域と呼ばれている箇所のダンプです。

プログラムの問題点

これで、どこでもダンプできると思っていたのですが、無理なところもあるみたいです。

OK
m::d(0)
00000000  addr not found in m

ポインタ変数に"0"を代入すると、うまく動いてくれません。 何か、特別な意味を持ってしまうようです。

OK
m::d(0x40000000)
40000000  40 00 00 01 00 00 00 00 20 00 02 00 00 00 24 00  @....... .....$.
40000010  80 01 00 00 00 00 00 00 00 40 00 0c 30 e1 00 00  .........@..0...
40000020  03 00 00 08 00 00 00 00 00 00 00 00 00 00 00 00  ................
40000030  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
40000040  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
40000050  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
40000060  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
40000070  00 00 00 00

I/Oレジスタ領域の先頭をダンプさせたら、途中で止まってしまいました。 0x40000070(IPSBAR+0x00_0070)のあたりは、Reservedとされている領域なので、未公開の何か危険なものが潜んでいたのだろうと想像します。 私の基板にはリセットスイッチを付けていないので、こうなるとパワー・オン・リセットで復帰させるしかありません。 ダンプの長さも指定できるようにした方がよかったかな。

参考文献

まだ、在庫あります。

Interface (インターフェース) 2008年 09月号 [雑誌]

Interface (インターフェース) 2008年 09月号 [雑誌]

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2008/07/25
  • メディア: 雑誌

nice!(0)  コメント(1)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 1

masato

ポインタコンテキストでの 0 は NULL を意味するためでしょうかね。
ポインタ変数に一旦 1 を代入してから -1 すればアクセスできました。
by masato (2008-08-23 14:32) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。