Euler's Totient Function in x86 assembly (MASM)
You're not using cdq properly.  cdq sign extends EAX into EDX usually in preparation for an idiv (signed division) instruction.  However, you're using div (unsigned division), so instead of using cdq (which can potentially fill EDX with 0xFFFFFFFF), you should zero out that register instead.  If you were doing an idiv, though, the cdq is in the wrong place since it needs to come after loading data into EAX.  And there are a couple of places where you already know that EDX will be 0 so you don't need the instruction at all.

In place of cmp edx,0, you can use test edx,edx.  It sets the zero and sign flags the same way but does so with a smaller instruction.

Your L2 loop can be shortened a bit.  If EDX is zero (no remainder after the division), you already know that EDX is zero, so you don't need to zero it out, and that x is already in EAX.  So you can loop back to the div instruction.