Demystify the fundamentals of assembly language programming
Improve application efficiency and speed
Access machine-level hardware
Overcome limitations inherent in high-level programming languages
Improve overall programming skills and understanding
Gain personal satisfaction that comes with learning something complex
Specify your own 64-bit programming language called Adagé
Build a compiler and debugger for the Adagé language
Write 64-bit Windows applications using Adagé syntax
Incorporate assembly language instructions in Adagé source code
Design a simple IDE with a graphic user interface (GUI)
Develop component libraries to extend the capabilities of Adagé
There are five main reasons to learn how to program in assembly language, they are as follows: (1) code and space efficiency, (2) access to system hardware, (3) overcome limitations of current high-level languages, (4) improve your overall programming skills and understanding, and (5) personal satisfaction that comes with learning something complex.
The superiority of assembly language in generating compact code that runs fast is well documented. Assembly code is ideal for time-critical tasks that have to be completed within a certain time period. Likewise, some systems require compactness of application code such as portable computers, phones, and onboard systems found in aircraft and spacecraft. Again, assembly code excels in compactness.
Software applications often require direct control over the system hardware. Examples include operating systems, assemblers, compilers, linkers, device drivers, and network interfaces. Assembly language programming, sometimes referred to as low-level programming, performs lower level tasks when compared to instructions in high-level languages such as Ada, BASIC, C, and Pascal. Assembly provides direct control over system hardware.
Sometimes programmers find that their high-level programming language has serious limitations that prevent them from performing certain kinds of operations. Examples include text and bit manipulation, math calculations, access to the SSE and AVX registers, and multiple core utilization. Typically, only assembly language gives you access to these machine-level capabilities.
Assembly language is central to computer science. Learning assembly language has both practical and educational purposes. A strong foundation in assembly language programming can help improve your awareness of why high-level languages are structured the way they are and improve your understanding of the underlying computer system.
Although learning assembly language programming is more difficult than learning a high-level language such as BASIC or C, there is a certain aspect of personal satisfaction that comes with learning something new and complex. You also become aware of the power of assembly language. The insights assembly language programming give you makes the time spent learning assembly well worth your while.
The goal of this website is to teach general principles of assembly language programming. It is not necessary to have prior knowledge of computer hardware or programming to enjoy its benefits. In actuality, it is not always necessary for programmers to choose between coding in assembly language and coding in a high-level language because many high-level languages allow inline assembly language instructions to be inserted in the source code.
Assembly language is fundamental to understanding computer architecture and computer science. We believe that all students should be thoroughly knowledgeable of the underlying operating system and computer hardware. Although proficiency in programming at the lowest levels is not as important as it once was, understanding the capabilities of the system at the low-level is vital. In our mixed-mode applications, we want to embrace assembly language--not replace it!
One way to learn assembly language programming is to embed inline assembly instructions inside the code of high-level programming languages. This process is referred to as mixed-mode programming. Mixed-mode programming avoids the complexities of standalone assembly language programs. Additionally, the compiler can assist the user in avoiding critical mistakes that might otherwise go undetected when writing standard assembly language routines.
Designing a new programming language represents a significant undertaking in time and resources. Our purpose for creating a new programming language is to understand how to specify a language and build a compiler to convert its instructions to machine-readable code.
On the other hand, the main reason most programming communities embark on the task of creating a new programming language is to overcome the limitations of current languages and to create a language that meets specific programming requirements. As an example, Pascal was developed as a teaching language, C was developed as a cross-platform systems language, and Ada was created to standardize embedded programming languages from the multitude of vendor languages available to the DoD.
Build a totally reliable 64-bit compiler that compiles reasonably fast and generates efficient code. Understand the execution cost of implementing specific constructs. Avoid bloated compilers that include virtually every kind of run-time support the processor is capable of providing. Incorporate automatic program verifiers and enforceable language rules so that antiquated debugging tools become no longer necessary.
A compiler must provide a simple and effective interface to the programmer. A well-thought out graphic user interface (GUI) improve programmer efficiency and understanding. The debugging capability must enable the programmer to pinpoint possible coding errors and make appropriate corrections.
A component library represents a collection of routines that extend the capability of a programming language and can be reused in many programs. Most programming languages include some form of libraries that perform text, math, input and output, and machine-level services. Most libraries must be declared in a program before they can be used.
Although the goal of many languages is to be able to write their libraries in their own language, this is not always possible or desirable. Our philosophy is to use popular, well-tested library components where possible using Win64 API and 64-bit C runtime library functions. We strive to not reinvent the wheel when these time-proven facilities are generally available to all Windows programmers.