The book being recommended is ``Programming from the Ground Up'' by Jonathan Bartlett. It may be found here.
This book is a good choice for anyone interested in beginning to learn the lower-levels of computer programming and development. Unlike a great deal of material that is top-down in terms of the abstractions, this book is titularly in the opposite direction; a novice will learn the building blocks of abstractions before they use them. Topics covered include: basic computer hardware and terminology, including processors, storage, and addressing; assemblers; algorithmic thinking; calling conventions; recursion; error handling; memory management; optimization; system calls; and debugging with GDB.
It should be made clear this book is introductory and will best suit programmers with little experience at this level or people new to programming entirely. This book teaches using GNU tools and the machine code taught is the x86 machine language, but this is not a detail that should concern someone who doesn't already have a reason to disagree with these choices; one should not worry about wasting time with topics one won't make use of, as much of the material is generally applicable to programming at this level.
A programmer already experienced with the low-levels will find this book a very easy read and so may want to simply avoid it, but a glance through doesn't hurt.
I recommend to download the source for this work as well so that you will have easier access to the example programs. An avid reader could expect to finish this book within just a month or two.