This book teaches assembly language for x86 processors and the GNU/Linux operating system. Therefore we will be giving all of the examples using the GNU/Linux standard GCC tool set. If you are not familiar with GNU/Linux and the GCC tool set, they will be described shortly. If you are new to Linux, you should check out the guide available at http://rute.sourceforge.net/  What I intend to show you is more about programming in general than using a specific tool set on a specific platform, but standardizing on one makes the task much easier.
Those new to Linux should also try to get involved in their local GNU/Linux User’s Group. User’s Group members are usually very helpful for new people, and will help you from everything from installing Linux to learning to use it most efficiently. A listing of GNU/Linux User’s Groups is available at http://www.linux.org/groups/
All of these programs have been tested using Red Hat Linux 8.0, and should work with any other GNU/Linux distribution, too.  They will not work with non-Linux operating systems such as BSD or other systems. However, all of the skills learned in this book should be easily transferable to any other system.
If you do not have access to a GNU/Linux machine, you can look for a hosting provider who offers a Linux shell account, which is a command-line only interface to a Linux machine. There are many low-cost shell account providers, but you have to make sure that they match the requirements above (i.e. – Linux on x86). Someone at your local GNU/Linux User’s Group may be able to give you one as well. Shell accounts only require that you already have an Internet connection and a telnet program. If you use Windows®, you already have a telnet client – just click on start, then run, then type in telnet. However, it is usually better to download PuTTY from http://www.chiart.greenend.co.uk/~sgtatham/putty/ because Windows’ telnet has some weird problems. There are a lot of options for the Macintosh, too. NiftyTelnet is my favorite.
If you don’t have GNU/Linux and can’t find a shell account service, then you can download Knoppix from http://www.knoppix.org/ Knoppix is a GNU/Linux distribution that boots from CD so that you don’t have to actually install it. Once you are done using it, you just reboot and remove the CD and you are back to your regular operating system.
So what is GNU/Linux? GNU/Linux is an operating system modeled after UNIX®. The GNU part comes from the GNU Project (http://www.gnu.org/) , which includes most of the programs you will run, including the GCC tool set that we will use to program with. The GCC tool set contains all of the programs necessary to create programs in various computer languages.
Linux is the name of the kernel. The kernel is the core part of an operating system that keeps track of everything. The kernel is both a fence and a gate. As a gate, it allows programs to access hardware in a uniform way. Without the kernel, you would have to write programs to deal with every device model ever made. The kernel handles all device-specific interactions so you don’t have to. It also handles file access and interaction between processes. For example, when you type, your typing goes through several programs before it hits your editor. First, the kernel is what handles your hardware, so it is the first to receive notice about the keypress. The keyboard sends in scancodes to the kernel, which then converts them to the actual letters, numbers, and symbols they represent. If you are using a windowing system (like Microsoft Windows® or the X Window System), then the windowing system reads the keypress from the kernel, and delivers it to whatever program is currently in focus on the user’s display.
Keyboard -> Kernel -> Windowing system -> Application program
The kernel also controls the flow of information between programs. The kernel is a program’s gate to the world around it. Every time that data moves between processes, the kernel controls the messaging. In our keyboard example above, the kernel would have to be involved for the windowing system to communicate the keypress to the application program.
As a fence, the kernel prevents programs from accidentally overwriting each other’s data and from accessing files and devices that they don’t have permission to. It limits the amount of damage a poorly-written program can do to other running programs.
In our case, the kernel is Linux. Now, the kernel all by itself won’t do anything. You can’t even boot up a computer with just a kernel. Think of the kernel as the water pipes for a house. Without the pipes, the faucets won’t work, but the pipes are pretty useless if there are no faucets. Together, the user applications (from the GNU project and other places) and the kernel (Linux) make up the entire operating system, GNU/Linux.
For the most part, this book will be using the computer’s low-level assembly language. There are essentially three kinds of languages:
High-level languages are there to make programming easier. Assembly language requires you to work with the machine itself. High-level languages allow you to describe the program in a more natural language. A single command in a high-level language usually is equivalent to several commands in an assembly language.
In this book we will learn assembly language, although we will cover a bit of high-level languages. Hopefully by learning assembly language, your understanding of how programming and computers work will put you a step ahead.