I wouldn't necessarily recommend this approach, but the way I learned to read x86 assembly (I've never needed to write it, but I do write other assembly languages) was by reading Michael Abrash's Graphics Programming Black Book and disassembling a Windows driver for a piece of hardware in order to create a Linux driver. Having a practical motivation other than just "learning assembly language" can be beneficial.
You could also try getting an embedded development kit, like the USB Bitwhacker, PICKit, or an AVR-based kit, and programming a microcontroller in assembly language.
I need to plug some holes in my skills, and this is one of them.