Have you ever tried to teach x86 assembly language programming to someone coming from high level language programming background and discovered that it was hard?
Before being able to write a simple “Hello World” program one needs to know a fair deal about the x86 architecture, the assembler language and the operating system. Obviously this is not the case with high level languages such as C for example.
I was reading The Art of Asssembly Language, 2nd edition book by Randall Hyde the other day and really enjoyed his approach to teaching the assembly language programming.
In his book, Randall introduces the reader to the HLA (High Level Assembler) compiler which will be used as a tool to learn the x86 assembly language.
The syntax of HLA can be thought of as a hybrid of Pascal and assembly language. Here’s a sample “Hello world” HLA program:
program helloWorld; #include( "stdlib.hhf" ); begin helloWorld; stdout.put( "Hello, World of Assembly Language", nl ); end helloWorld;
You may argue that this was not an assembly language program, but what about this:
program h; #include("stdlib.hhf"); static s: string := "Hello World!"; procedure chksum_str; @returns( "eax" ); begin chksum_str; mov(s, edi); xor(ebx, ebx); xor(eax, eax); while( mov( [edi], al ) <> #0 ) do inc(edi); // advance str ptr add(eax, ebx); endwhile; mov(ebx, eax); end chksum_str; begin h; stdout.put("The checksum of '", s, " is: 0x"); chksum_str(); stdout.put(eax); if ( eax == 1234 ) then stdout.put("Special chksum!", nl); endif; end h;
Although this is also not pure assembler syntax, the newcomer will enjoy learning about the x86 architecture and instruction set with the help of the features provided by HLA:
Throughout the book, before a programming concept is introduced, Randall talks about the necessary background information (architecture and instruction set) and then explains how to put the concept into practive using HLA.
For example, in Chapter 5 (Procedures and Units), he explains in detail how the stack is set up during a procedure call, how local variables are allocated and how to access the arguments, followed by explanation on how to use HLA to write procedures. Similarly in Chapter 6, when talking about FPU arithmetics, the author carefully explains about the FPU data and controls registers, related instruction set and finally how to use HLA to do FPU arithmetics.
If your aim is to learn assembly language in order to start reverse engineering, this book is probably not for you, however I highly recommend this book for programmers: