A required course in my program is "Engineering Fundamentals of Computer Systems" - a course for software engineers that introduces the basic concepts of computer engineering, such as data representations, floating point arithmetic, boolean algebra, logic gates and logic circuits, machine language, assembly language, pipelining, caching, virtual memory, data compression, mass storage, and a little on embedded systems. The book used during this course is The Essentials of Computer Organization and Architecture. It's an OK book, but my biggest problem is that there is too much space dedicated to the fictional assembly language that has no real-world applications. Some of the topics are also glossed over a bit too much, in my opinion.
What other book or books provide a good introduction to these topics, preferably geared toward a software engineer? My only requirement is that the book or books use real world technologies (even if they are out-of-date technologies from 5, 10, or even 20 years ago) and puts information into a real-world context.