First-class NASM x86/x86-64 and MIPS support — syntax highlighting, context-aware completion, inspections, project wizard, and end-to-end debug through QEMU and GDB. On Windows, everything routes transparently through WSL.
.datamsg: .asciiz "Hello, World!\n"
.text.globl __start
__start:# Print string to stdout
li $v0, 4004 # sys_write
li $a0, 1 # stdout
la $a1, msg # buffer
li $a2, 14 # length
syscall
# Exit program
li $v0, 4001 # sys_exit
li $a0, 0 # status
syscall
A real IDE for assembly coursework — breakpoints, registers, stepping that actually work. Not SPIM, not MARS.
Hand-rolled assembly in C projects where .nasm and .s files should be first-class citizens in CMake builds.
One-install setup to hand students instead of "now please configure your toolchain manually."
Two ISAs students and systems programmers actually use
NASM 2.x syntax, Intel-style + %-prefixed preprocessor directives.
GAS-style directives, Linux o32 syscall ABI (sys_write = 4004, sys_exit = 4001).
Everything the plugin adds to CLion

The piece that took the longest to get right
Hit Debug → Before-Launch assembles with --gdwarf-2 for real DWARF, links with -e __start, starts qemu-mips-static -g <port> detached. CLion attaches its bundled multiarch GDB — no need to install gdb-multiarch in WSL. Path mapping translates /mnt/c ↔ C:\ so breakpoints bind on the right file.
Step-by-step from project creation to debug
File → New → Project → Assembly. Name it hello, language NASM, format elf64, mode Pure ASM.
CLion opens with CMakeLists.txt and main.nasm. CMake configures automatically; the run-config dropdown populates.
Click ▶. The template calls exit(0). Add a sys_write call (or use the wrt live template) and run again.
One command on Linux/macOS, a few steps on Windows
Install the cross-toolchain. The plugin auto-detects binaries on PATH.
# Debian / Ubuntu sudo apt install nasm gcc-mips-linux-gnu \ qemu-user-static gdb make ninja-build
sudo apt installThings that took an afternoon to track down
No need to install gdb-multiarch inside WSL. The bundled debugger supports mips, arm, riscv, aarch64 out of the box.
Stale QEMU cleanup uses qemu-mips-stati[c] — the regex character class ensures pkill matches the emulator but not the cleanup script itself.
NasmLanguage and MipsLanguage call Language.findLanguageByID before registering, so if a third-party plugin has already claimed the same language ID the IDE reuses it instead of crashing on startup with an ImplementationConflictException.
./gradlew test