アセンブラ短歌を試す

Linux/x86での,アセンブラ短歌の簡単な試しかたです.

例えば以下の短歌があったとします.

b8 57 61 6b 61
53 50 ba 04 00 00 00
bb 01 00 00 00
b8 04 00 00 00 89 e1
cd 80 58 31 c0 5b c3

■ きちんと実行ファイルを作る方法

まず,バイナリエディタで上記バイナリをそのまま入力してファイルにします. ここでは tanka.bin としましょう.

次に以下のようなファイルをtanka.Sという名前で作成します.

	.section .text
	.global main
	.type	main, @function
main:
	.incbin "tanka.bin"
もしくはtanka.Sを以下のようにして,バイナリコードを直接埋め込んでもOKです. これだとバイナリエディタを使わずに済みます.
	.section .text
	.global	main
	.type	main, @function
main:
	.byte	0xB8
	.byte	0x57
	.byte	0x61
	...

tanka.Sを以下でアセンブルして実行形式が生成できます.

$ gcc tanka.S -o tanka
実行してみます.
$ ./tanka 
Waka$ 
逆アセンブルしてみます.
$ objdump -d tanka        

tanka:     file format elf32-i386

...(中略)...

080483b4 <main>:
 80483b4:       b8 57 61 6b 61          mov    $0x616b6157,%eax
 80483b9:       53                      push   %ebx
 80483ba:       50                      push   %eax
 80483bb:       ba 04 00 00 00          mov    $0x4,%edx
 80483c0:       bb 01 00 00 00          mov    $0x1,%ebx
 80483c5:       b8 04 00 00 00          mov    $0x4,%eax
 80483ca:       89 e1                   mov    %esp,%ecx
 80483cc:       cd 80                   int    $0x80
 80483ce:       58                      pop    %eax
 80483cf:       31 c0                   xor    %eax,%eax
 80483d1:       5b                      pop    %ebx
 80483d2:       c3                      ret    
...(後略)...

■ バイナリファイルを直接逆アセンブルする方法

もしくは以下のようにして,tanka.bin を直接逆アセンブルすることもできます.

$ objdump -b binary -m i386 -D tanka.bin 

tanka.bin:     file format binary

Disassembly of section .data:

0000000000000000 <.data>:
   0:   b8 57 61 6b 61          mov    $0x616b6157,%eax
   5:   53                      push   %ebx
   6:   50                      push   %eax
...(後略)...
この場合,objdump 実行時の -m でのアーキテクチャ指定は必須です. -m で指定できるアーキテクチャ名は,objdump -i で知ることができます. x86以外のアーキの場合も,同様のやりかたで知ることができます.
$ objdump -i
...(中略)...
binary
 (header endianness unknown, data endianness unknown)
  i386
...(後略)...

メールは kozos(アットマーク)kozos.jp まで