![見出し画像](https://assets.st-note.com/production/uploads/images/168308709/rectangle_large_type_2_cea8720612d3edbf7ff36dd436230e48.png?width=1200)
汎用逆アセンブラ 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
![](https://assets.st-note.com/img/1736581125-xPql9ydR8VNCEia2MYeS1Opu.png?width=1200)
disx が起動します。初期状態では、全て 1 バイトデータ FCB となります。
c と打つと、1 命令逆アセンブルします。
![](https://assets.st-note.com/img/1736581264-91qbKG3kxMBZaErXwtUfgIzV.png?width=1200)
C と打つと、無条件分岐または未定義命令になるまで逆アセンブルしてくれます。参照先には自動的にラベルがつきます。
![](https://assets.st-note.com/img/1736581558-4QkHP8qrCAL37tX5wpV90f1z.png?width=1200)
T と打つと、トレースしながら逆アセンブルします。全ての参照先を逆アセンブルします。P5 の場合、一発で全て逆アセンブルが完了します。
![](https://assets.st-note.com/img/1736581858-ZCst3G5Ry0PMdlj6bI1z4FqT.png?width=1200)
:wq で、保存して終了。
コマンド
: でコマンドモードになります。
l ラベル変更
w 編集状態の保存
asm アセンブルソース形式でファイル生成
list リスト出力形式でファイル生成
q 終了
; でコメントをつけられます。
@ で参照先にジャンプします。
<> でジャンプ先から戻ることができます。
そのほかにも、便利なコマンドがたくさんあります。
バグ?
ラベルやコメントを、削除すると segmentation fault となることがあります。