Перейти к содержанию

DISCASM148

DISCASM148 (Cawas Disassembler for i80148) - дизассемблер, который превращает бинарник .bin или Logisim hex .hex обратно в исходник .asm.

Параметр Значение
Версия 0.1
Целевая архитектура i80148 (32-бит, flat)
Порядок байтов Big Endian
Вход .bin, .hex
Выход .asm
Файл DISCASM148.py

Использование

python DISCASM148.py program.bin --org 0x00060000 -o program.asm
Опция Описание
--org addr Базовый адрес (для генерации меток), по умолчанию 0x00000000
-o file Выходной .asm. Без -o результат печатается в stdout

Как это работает

Дизассемблер выполняет линейный проход по бинарнику и использует эвристики:

  1. Ищет инструкции - начиная с текущего байта пытается декодировать валидную инструкцию i80148.
  2. Собирает метки - все цели JMP, JMA, CALL становятся метками L_XXXXXXXX.
  3. Определяет данные:
  4. Блок нулей ≥ 16 байт → .db 0x00, ....
  5. Печатаемая ASCII-строка ≥ 4 символов → .db "..." (с , 0, если следом идёт \0).
  6. Невалидный байт → одиночный .db 0xXX.
  7. Разрешает конфликты - если инструкция перекрывается со строкой/нулями, оба фрагмента сливаются в блок сырых байт.

Формат вывода

Что Формат
Метки L_XXXXXXXX (абсолютный адрес в uppercase hex)
Строки .db "..." с escape \n \r \t \0 \\ \"
Нули .db 0x00, ... блоками по 8 байт
Сырые байты .db 0xXX, ... блоками по 8 байт

Вывод всегда начинается с .text.

Пример

$ python DISCASM148.py program.hex --org 0x00060000 -o program.asm
Loaded 256 bytes from program.hex
Written: program.asm
Labels found: 4

Пример выходного фрагмента:

.text

L_00050010:
    LDI.DW SP, 0x00080000
    LDI.DW IX, L_00050040
    CALL L_00050020
    HALT