Skip to content

telefon2232/yasm

Repository files navigation

🔬 YASM

VS Code расширение для просмотра ассемблера рядом с исходным кодом C/C++.

Открывает дизассемблирование бинарника в соседней панели и связывает строки исходника с инструкциями ассемблера цветовым маппингом — как в Compiler Explorer (Godbolt), но для локальных бинарников.


✨ Возможности

  • 🎨 Цветовой маппинг — каждая строка исходника и соответствующий ей блок asm окрашены одним цветом
  • 🔄 Двусторонняя навигация — клик по исходнику подсвечивает asm, клик по asm подсвечивает исходник
  • 📂 Многофайловые проекты — корректно работает когда бинарник собран из нескольких .c файлов
  • Авто-обновление — следит за бинарником и перезагружает дизассемблирование при перекомпиляции
  • 🔍 Auto-detect — автоматически находит GNU objdump или LLVM objdump
  • 🔥 Live Mode — Godbolt-подобный режим: автоматически компилирует текущий файл в .o и обновляет asm при сохранении или по таймеру
  • 🔀 Diff Mode — сравнение asm двух бинарников side-by-side с цветовым маппингом

🚀 Быстрый старт

1. Установить расширение

code --install-extension bin/yasm-0.1.0.vsix

2. Скомпилировать проект с отладочной информацией

gcc -g -O1 -o main main.c

Флаг -g обязателен — без него DWARF-информация не попадёт в бинарник и маппинг не заработает.

3. Создать конфиг .yasm.json в корне проекта

Через команду: Ctrl+Shift+PYASM: Initialize Config — создаст конфиг с полным набором полей.

4. Запустить

Ctrl+Shift+PYASM: Show Assembly


⚙️ Конфигурация

Файл .yasm.json в корне рабочей папки:

{
  "binary": "./main",
  "sourceRoot": ".",
  "objdump": "objdump",
  "objdumpArgs": ["-M", "intel"],
  "sections": [".text"],
  "filterByFile": false,
  "liveMode": {
    "compileCommand": "gcc -g -O2 -c {file} -o {output}",
    "trigger": "save",
    "interval": 500
  }
}
Параметр Обязательный По умолчанию Описание
binary да Путь до скомпилированного бинарника
sourceRoot "." Корень исходников (для резолва путей из DWARF)
objdump auto-detect Путь к objdump или llvm-objdump
objdumpArgs [] Доп. аргументы (например ["-M", "intel"] для Intel-синтаксиса)
sections [".text"] Секции для дизассемблирования
filterByFile false Показывать только функции из текущего открытого файла. Помогает при больших бинарниках и Remote SSH
liveMode.compileCommand Команда компиляции. {file} — исходник, {output} — выходной .o
liveMode.trigger "save" "save" — при сохранении, "live" — автоматически по таймеру
liveMode.interval 500 Интервал проверки изменений в мс (только для "live")

🛠 Команды

Команда Описание
YASM: Show Assembly Открыть панель с дизассемблированием бинарника
YASM: Refresh Disassembly Перезагрузить дизассемблирование
YASM: Initialize Config Создать .yasm.json через диалог
YASM: Diff Assembly Сравнить asm двух бинарников в diff-режиме
YASM: Live Mode Живая компиляция текущего файла в .o с показом asm. Повторный вызов останавливает

Status bar показывает текущий режим, имя бинарника и количество функций; клик — refresh.


🔥 Live Mode

Режим живой компиляции — аналог Godbolt, но в IDE. Компилирует текущий .c/.cpp файл в объектный файл и показывает его asm side-by-side.

  1. Добавить секцию liveMode в .yasm.json:
{
  "binary": "./main",
  "sourceRoot": ".",
  "liveMode": {
    "compileCommand": "gcc -g -O2 -c {file} -o {output}",
    "trigger": "save"
  }
}
  1. Открыть .c файл и запустить Ctrl+Shift+PYASM: Live Mode

При каждом сохранении (или по таймеру в режиме "live") файл перекомпилируется и asm обновляется автоматически. Ошибки компиляции выводятся в Output Channel "YASM Live".

В compileCommand можно указать скрипт (./build.sh {file} {output}), который соберёт зависимости перед компиляцией основного файла.


🖥 Remote SSH / большие бинарники

При работе через VS Code Remote SSH или с большими бинарниками asm-файл может быть слишком большим для удобного просмотра. Включите filterByFile — тогда в панели asm будут только функции из текущего открытого файла:

{
  "binary": "./main",
  "sourceRoot": ".",
  "filterByFile": true
}

Фильтрация происходит на сервере до открытия файла — через SSH-канал передаётся только отфильтрованный результат.


🔀 Diff Mode

Сравнение ассемблера двух бинарников (например, скомпилированных с разными флагами оптимизации):

gcc -g -O1 -o main_O1 main.c math_utils.c
gcc -g -O2 -o main_O2 main.c math_utils.c

Затем Ctrl+Shift+PYASM: Diff Assembly → выбрать main_O1 → выбрать main_O2.

Оба asm открываются side-by-side с цветовым маппингом к исходнику.


📖 Примеры

В папке example/ три готовых примера на разных языках — все реализуют одну логику (square, sum_squares):

Язык Директория Команда сборки
C example/c/ gcc -g -O1 -o main main.c math_utils.c
Fortran example/fortran/ gfortran -g -O1 -o main main.f90 math_utils.f90
Rust example/rust/ cargo build
cd example/c   # или fortran/ или rust/
gcc -g -O1 -o main main.c math_utils.c
code .

Затем Ctrl+Shift+PYASM: Show Assembly — и готово.


🏗 Сборка из исходников

npm install
npm run compile
npx vsce package --allow-missing-repository --out bin/yasm-0.1.0.vsix

📋 Требования

  • VS Code >= 1.85
  • objdump (GNU) или llvm-objdump в PATH
  • Бинарник, скомпилированный с -g (DWARF debug info)

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors