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 件のコメント:
コメントを投稿