見出し画像

汎用逆アセンブラ disx

主要な 8 ビットおよび 16 ビット CPU をサポートする、汎用の逆アセンブラ disx をインストールします。vi ライクの操作感で、ラベルやコメントをつけながら、解析できます。


ソースコードの入手

作者の Bruce Tomlin さんのサイトからダウンロードできます。

Subversion 

$ svn co http://svn.xi6.com/svn/disx4/trunk disx4

インストール

MacBook Air M1, macOS Sequoia で、特に問題なく make できました。

% make
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o disx.o disx.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o disscrn.o disscrn.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o disstore.o disstore.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o disline.o disline.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dissave.o dissave.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o discpu.o discpu.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o discmt.o discmt.cpp
cc -std=c99 -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o rle.o rle.c
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o disz80.o disz80.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dis6502.o dis6502.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dis68HC11.o dis68HC11.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dis68HC05.o dis68HC05.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dis6809.o dis6809.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dis68k.o dis68k.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dis8051.o dis8051.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dis8048.o dis8048.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dis8008.o dis8008.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dis4004.o dis4004.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o disz8.o disz8.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dis1802.o dis1802.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o disf8.o disf8.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dispic.o dispic.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o disarm.o disarm.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o disthumb.o disthumb.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dis7810.o dis7810.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dis78K0.o dis78K0.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dis78K3.o dis78K3.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dis8086.o dis8086.cpp
c++ -fno-rtti -fno-exceptions -g3 -O2 -Wall -Werror -Wextra -Wno-sign-compare -Wno-deprecated-declarations -DVERSION=\"4.3.0r\" -DDATE=\"2025-01-02\" -D_DARWIN_C_SOURCE  -c -o dispdp11.o dispdp11.cpp
cc -lstdc++  disx.o disscrn.o disstore.o disline.o dissave.o discpu.o discmt.o rle.o disz80.o dis6502.o dis68HC11.o dis68HC05.o dis6809.o dis68k.o dis8051.o dis8048.o dis8008.o dis4004.o disz8.o dis1802.o disf8.o dispic.o disarm.o disthumb.o dis7810.o dis78K0.o dis78K3.o dis8086.o dispdp11.o  -L/usr/lib -lncurses -o disx

コマンドオプション

% disx -\?
disx disassembler  version 4.3.0  2024-12-28

Usage:
    disx [options] [binfile]

Options:
    -c cpu         select default CPU type
    -c ?           show list of supported CPU types
    -b xxxx        hexidecimal base address
    -s xxxx        hexidecimal size of binary data
    -o xxxx        hexidecimal offset to start of data in file
    -a             create binfile.asm and exit
    -l             create binfile.lst and exit
    -!             don't load binfile.ctl

対応 CPU

$ disx -c \?
Supported CPU types:
  Zilog Z80 and Intel 8085 disassembler: 8080 Z8080 8085 8085U Z8085 Z80 Z180 GB GBZ80
  MOS Technology 6502 disassembler: 6502 6502U 65C02 65SC02 65816 65C816
  Motorola 68HC11 disassembler: 6800 6801 6802 6803 6808 6301 6303 68HC11
  Motorola 68HC05 disassembler: 6805 68HC05
  Motorola 6809 disassembler: 6809
  Motorola 68000 disassembler: 68K 68000 68010
  Intel 8051 disassembler: 8051 8032
  Intel 8048 disassembler: 8021 8048 8049 8035 8041 8042
  Intel 8008 disassembler: 8008
  Intel 4004 disassembler: 4004
  Zilog Z8 disassembler: Z8
  RCA 1802 disassembler: 1802
  Fairchild F8 disassembler: F8
  PIC disassembler: PIC12 PIC14
  ARM disassembler: ARM ARM-LE ARM-BE
  ARM Thumb disassembler: THUMB THUMB-LE THUMB-BE THUMB2 THUMB2-LE THUMB2-BE
  NEC D78C10 disassembler: D78C10
  NEC D78K0 disassembler: D78K0
  NEC D78K3 disassembler: D78K3
  Intel 8086 disassembler: 8086
  DEC PDP-11 disassembler: PDP11

実行例

Disk II コントローラの ROM (P5A.bin) を逆アセンブルしてみます。
-b で ROM のアドレス$C600、-c で CPU 6502 を指定します。

% disx -b c600 -c 6502 P5A.bin
起動画面

disx が起動します。初期状態では、全て 1 バイトデータ FCB となります。
c と打つと、1 命令逆アセンブルします。

1 命令逆アセンブル

C と打つと、無条件分岐または未定義命令になるまで逆アセンブルしてくれます。参照先には自動的にラベルがつきます。

連続逆アセンブル

T と打つと、トレースしながら逆アセンブルします。全ての参照先を逆アセンブルします。P5 の場合、一発で全て逆アセンブルが完了します。

トレース逆アセンブル

:wq で、保存して終了。

コマンド

: でコマンドモードになります。
l ラベル変更
w 編集状態の保存
asm アセンブルソース形式でファイル生成
list リスト出力形式でファイル生成
q 終了

; でコメントをつけられます。

@ で参照先にジャンプします。
<> でジャンプ先から戻ることができます。

そのほかにも、便利なコマンドがたくさんあります。

バグ?

ラベルやコメントを、削除すると segmentation fault となることがあります。

いいなと思ったら応援しよう!