I think I understand now what your goal is, and I must say, I'm very impressed that you want to learn how the low-level stuff works before learning about the higher level. Too many people that I encounter in my business today just don't understand about hardware, assembly language, registers, ports, I/O, DMA etc. I could be wrong, but most university courses today don't cover those things, but instead cover languages such as COBOL, C/C++, Java etc.
I think having a good understanding of the basics makes you a better overall developer.
As I said in an earlier post, I haven't used assembly language for a few years now, and some of the books I have (probably most) are just out of date. But they were useful at the time
By the way, Intel have full documentation for their processors on their web site. I looked the other day at the latest instruction set for the i7, and was amazed how much has been added since my 386 days! The Intel documents are usually very well written and are invaluable to any assembly programmer.
Link to i7 details on Intel site : http://developer.intel.com/products/...uals/index.htm
You can find links to other processors from there.
I din't think I've ever read a book that detailed how to interface to hardware including examples etc. What I used to use was the datasheets specific to individual chips, and the information from the guys building the hardware - they would tell me where specific chips were mapped into memory, or what port numbers I could access them on. So if you were thinking or writing a driver for an old modem for example, you would need the datasheets on the chips used on the card, the address the card was mapped to in memory, and any I/O ports. Not sure it would be easy to find that stuff for old hardware though.