Hazygrin links to Joel saying he agrees that you should start learning programming at a level as close to the metal as possible, i.e., C. I disagree, and I suspect that generally the people who are in this camp are the people who learned C first. (I'm not one of those; I learned Pascal before C, although a one-credit course in college in C might have been the most valuable class I ever took, practically speaking.)
But if you must get fairly close to the machine, why not start with a managed language? Being able to move from Java or C# to byte code is going to get you a long way to understanding how your source code is translated to something the machine understands, without having to really bury yourself under a load of machine code manuals.
I would replace this recommendation with Stroustrup's The C++ Programming Language, 3rd edition, which replaces all the stuff about byte copying with good object-oriented design. Going all the way back to C is, to my mind, no more necessary to a programmer starting out today than a recipe for bread has to start with "Grind down enough wheat to produce three cups of flour..."