To be honest, never went any further than real-mode assembly on a 286 or 386(MS-DOS) as far as I can remember. All other instructions I've simply learned building the emulator itself. So I at least know what all fields in the tables and CPU do(except undocumented stuff). So essentially, the stuff that's on osdev and various other x86 information websites(also a little bit tought by my father back when I was 10), combined with the information I've learned here on vogons. So other than some simply driver tutorial book I once read(PC Intern book as well as Turbo Pascal 6.0 book back then), I've entirely learned stuff by the tutorials on cplusplus.com(and some PHP tutorials), as well as lots of experimentation by applying stuff in my emulator and other applications I've made(simply ISO reader I've made in high school, EBOOT2ISO, Popstation PSP, UniPCemu and a game I was developing with a friend(not worked on it since I was working on UniPCemu since a long time ago) that's essentially a game version of the Astrotroopers of the Hatsune Miku video( https://www.youtube.com/watch?v=nTWqJ1SSBgA ) but was never finished(another group was creating a version of that game as well).
Although I've started building a little option ROM for the IBM PC adding AT functionality(primarily XT RTC chip) support to the (Generic Turbo) XT BIOS, which wasn't finished yet also ( https://bitbucket.org/superfury/unipcemu_pcxtbios_at/ ). Though the code itself is untested.
Never programmed in protected mode assembler, but I should be able to (know all commands that are used and how they work(except undocumented stuff or badly documented stuff)).