One of the best introductory programming books I’ve ever seen is entitled “The IBM PC from the Inside Out“. This is an assembly language oriented guide to the programming and operation of the 8086-based IBM PC. It suffers from being out of print, and from being targeted at a 25 year old machine, but neither drawback is as significant as you might think.
A quick check on Amazon or Barnes & Noble turns up plenty of used copies of this book. (Well, “plenty” for the audience of people willing to learn programming by diving in at the deep end.) Abebooks, interestingly, didn’t turn up anything. Not snooty enough for them, I suppose.
There are two concerns one might have about this book’s age: First, that it addresses an obsolete and irrelevant technology, and second that it will be very hard to run the code found in the book. Neither concern is much supported by the facts.
The 8086 instruction set can still be found (with, of course, extensions) in the CPU of every Mac and PC that ships today; it was a very successful architecture, and Intel did a great job of maintaining backwards compatibility. Aside from OS calls, 30 year old 8086 code will run just fine on that Core Duo you just bought. Therefore, 8086 assembly is quite relevant (as a starting point for learning modern x86 assembly) even today.
The more serious problem with this book is that its examples assume that you have access to the DOS run-time environment. Fortunately, DOS emulators (and virtual 8086 machines) are pretty common; they come built-in to most versions of Windows, for instance. You also might consider spending a few bucks on some vintage hardware; it will be more than worth it.