diff --git a/common.mak b/common.mak
index a49379265741d3001920aba109f3d1bfb3161983..a6fabb300a631e0376560c6725023454de4368c5 100644
--- a/common.mak
+++ b/common.mak
@@ -5,6 +5,14 @@
 # first so "all" becomes default target
 all: all-yes
 
+DEFAULT_YASMD=.dbg
+
+ifndef DBG
+YASMD=
+else
+YASMD=$(DEFAULT_YASMD)
+endif
+
 ifndef SUBDIR
 
 ifndef V
@@ -138,7 +146,7 @@ $(TOOLOBJS): | tools
 
 OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS) $(TESTOBJS))
 
-CLEANSUFFIXES     = *.d *.o *~ *.h.c *.map *.ver *.ho *.gcno *.gcda
+CLEANSUFFIXES     = *.d *.o *~ *.h.c *.map *.ver *.ho *.gcno *.gcda *$(DEFAULT_YASMD).asm
 DISTCLEANSUFFIXES = *.pc
 LIBSUFFIXES       = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a
 
diff --git a/doc/build_system.txt b/doc/build_system.txt
index 2efde5ce02841ec599f012f23aab3668fe8c01fe..20242b13535e749a6fd603240c4c763687103353 100644
--- a/doc/build_system.txt
+++ b/doc/build_system.txt
@@ -7,6 +7,11 @@ V
     Disable the default terse mode, the full command issued by make and its
     output will be shown on the screen.
 
+DBG
+    Preprocess x86 external assembler files to a .dbg.asm file in the object
+    directory, which then gets compiled. Helps developping those assembler
+    files.
+
 DESTDIR
     Destination directory for the install targets, useful to prepare packages
     or install FFmpeg in cross-environments.
diff --git a/doc/optimization.txt b/doc/optimization.txt
index 94a42773267b2b8fd17a66d69d32bd4011df3d59..1a0b98cd0e25e402a80e31d41bdb8b639b0abe89 100644
--- a/doc/optimization.txt
+++ b/doc/optimization.txt
@@ -191,6 +191,11 @@ __asm__() block.
 Use external asm (nasm/yasm) or inline asm (__asm__()), do not use intrinsics.
 The latter requires a good optimizing compiler which gcc is not.
 
+When debugging a x86 external asm compilation issue, if lost in the macro
+expansions, add DBG=1 to your make command-line: the input file will be
+preprocessed, stripped of the debug/empty lines, then compiled, showing the
+actual lines causing issues.
+
 Inline asm vs. external asm
 ---------------------------
 Both inline asm (__asm__("..") in a .c file, handled by a compiler such as gcc)
diff --git a/library.mak b/library.mak
index 72e55743860270803ed949f32727ef4e7e6888ac..e23abd2251f7ecf2c554bddbeba2e55e0beeb119 100644
--- a/library.mak
+++ b/library.mak
@@ -22,7 +22,11 @@ $(SUBDIR)%-test.i: $(SUBDIR)%-test.c
 $(SUBDIR)%-test.i: $(SUBDIR)%.c
 	$(CC) $(CCFLAGS) $(CC_E) $<
 
-$(SUBDIR)x86/%.o: $(SUBDIR)x86/%.asm
+$(SUBDIR)x86/%$(DEFAULT_YASMD).asm: $(SUBDIR)x86/%.asm
+	$(DEPYASM) $(YASMFLAGS) -I $(<D)/ -M -o $@ $< > $(@:.asm=.d)
+	$(YASM) $(YASMFLAGS) -I $(<D)/ -e $< | sed '/^%/d;/^$$/d;' > $@
+
+$(SUBDIR)x86/%.o: $(SUBDIR)x86/%$(YASMD).asm
 	$(DEPYASM) $(YASMFLAGS) -I $(<D)/ -M -o $@ $< > $(@:.o=.d)
 	$(YASM) $(YASMFLAGS) -I $(<D)/ -o $@ $<
 	-$(if $(ASMSTRIPFLAGS), $(STRIP) $(ASMSTRIPFLAGS) $@)