8086のMachine codeを参照したかったので、IA16用binutilsに含まれるia16-elf-asを使ってみました。
インストール
ubuntuを使っているならパッケージがありましたので、これを使いました。
$ sudo add-apt-repository ppa:tkchia/build-ia16
$ sudo apt-get update
$ sudo apt-get install binutils-ia16-elf
詳しい手順はオフィシャルのドキュメントを見てください。
インストール先は/usr/binです。
$ dpkg -L binutils-ia16-elf
/.
/usr
/usr/bin
/usr/bin/ia16-elf-addr2line
/usr/bin/ia16-elf-ar
/usr/bin/ia16-elf-as
...
使い方
ソースコード例
IA16用のコードを生成するためには.code16という記述が必要みたいです。
.code16
mov %ax, %bx
gccの出力をみるともうちょっと記述がありました。
.arch i8086,jumps
.code16
.att_syntax prefix
.text
mov %ax, %bx
これをasでアセンブルします。
$ ia16-elf-as -o hoge.o hoge.s
hoge.oはELF形式です。これをobjdumpで逆アセンブルしてみます。
$ ia16-elf-objdump -d hoge.o
hoge.o: file format elf32-i386
Disassembly of section .text:
00000000 <.text>:
0: 89 c3 mov %eax,%ebx
objcopyでelfをバイナリに変換します。hexdumpで見るとアセンブル結果のみのバイナリになっています。
$ ia16-elf-objcopy -O binary hoge.o hoge.bin
$ hexdump -C hoge.bin
00000000 89 c3 |..|
00000002
objdumpでバイナリを逆アセンブルする場合はオプション指定が必要です。
$ ia16-elf-objdump -D -b binary -m i8086 hoge.bin
hoge.bin: file format binary
Disassembly of section .data:
00000000 <.data>:
0: 89 c3 mov %ax,%bx