Assembly language programming in Windows

I wrote my first assembly language program 20 years ago, and up until about 5 years ago I was always doing something or another in assembly language.  Having finished most of my other projects, I’ve started brushing up on my ASM skills again, starting with porting an old hex dump/patch program from 8086 DOS assembly language up to a 32-bit (386 or Pentium, I haven’t yet decided) Windows console application.  Once that’s finished, I’ll probably port the program to Linux as well.

Writing to the Windows API from assembly language is an odd experience.  Traditionally, assembly language programs “talk to the hardware,” or interface with the operating system at a low level.  But the Windows API is a bunch of high-level procedure calls, and the operating system controls all of the hardware.  I’m directly controlling the CPU, true, but everything else (video, keyboard, sound, I/O ports, etc.) is accessed through a high-level procedure call.  It’s an entirely different kind of assembly language programming.  Interesting though, and very instructive.