2013年10月9日水曜日

RXでアセンブラ短歌

SECCONで解けなかった問題。

RXでアセンブラ短歌(プログラミング:100pt)


下記の短歌を詠んだ結果、出力される文字列を答えよというもの。

FB 7E 67 6D 62
FB 62 15 08 0C 65 03
FC 37 67 7E A7
66 11 66 43 66 55 03
EF 02 75 60 FF 67 01

RXというのはルネサスというメーカが出しているマイコンファミリの事らしい。

RX ファミリ | ルネサス エレクトロニクスhttp://japan.renesas.com/products/mpumcu/rx/index.jsp

知らなかった。


RXとして動かす方法はいろいろあるみたいだけど、自前でgccやgdbをRX向けにmakeする方法がなかなかうまくいかなかった。

結局、KPIT GNU Tools(http://www.kpitgnutools.com)というところからGNURX v13.01 Linux Tool Chainをダウンロードした。


短歌をアセンブラソースファイルに書く
$ cat tanka.s
.section .text
.global _main
.type _main, @function
_main:
.byte 0xFB
.byte 0x7E
.byte 0x67
.byte 0x6D
.byte 0x62
…以下略

続いてrx-elf向けのgccでコンパイル
$ rx-elf-gcc tanka.s -o tanka.o

rx-elfとして実行する
$ rx-elf-run ./tanka.o
rene

答え(多分):rene


ルネサス(renesas)の頭4文字だということであれば納得。

また、短歌を書き込んだバイナリをobjdumpで見てみると、0x626d67と0x650c0815のxorを取って出力しているっぽい。0x656e6572はリトルエンディアンで"rene"。
$ rx-elf-objdump -b binary -m rx -D tanka
tanka:     ファイル形式 binary

セクション .data の逆アセンブル:
00000000 <.data>:
   0: fb 7e 67 6d 62                 mov.l #0x626d67, r7
   5: fb 62 15 08 0c 65             mov.l #0x650c0815, r6
   b: 03                             nop
   c: fc 37 67                       xor r6, r7
   f: 7e a7                         push.l r7
  11: 66 11                         mov.l #1, r1
  13: 66 43                         mov.l #4, r3
  15: 66 55                         mov.l #5, r5
  17: 03                             nop
  18: ef 02                         mov.l r0, r2
  1a: 75 60 ff                       int #255
  1d: 67 01                         rtsd #4


実行や逆アセンブルできる環境を整えるまでが大変だった。

0 件のコメント:

コメントを投稿