All Topics  
Assembly language

 

   Email Print
   Bookmark   Link






 

Assembly language



 
 
See the terminology section below for information regarding inconsistent use of the terms assembly and assembler.


An assembly language is a low-level language for programming computer
Computer

A computer is a machine that manipulates Data according to a list of Code .The first devices that resemble modern computers date to the mid-20th century , although the computer concept and various machines similar to computers existed earlier....
s. It implements a symbolic representation of the numeric machine code
Machine code

Machine code or machine language is a system of instructions and data executed directly by a computer's central processing unit. Machine code may be regarded as a primitive programming language or as the lowest-level representation of a compiled and/or assembly language computer program....
s and other constants needed to program a particular CPU architecture. This representation is usually defined by the hardware manufacturer, and is based on abbreviations (called mnemonics
Mnemonic

A mnemonic device is a memory aid. Commonly met mnemonics are often verbal, something such as a very short poem or a special word used to help a person remember something, particularly lists, but may be visual, kinesthetic or auditory....
) that help the programmer remember individual instructions
Instruction (computer science)

In computer science, an instruction is a single operation of a central processing unit defined by an instruction set architecture. In a broader sense, an "instruction" may be any representation of an element of an executable program, such as a bytecode....
, registers
Processor register

In computer architecture, a processor register is a small amount of Computer storage available on the CPU whose contents can be accessed more quickly than storage available elsewhere....
, etc.






Discussion
Ask a question about 'Assembly language'
Start a new discussion about 'Assembly language'
Answer questions from other users
Full Discussion Forum



Encyclopedia


See the terminology section below for information regarding inconsistent use of the terms assembly and assembler.


An assembly language is a low-level language for programming computer
Computer

A computer is a machine that manipulates Data according to a list of Code .The first devices that resemble modern computers date to the mid-20th century , although the computer concept and various machines similar to computers existed earlier....
s. It implements a symbolic representation of the numeric machine code
Machine code

Machine code or machine language is a system of instructions and data executed directly by a computer's central processing unit. Machine code may be regarded as a primitive programming language or as the lowest-level representation of a compiled and/or assembly language computer program....
s and other constants needed to program a particular CPU architecture. This representation is usually defined by the hardware manufacturer, and is based on abbreviations (called mnemonics
Mnemonic

A mnemonic device is a memory aid. Commonly met mnemonics are often verbal, something such as a very short poem or a special word used to help a person remember something, particularly lists, but may be visual, kinesthetic or auditory....
) that help the programmer remember individual instructions
Instruction (computer science)

In computer science, an instruction is a single operation of a central processing unit defined by an instruction set architecture. In a broader sense, an "instruction" may be any representation of an element of an executable program, such as a bytecode....
, registers
Processor register

In computer architecture, a processor register is a small amount of Computer storage available on the CPU whose contents can be accessed more quickly than storage available elsewhere....
, etc. An assembly language is thus specific to a certain physical or virtual computer architecture (as opposed to most high-level languages, which are usually portable
Porting

In computer science, porting is the process of adapting software so that an executable Computer program can be created for a computing environment that is different from the one for which it was originally designed ....
).

Assembly languages were first developed in the 1950s, when they were referred to as second generation programming languages. They eliminated much of the error-prone and time-consuming first-generation programming needed with the earliest computers, freeing the programmer from tedium such as remembering numeric codes and calculating addresses. They were once widely used for all sorts of programming. However, by the 1980s (1990s on small computers
Microcomputer

A microcomputer is a computer with a microprocessor as its central processing unit. Another general characteristic of these computers is that they occupy physically small amounts of space when compared to mainframe computer and minicomputers....
), their use had largely been supplanted by high-level languages, in the search for improved programming productivity
Programming productivity

Programming productivity refers to a variety of software development issues and methodologies affecting the quantity and quality of code produced by an individual or team....
. Today, assembly language is used primarily for direct hardware manipulation, access to specialized processor instructions, or to address critical performance issues. Typical uses are device drivers, low-level embedded systems, and real-time
Real-time computing

In computer science, real-time computing is the study of Computer hardware and computer software systems that are subject to a "real-time constraint"?i.e., operational deadlines from event to system response....
 systems.

A utility program called an assembler is used to translate assembly language statements into the target computer's machine code. The assembler performs a more or less isomorphic
Isomorphism

In abstract algebra, an isomorphism is a bijection map f such that both f and its inverse function f −1 are homomorphisms, i.e., structure-preserving mappings....
 translation (a one-to-one mapping) from mnemonic
Mnemonic

A mnemonic device is a memory aid. Commonly met mnemonics are often verbal, something such as a very short poem or a special word used to help a person remember something, particularly lists, but may be visual, kinesthetic or auditory....
 statements into machine instructions and data. (This is in contrast with high-level languages, in which a single statement generally results in many machine instructions.)

Many sophisticated assemblers offer additional mechanisms to facilitate program development, control the assembly process, and aid debugging
Debugging

Debugging is a methodical process of finding and reducing the number of computer bugs, or defects, in a computer program or a piece of electronic hardware thus making it behave as expected....
. In particular, most modern assemblers (although many have been available for more than 40 years already) include a macro facility (described below), and are called macro assemblers.

Key concepts


Assembler

Compare with: Microassembler
Microassembler

A microassembler is a computer program that helps prepare a microcode to control the low level operation of a computer in much the same way an Assembly language#Assembler helps prepare higher level code for a central processing unit....
.
Typically a modern assembler creates object code by translating assembly instruction mnemonics into opcode
Opcode

In computer technology, an opcode is the portion of a machine language instruction that specifies the operation to be performed. Their specification and format are laid out in the instruction set architecture of the processor in question ....
s, and by resolving symbolic names
Identifier

In computer science, Identifiers are Lexical Token s that name entity. The concept is analogy to that of a "name". Identifiers are used extensively in virtually all information processing systems....
 for memory locations and other entities. The use of symbolic references is a key feature of assemblers, saving tedious calculations and manual address updates after program modifications. Most assemblers also include macro facilities for performing textual substitution—e.g., to generate common short sequences of instructions to run inline
Inline expansion

In computing, inline expansion, or inlining, is a compiler optimization that replaces a function call site with the body of the callee. This optimization may improve time and space usage at runtime, at the possible cost of increasing the size of the final program....
, instead of in a subroutine
Subroutine

In computer science, a subroutine or subprogram is a portion of computer code within a larger computer program, which performs a specific task and is relatively independent of the remaining code....
.

Assemblers are generally simpler to write than compiler
Compiler

A compiler is a computer program that transforms source code written in a programming language into another computer language . The most common reason for wanting to transform source code is to create an executable program....
s for high-level languages, and have been available since the 1950s. Modern assemblers, especially for RISC based architectures, such as MIPS
MIPS architecture

MIPS is a RISC instruction set architecture developed by MIPS Technologies . In the mid to late 1990s, it was estimated that one in three RISC microprocessors produced were MIPS implementations....
, Sun SPARC
SPARC

SPARC is a Reduced Instruction Set Computer microprocessor instruction set Computer architecture originally designed in 1985 by Sun Microsystems....
, HP PA-RISC and x86(-64), optimize instruction scheduling
Instruction scheduling

In computer science, instruction scheduling is a compiler optimization used to improve instruction-level parallelism, which improves performance on machines with instruction pipelines....
 to exploit the CPU pipeline efficiently.

More sophisticated high-level assembler
High-level assembler

High-level assemblers are assembly language translators that incorporate features found in modern high-level programming languages into an Assembly language#Assembler....
s provide language abstractions such as:
  • Advanced control structures
  • High-level procedure/function declarations and invocations
  • High-level abstract data types, including structures/records, unions, classes, and sets
  • Sophisticated macro processing
  • Object-Oriented features such as encapsulation, polymorphism, inheritance, interfaces
See Language design below for more details.

Note that, in normal professional usage, the term assembler is often used ambiguously: It is frequently used to refer to an assembly language itself, rather than to the assembler utility. Thus: "CP/CMS was written in S/360 assembler" as opposed to "ASM-H was a widely-used S/370 assembler."

Assembly language

A program written in assembly language consists of a series of instructions--mnemonics that correspond to a stream of executable instructions, when translated by an assembler
Assembly language

An assembly language is a low-level language for programming computers. It implements a symbolic representation of the numeric machine codes and other constants needed to program a particular CPU architecture....
, that can be loaded into memory and executed.

For example, an x86/IA-32
IA-32

IA-32 , often generically called x86 or x86-32, is the instruction set architecture of Intel's most commercially successful microprocessors....
 processor can execute the following binary instruction as expressed in machine language (see x86 assembly language
X86 assembly language

x86 assembly language is the family of backwards-compatible assembly languages for the x86 class of processors, which includes Intel's Pentium series and AMD's Athlon series....
):
  • Binary: 10110000 01100001 (Hexadecimal: B0 61)
The equivalent assembly language representation is easier to remember (example in Intel syntax, more mnemonic
Mnemonic

A mnemonic device is a memory aid. Commonly met mnemonics are often verbal, something such as a very short poem or a special word used to help a person remember something, particularly lists, but may be visual, kinesthetic or auditory....
):
  • MOV AL, #61h
This instruction means:
  • Move the value 61h (or 97 decimal
    Decimal

    The decimal numeral system has 10 as its Base . It is the most widely used numeral system....
    ; the h-suffix means hexadecimal
    Hexadecimal

    In mathematics and computer science, hexadecimal is a numeral system with a radix, or base, of 16. It uses sixteen distinct symbols, most often the symbols 09 to represent values zero to nine, and A, B, C, D, E, F to represent values ten to fifteen....
    ; the pound sign means move the immediate value, not location) into the processor register
    Processor register

    In computer architecture, a processor register is a small amount of Computer storage available on the CPU whose contents can be accessed more quickly than storage available elsewhere....
     named "AL".


The mnemonic "mov" represents the opcode 1011 which moves the value in the second operand into the register indicated by the first operand. The mnemonic was chosen by the instruction set designer to abbreviate "move", making it easier for the programmer to remember. A comma-separated list of arguments or parameters follows the opcode; this is a typical assembly language statement.

In practice many programmers drop the word mnemonic and, technically incorrectly, call "mov" an opcode. When they do this they are referring to the underlying binary code which it represents. To put it another way, a mnemonic such as "mov" is not an opcode, but as it symbolizes an opcode, one might refer to "the opcode mov" for example when one intends to refer to the binary opcode it symbolizes rather than to the symbol--the mnemonic--itself. As few modern programmers have need to be mindful of actually what binary patterns are the opcodes for specific instructions, the distinction has in practice become a bit blurred among programmers but not among processor designers.

Transforming assembly into machine language is accomplished by an assembler
Assembly language

An assembly language is a low-level language for programming computers. It implements a symbolic representation of the numeric machine codes and other constants needed to program a particular CPU architecture....
, and the reverse by a disassembler
Disassembler

A disassembler is a computer program that translates machine language into assembly language?the inverse operation to that of an Assembly language#Assembler....
. Unlike in high-level languages, there is usually a one-to-one correspondence between simple assembly statements and machine language instructions. However, in some cases, an assembler may provide pseudoinstructions which expand into several machine language instructions to provide commonly needed functionality. For example, for a machine that lacks a "branch if greater or equal" instruction, an assembler may provide a pseudoinstruction that expands to the machine's "set if less than" and "branch if zero (on the result of the set instruction)". Most full-featured assemblers also provide a rich macro language (discussed below) which is used by vendors and programmers to generate more complex code and data sequences.

Each computer architecture
Computer architecture

Computer architecture in computer engineering is the conceptual design and fundamental operational structure of a computer system. It is a blueprint and functional description of requirements and design implementations for the various parts of a computer, focusing largely on the way by which the central processing unit performs internally an...
 and processor architecture has its own machine language. On this level, each instruction is simple enough to be executed using a relatively small number of electronic circuits. Computers differ by the number and type of operations they support. For example, a new 64-bit machine would have different circuitry from a 32-bit machine. They may also have different sizes and numbers of registers, and different representations of data types in storage. While most general-purpose computers are able to carry out essentially the same functionality, the ways they do so differ; the corresponding assembly languages reflect these differences.

Multiple sets of mnemonic
Mnemonic

A mnemonic device is a memory aid. Commonly met mnemonics are often verbal, something such as a very short poem or a special word used to help a person remember something, particularly lists, but may be visual, kinesthetic or auditory....
s or assembly-language syntax may exist for a single instruction set, typically instantiated in different assembler programs. In these cases, the most popular one is usually that supplied by the manufacturer and used in its documentation.

Language design


Basic elements

Instructions (statements) in assembly language are generally very simple, unlike those in high-level languages
High-level programming language

In computing, a high-level programming language is a programming language with strong Abstraction from the details of the computer. In comparison to low-level programming languages, it may use natural language elements, be easier to use, or more Porting across platforms....
. Each instruction typically consists of an operation or opcode plus zero or more operands. Most instructions refer to a single value, or a pair of values. Generally, an opcode is a symbolic name for a single executable machine language instruction. Operands can be either immediate (typically one byte values, coded in the instruction itself) or the addresses of data located elsewhere in storage. This is determined by the underlying processor architecture: the assembler merely reflects how this architecture works.

Most modern assemblers also support pseudo-operations, which are directives obeyed by the assembler at assembly time instead of the CPU at run time. (For example, pseudo-ops would be used to reserve storage areas and optionally set their initial contents.) The names of pseudo-ops often start with a dot to distinguish them from machine instructions.

Some assemblers also support pseudo-instructions, which generate two or more machine instructions.

Symbolic assemblers allow programmers to associate arbitrary names (label
Label (programming language)

A label in a programming language is a sequence of characters that identifies a location within source code. In most languages labels take the form of an identifier, often followed by a punctuation ....
s
or symbols) with memory locations. Usually, every constant and variable is given a name so instructions can reference those locations by name, thus promoting self-documenting code. In executable code, the name of each subroutine is associated with its entry point, so any calls to a subroutine can use its name. Inside subroutines, GOTO
GOTO

GOTO is a statement found in many computer programming languages. It is a combination of the English words wiktionary:go and wiktionary:to....
 destinations are given labels. Some assemblers support local symbols which are lexically distinct from normal symbols (e.g., the use of "10$" as a GOTO destination).

Most assemblers provide flexible symbol management, allowing programmers to manage different namespaces
Namespace (computer science)

A namespace is an abstract container or environment created to hold a logical grouping of unique identifiers or symbols . An identifier defined in a namespace is associated with that namespace....
, automatically calculate offsets within data structures, and assign labels that refer to literal values or the result of simple computations performed by the assembler. Labels can also be used to initialize constants and variables with relocatable addresses.

Assembly languages, like most other computer languages, allow comments to be added to assembly source code
Source code

In computer science, source code is any collection of statements or declarations written in some human-readable computer programming language....
 that are ignored by the assembler. Good use of comments is even more important with assembly code than with higher-level languages, as the meaning of a sequence of instructions is harder to decipher from the code itself.

Wise use of these facilities can greatly simplify the problems of coding and maintaining low-level code. Raw assembly source code as generated by compilers or disassemblers — code without any comments, meaningful symbols, or data definitions — is quite difficult to read when changes must be made.

Macros

Many assemblers support macros, programmer-defined symbols that stand for some sequence of text lines. This sequence of text lines may include a sequence of instructions, or a sequence of data storage pseudo-ops. Once a macro has been defined using the appropriate pseudo-op, its name may be used in place of a mnemonic. When the assembler processes such a statement, it replaces the statement with the text lines associated with that macro, then processes them just as though they had appeared in the source code file all along (including, in better assemblers, expansion of any macros appearing in the replacement text).

Since macros can have 'short' names but expand to several or indeed many lines of code, they can be used to make assembly language programs appear to be much shorter (require less lines of source code from the application programmer - as with a higher level language). They can also be used to add higher levels of structure to assembly programs, optionally introduce embedded de-bugging code via parameters and other similar features.

Many assemblers have built-in macros for system calls and other special code sequences.

Macro assemblers often allow macros to take parameter
Parameter (computer science)

In computer programming, a parameter is a special kind of variable#In_computer_programming that refers to data that a subroutine receives to operate on....
s. Some assemblers include quite sophisticated macro languages, incorporating such high-level language elements as optional parameters, symbolic variables, conditionals, string manipulation, and arithmetic operations, all usable during the execution of a given macros, and allowing macros to save context or exchange information. Thus a macro might generate a large number of assembly language instructions or data definitions, based on the macro arguments. This could be used to generate record-style data structures or "unrolled" loops, for example, or could generate entire algorithms based on complex parameters. An organization using assembly language that has been heavily extended using such a macro suite can be considered to be working in a higher-level language, since such programmers are not working with a computer's lowest-level conceptual elements.

Macros were used to customize large scale software systems for specific customers in the mainframe era and were also used by customer personnel to satisfy their employers' needs by making specific versions of manufacturer operating systems; this was done, for example, by systems programmers working with IBM's Conversational Monitor System/Virtual Machine (CMS/VM) and with IBM
IBM

International Business Machines Corporation, abbreviated IBM and nicknamed "Big Blue" , is a multinational corporation computer technology and consulting corporation headquartered in Armonk, New York, New York, United States....
's "real time transaction processing" add-on, Customer Information Control System, CICS
CICS

CICS is a transaction server that runs primarily on IBM mainframe systems under z/OS and z/VSE.CICS is a transaction manager designed for rapid, high-volume online processing....
 and the airline/financial system that began in the 1970s and still runs many large Global Distribution Systems (GDS) and credit card systems today, TPF.

It was also possible to use solely the macro processing capabilities of an assembler to generate code written in completely different languages, for example, to generate a version of a program in Cobol using a pure macro assembler program containing lines of Cobol code inside assembly time operators instructing the assembler to generate arbitrary code.

This was because, as was realized in the 1970s, the concept of "macro processing" is independent of the concept of "assembly", the former being in modern terms more word processing, text processing, than generating object code. The concept of macro processing in fact appeared in and appears in the C programming language, which supports "preprocessor instructions" to set variables, and make conditional tests on their values. Note that unlike certain previous macro processors inside assemblers, the C preprocessor was not Turing-complete
Turing completeness

In Computability theory , several closely-related terms are used to describe the "computational power" of a computational system :Turing completenessTuring equivalence universality...
 because it lacked the ability to either loop or "go to", the latter allowing the programmer to loop.

Despite the power of macro processing, it fell into disuse in high level languages while remaining a perennial for assemblers.

This was because many programmers were rather confused by macro parameter substitution and did not disambiguate macro processing from assembly and execution.

Macro parameter substitution is strictly by name: at macro processing time, the value of a parameter is textually substituted for its name. The most famous class of bugs resulting was the use of a parameter that itself was an expression and not a simple name when the macro writer expected a name. In the macro: foo: macro a load a*b the intention was that the caller would provide the name of a variable, and the "global" variable or constant b would be used to multiply "a". If foo is called with the parameter a-c, an unexpected macro expansion occurs.

To avoid this, users of macro processors learned to religiously parenthesize formal parameters inside macro definitions, and callers had to do the same to their "actual" parameters.

PL/I and C feature macros, but this facility was underused or dangerous when used because they can only manipulate text. On the other hand, homoiconic languages, such as Lisp, Prolog
Prolog

Prolog is a logic programming language. It is a general purpose language often associated with artificial intelligence and computational linguistics....
, and Forth
Forth

Forth is a structured programming, imperative programming, stack-oriented programming language, computer programming programming language and programming environment....
, retain the power of assembly language macros because they are able to manipulate their own code as data.

Support for structured programming

Some assemblers have incorporated structured programming
Structured programming

Structured programming can be seen as a subset or subdiscipline of procedural programming, one of the major programming paradigms. It is most famous for removing or reducing reliance on the GOTO Statement ....
 elements to encode execution flow. The earliest example of this approach was in the Concept-14 macro set developed by Marvin Zloof at IBM's Thomas Watson Research Center, which extended the S/370 macro assembler with IF/ELSE/ENDIF and similar control flow blocks. This was a way to reduce or eliminate the use of GOTO
GOTO

GOTO is a statement found in many computer programming languages. It is a combination of the English words wiktionary:go and wiktionary:to....
 operations in assembly code, one of the main factors causing spaghetti code
Spaghetti code

Spaghetti code is a pejorative term for source code which has a complex and tangled control structure, especially one using many GOTOs, exceptions, threads, or other "unstructured" Branch constructs....
 in assembly language. This approach was widely accepted in the early 80s (the latter days of large-scale assembly language use).

A curious design was A-natural, a "stream-oriented" assembler for 8080/Z80 processors from Whitesmiths Ltd.
Whitesmiths

Whitesmiths Ltd. was a software company based in Westford, Massachusetts. It sold a Unix-like operating system called Idris , as well as the first commercial C compiler....
 (developers of the Unix
Unix

Unix is a computer operating system originally developed in 1969 by a group of American Telephone & Telegraph employees at Bell Labs, including Ken Thompson , Dennis Ritchie, Douglas McIlroy, and Joe Ossanna....
-like Idris
Idris (operating system)

Idris is a multi-tasking, Unix-like, multi-user, real-time operating system released by Whitesmiths, of Westford, Massachusetts. The product was commercially available from 1979 through 1988....
 operating system, and what was reported to be the first commercial C
C (programming language)

C is a general-purpose computer programming language originally developed in 1972 by Dennis Ritchie at the Bell Telephone Laboratories to implement the Unix operating system....
 compiler
Compiler

A compiler is a computer program that transforms source code written in a programming language into another computer language . The most common reason for wanting to transform source code is to create an executable program....
). The language was classified as an assembler, because it worked with raw machine elements such as opcodes, registers, and memory references; but it incorporated an expression syntax to indicate execution order. Parentheses and other special symbols, along with block-oriented structured programming constructs, controlled the sequence of the generated instructions. A-natural was built as the object language of a C compiler, rather than for hand-coding, but its logical syntax won some fans.

There has been little apparent demand for more sophisticated assemblers since the decline of large-scale assembly language development. In spite of that, they are still being developed and applied in cases where resource constraints or peculiarities in the target system's architecture prevent the effective use of higher-level languages.

Use of assembly language


Historical perspective

Historically, a large number of programs have been written entirely in assembly language. Operating systems were almost exclusively written in assembly language until the widespread acceptance of C
C (programming language)

C is a general-purpose computer programming language originally developed in 1972 by Dennis Ritchie at the Bell Telephone Laboratories to implement the Unix operating system....
 in the 1970s and early 1980s. Many commercial applications were written in assembly language as well, including a large amount of the IBM mainframe software written by large corporations. COBOL
COBOL

COBOL is one of the oldest programming languages still in active use. Its name is an acronym for COmmon Business-Oriented Language, defining its primary domain in business, finance, and administrative systems for companies and governments....
 and FORTRAN
Fortran

Fortran is a general-purpose programming language, procedural programming language, imperative programming language programming language that is especially suited to numerical analysis and scientific computing....
 eventually displaced much of this work, although a number of large organizations retained assembly-language application infrastructures well into the 90s.

Most early microcomputers relied on hand-coded assembly language, including most operating systems and large applications. This was because these systems had severe resource constraints, imposed idiosyncratic memory and display architectures, and provided limited, buggy system services. Perhaps more important was the lack of first-class high-level language compilers suitable for microcomputer use. A psychological factor may have also played a role: the first generation of microcomputer programmers retained a hobbyist, "wires and pliers" attitude.

In a more commercial context, the biggest reasons for using assembly language were size, speed, and reliability: the writers of said simply "we use assembler because then all the bugs are ours". This held true for 8-bit versions of the program, which had no bugs at all, but ironically it turned out to be false with 16 bits: Cardbox-Plus 2.0 had to be upgraded to Cardbox-Plus 2.1 because a bug in Microsoft's macro assembler caused Cardbox-Plus to index the number "-0" differently from the number "0".

Typical examples of large assembly language programs from this time are the MS-DOS
MS-DOS

MS-DOS is an operating system commercialized by Microsoft. It was the most commonly used member of the DOS family of operating systems and was the main operating system for personal computers during the 1980s....
 operating system, the early IBM PC spreadsheet
Spreadsheet

A spreadsheet is a computer application that simulates a paper worksheet. It displays multiple cells that together make up a grid consisting of rows and columns, each cell containing either alphanumeric text or numeric values....
 program Lotus 1-2-3
Lotus 1-2-3

Lotus 1-2-3 is a spreadsheet program from Lotus Software . It was the IBM PC's first "killer application"; its huge popularity in the mid-1980s contributed significantly to the success of the IBM PC in the corporate environment....
, and almost all popular games for the Atari 800 family of home computers. Even into the 1990s, most console video games were written in assembly, including most games for the Mega Drive/Genesis
Sega Mega Drive

The is a History of video game consoles video game console released by Sega in Japan in 1988, North America in 1989, and the PAL region in 1990. Mega Drive was the name used in Japan and Europe, while it was sold under the name Sega Genesis in North America, as Sega was unable to secure legal rights to the Mega Drive name in that region....
 and the Super Nintendo Entertainment System
Super Nintendo Entertainment System

The Super Nintendo Entertainment System or Super NES is a History of video game consoles video game console that was released by Nintendo in North America, Europe, Australasia , and South America between 1990 and 1993....
 . According to some industry insiders, the assembly language was the best computer language to use to get the best performance out of the Sega Saturn
Sega Saturn

The is a 32-bit video game console that was first released on November 22 1994 in Japan, May 11 1995 in North America, and July 8 1995 in Europe. The system was discontinued in 2000 in video gaming in Japan and in 1998 in video gaming in other countries....
, a console that was notoriously challenging to develop and program games for . The popular arcade game NBA Jam
NBA Jam

NBA Jam is a basketball arcade game video game developer by Midway Games in 1993 in video gaming. It is the first entry in the NBA Jam series, and was written entirely in assembly language....
 (1993) is another example. On the Commodore 64, Amiga, Atari ST, as well as ZX Spectrum home computers, assembler has long been the primary development language. This was in large part due to the fact that BASIC dialects on these systems offered insufficient execution speed, as well as insufficient facilities to take full advantage of the available hardware on these systems. Some systems, most notably Amiga, even have IDEs with highly advanced debugging and macro facilities, such as the freeware , comparable to that of Microsoft Visual Studio
Microsoft Visual Studio

Microsoft Visual Studio is an integrated development environment from Microsoft. It can be used to develop Console application and graphical user interface applications along with Windows Forms applications, web sites, web applications, and web services in both native code together with managed code for all platforms supported by Microsoft W...
 facilities (ASM-One predates Microsoft Visual Studio).

The Assembler for the VIC-20 was written by Don French and published by French Silk. At 1639 bytes in length, its author believes it is the smallest symbolic assembler ever written. The assembler supported the usual symbolic addressing and the definition of character strings or hex strings. It also allowed address expressions which could be combined with addition
Addition

Addition is the mathematics process of putting things together. The plus sign "+" means that numbers are added together. For example, in the picture on the right, there are 3 + 2 apples?meaning three apples and two other apples?which is the same as five apples, since 3 + 2 = 5....
, subtraction
Subtraction

Subtraction is one of the four basic arithmetic operations; it is the inverse of addition, meaning that if we start with any number and add any number and then subtract the same number we added, we return to the number we started with....
, multiplication
Multiplication

Multiplication is the Operation of scaling one number by another. It is one of the four basic operations in elementary arithmetic .Multiplication is defined for Natural number in terms of repeated addition; for example, 4 multiplied by 3 can be calculated by adding 3 copies of 4 together:...
, division
Division (mathematics)

In mathematics, especially in elementary arithmetic, division is an arithmetic operation which is the inverse of multiplication.Specifically, if c times b equals a, written:...
, logical AND, logical OR, and exponentiation
Exponentiation

Exponentiation is a mathematics operation , written 'an', involving two numbers, the base a and the exponent n....
 operators.

Current usage

There have always been debates over the usefulness and performance of assembly language relative to high-level languages. Assembly language has specific niche uses where it is important; see below. But in general, modern optimizing compilers are claimed to render high-level languages into code that can run as fast as hand-written assembly, despite some counter-examples that can be created. The complexity of modern processors makes effective hand-optimization increasingly difficult. Moreover, and to the dismay of efficiency lovers, increasing processor performance has meant that most CPUs sit idle most of the time, with delays caused by predictable bottlenecks such as I/O
I/O

I/O may refer to:* Input/output, a system of communication for information processing systems* The input-output model, an economic model of flow prediction between sectors...
 operations and paging
Paging

In computer operating systems that have their main memory divided into page , paging is a transfer of pages between main memory and an auxiliary store, such as hard disk drive....
. This has made raw code execution speed a non-issue for most programmers.

Here are some situations in which practitioners might choose to use assembly language:
  • When a stand-alone binary executable is required, i.e. one that must execute without recourse to the run-time components or libraries
    Library (computer science)

    In computer science, a library is a collection of subroutines or Class used to develop software. Libraries contain code and data that provide services to independent programs....
     associated with a high-level language; this is perhaps the most common situation. These are embedded programs that store only a small amount of memory and the device is intended to do single purpose tasks. Such examples consist of telephones, automobile fuel and ignition systems, air-conditioning control systems, security systems, and sensors.
  • When interacting directly with the hardware, for example in device driver
    Device driver

    In computing, a device driver or software driver is a computer program allowing higher-level computer programs to interact with a hardware device....
    s.
  • When using processor-specific instructions not exploited by or available to the compiler. A common example is the bitwise rotation
    Circular shift

    In combinatorics mathematics, a circular shift is a permutation of the entries in a tuple where the last element becomes the first element and all the other elements are shifted, or where the first element becomes the last element and all the other are shifted....
     instruction at the core of many encryption algorithms.
  • Embedded systems.
  • When extreme optimization is required, e.g., in an inner loop
    Control flow

    In computer science control flow refers to the order in which the individual statement , Instruction or function calls of an imperative programming or functional programming computer program are execution or evaluated....
     in a processor-intensive algorithm. Some game programmer
    Game programmer

    A game programmer is a programmer who primarily develops video games or related software . Game programming has many specialized disciplines; practitioners of any may regard themselves as "game programmers"....
    s are experts at writing code that takes advantage of the capabilities of hardware features in systems enabling the games to run faster.
  • When a system with severe resource constraints (e.g., an embedded system
    Embedded system

    An embedded system is a special-purpose computer system designed to perform one or a few dedicated functions, often with real-time computing constraints....
    ) must be hand-coded to maximize the use of limited resources; but this is becoming less common as processor price/performance improves
  • When no high-level language exists, e.g., on a new or specialized processor
  • Real-time
    Real-time computing

    In computer science, real-time computing is the study of Computer hardware and computer software systems that are subject to a "real-time constraint"?i.e., operational deadlines from event to system response....
     programs that need precise timing and responses, such as simulations, flight navigation systems, and medical equipment. (For example, in a fly-by-wire system, telemetry must be interpreted and acted upon within strict time constraints. Such systems must eliminate sources of unpredictable delays – such as may be created by interpreted languages, automatic garbage collection
    Garbage collection (computer science)

    In computer science, garbage collection is a form of automatic memory management. The garbage collector, or just collector, attempts to reclaim garbage , or memory used by Object that will never be accessed or mutated again by the Application software....
    , paging operations, or preemptive multitasking. Some higher-level languages incorporate run-time components and operating system interfaces that can introduce such delays. Choosing assembly or lower-level languages for such systems gives the programmer greater visibility and control over processing details.)
  • When complete control over the environment is required (for example in extremely high security situations, where nothing can be taken for granted).
  • When writing computer virus
    Computer virus

    A computer virus is a computer program that can copy itself and infect a computer without the permission or knowledge of the user. The term "virus" is also commonly but erroneously used to refer to other types of malware, adware and spyware programs that do not have the reproductive ability....
    es, bootloaders, certain device driver
    Device driver

    In computing, a device driver or software driver is a computer program allowing higher-level computer programs to interact with a hardware device....
    s, or other items very close to the hardware or low-level operating system.
  • When reverse-engineering existing binaries
    Binary file

    A binary file is a computer file which may contain any type of data, encoded in Binary numeral system form for computer storage and processing purposes; for example, Document file format containing formatted text....
    , which may or may not have originally been written in a high-level language, for example when cracking copy protection of proprietary software.
  • Reverse engineering
    Reverse engineering

    Reverse engineering is the process of discovering the technological principles of a device, object or system through analysis of its structure, function and operation....
     and modification of video games (known as ROM Hacking
    ROM hacking

    ROM hacking is the process of modifying a video game ROM image to alter the game's graphics, dialogue, levels, gameplay, or other gameplay elements....
    ), commonly done to games for Nintendo
    Nintendo

    is a global company located in Kyoto, Japan founded on September 23, 1889 by Fusajiro Yamauchi to produce handmade hanafuda cards. By 1963, the company had tried several small niche businesses, such as a cab company and a love hotel....
     hardware such as the SNES
    Super Nintendo Entertainment System

    The Super Nintendo Entertainment System or Super NES is a History of video game consoles video game console that was released by Nintendo in North America, Europe, Australasia , and South America between 1990 and 1993....
     and NES
    Nintendo Entertainment System

    The Nintendo Entertainment System is an 8-bit video game console that was released by Nintendo in North America, Europe and Australia in . In most of Asia, including Japan , the Philippines, China, Vietnam and Singapore, it was released as the ....
    , is possible with a range of techniques, of which the most widely employed is altering the program code at the assembly language level.
  • Assembly language lends itself well to applications requiring Self modifying code.
  • Assembly language is sometimes used for writing games
    Calculator gaming

    Calculator gaming is the phenomenon of programming and playing Video game on programmable calculators, especially graphing calculators. It is largely a pastime of high school and college students, who generally are required to use such powerful calculators in advanced mathematics classes; as a result, it is sometimes a clandestine activity do...
     and other software for graphing calculator
    Graphing calculator

    A graphing calculator typically refers to a class of handheld calculators that are capable of plotting graph of a function, solving simultaneous equations, and performing numerous other tasks with variables....
    s.
  • Finally, compiler writers usually write software that generates assembly code, and should therefore be expert assembly language programmers themselves.


Nevertheless, assembly language is still taught in most Computer Science
Computer science

Computer science is the study of the theoretical foundations of information and computation, and of practical techniques for their implementation and application in computer systems....
 and Electronic Engineering
Electronic engineering

Electronic engineering is a discipline dealing with the behavior and effects of electrons and with electronic devices, systems, or equipment.The term now also covers a large part of electrical engineering degree courses as studied at most European universities....
 programs. Although few programmers today regularly work with assembly language as a tool, the underlying concepts remain very important. Such fundamental topics as binary arithmetic, memory allocation, stack processing
Stack (data structure)

In computer science, a stack is an abstract data type and data structure based on the principle of LIFO . Stacks are used extensively at every level of a modern computer system....
, character set encoding, interrupt
Interrupt

In computing, an interrupt is an asynchronous communication signal from hardware indicating the need for attention or a synchronous event in software indicating the need for a change in execution....
 processing, and compiler
Compiler

A compiler is a computer program that transforms source code written in a programming language into another computer language . The most common reason for wanting to transform source code is to create an executable program....
 design would be hard to study in detail without a grasp of how a computer operates at the hardware level. Since a computer's behavior is fundamentally defined by its instruction set, the logical way to learn such concepts is to study an assembly language. Most modern computers have similar instruction sets. Therefore, studying a single assembly language is sufficient to learn: i) The basic concepts; ii) To recognize situations where the use of assembly language might be appropriate; and iii) To see how efficient executable code can be created from high-level languages.

Typical applications

Hard-coded assembly language is typically used in a system's boot ROM (BIOS
BIOS

In computing, the Basic Input/Output System , also known as the System BIOS, is a de facto standard defining a firmware interface for IBM PC Compatible computers....
 on IBM-compatible PC
Personal computer

A personal computer is any general-purpose computer whose original sales price, size, and capabilities make it useful for individuals, and which is intended to be operated directly by an end user, with no intervening computer operator....
 systems). This low-level code is used, among other things, to initialize and test the system hardware prior to booting the OS, and is stored in ROM
Read-only memory

Read-only memory is a class of computer storage media used in computers and other electronic devices. Because data stored in ROM cannot be modified , it is mainly used to distribute firmware ....
. Once a certain level of hardware initialization has taken place, execution transfers to other code, typically written in higher level languages; but the code running immediately after power is applied is usually written in assembly language. The same is true of most boot loaders.

Many compilers render high-level languages into assembly first before fully compiling, allowing the assembly code to be viewed for debugging and optimization purposes. Relatively low-level languages, such as C
C (programming language)

C is a general-purpose computer programming language originally developed in 1972 by Dennis Ritchie at the Bell Telephone Laboratories to implement the Unix operating system....
, often provide special syntax
Syntax of programming languages

In computer science, the syntax of a programming language is the set of rules that define the combinations of symbols that are considered to be syntactically correct computer programs in that language....
 to embed assembly language directly in the source code. Programs using such facilities, such as the Linux kernel
Linux kernel

The Linux kernel is an operating system kernel used by a family of Unix-like operating systems. The term Linux distribution is used to refer to the various operating systems that run on top of the Linux Kernel....
, can then construct abstractions utilizing different assembly language on each hardware platform. The system's portable
Software portability

Portability is one of the key concepts of High-level programming language. Portability is the software codebase feature to be able to reuse the existing code instead of creating new code when moving software from an environment to another....
 code can then utilize these processor-specific components through a uniform interface.

Assembly language is also valuable in reverse engineering
Reverse engineering

Reverse engineering is the process of discovering the technological principles of a device, object or system through analysis of its structure, function and operation....
, since many programs are distributed only in machine code form, and machine code is usually easy to translate into assembly language and carefully examine in this form, but very difficult to translate into a higher-level language. Tools such as the Interactive Disassembler
Interactive Disassembler

The Interactive Disassembler, more commonly known as simply IDA, is a commercial disassembler widely used for reverse engineering. It supports a variety of executables for different Central processing units and operating systems....
 make extensive use of disassembly for such a purpose.

A particular niche that makes use of assembly language is the demoscene
Demoscene

The demoscene is a computer art subculture that specializes in producing Demo , which are non-interactive audio-visual presentations that run in Real-time computing on a computer....
. Certain competitions require the contestants to restrict their creations to a very small size (e.g. 256B, 1KB
Kilobyte

Kilobyte is a unit of Computer data storage equal to either 1,024 bytes or 1,000 bytes , depending on context.It is abbreviated in a number of ways: KB, kB, K and Kbyte....
, 4KB or 64 KB), and assembly language is the language of choice to achieve this goal. When resources, particularly CPU-processing constrained systems, like the earlier Amiga
Amiga

The Amiga is a family of personal computers originally developed by Amiga Corporation. Development on the Amiga began in 1982 with Jay Miner as the principal hardware designer....
 models, and the Commodore 64
Commodore 64

The Commodore 64 is an 8-bit home computer released by Commodore International in August, 1982, at a price of United States dollar595. Preceded by the Commodore VIC-20 and Commodore MAX Machine, the C64 features 64 kilobytes of Random-access memory with sound and graphics performance that were superior to IBM-compatible computers of tha...
, are a concern, assembler coding is a must: optimized assembler code is written "by hand" and instructions are sequenced manually by the coders
Programmer

A programmer is someone who writes computer software. The term computer programmer can refer to a specialist in one area of computer programming or to a generalist who writes code for many kinds of software....
 in an attempt to minimize the number of CPU cycles used; the CPU constraints are so great that every CPU cycle counts. However, using such techniques has enabled systems like the Commodore 64 to produce real-time 3D graphics with advanced effects, a feat which might be considered unlikely or even impossible for a system with a 0.99MHz processor.

Related terminology

  • Assembly language or assembler language is commonly called assembly, assembler, ASM, or symbolic machine code. A generation of IBM mainframe programmers called it BAL for Basic Assembly Language.


Note: Calling the language assembler is of course potentially confusing and ambiguous, since this is also the name of the utility program that translates assembly language statements into machine code. Some may regard this as imprecision or error. However, this usage has been common among professionals and in the literature for decades. Similarly, some early computers called their assembler its assembly program.)

  • The computational step where an assembler is run, including all macro processing, is known as assembly time.


  • The use of the word assembly dates from the early years of computers (cf. short code
    Short Code (Computer language)

    Short Code was one of the first higher-level languages ever developed for an electronic computer. Unlike machine code Short Code statements represented mathematic expressions rather than a machine instruction....
    , speedcode
    Speedcoding

    Speedcoding or Speedcode was the first higher-level language created for an IBM computer . The language was developed by John Backus in 1953 for the IBM 701 to support computation with floating point ....
    ).


  • A cross assembler (see cross compiler
    Cross compiler

    A cross compiler is a compiler capable of creating executable code for a platform other than the one on which the compiler is run. Cross compiler programming tools are used to generate executables for embedded system or multiple platforms....
    ) produces code using one type of processor, which runs on a different type of processor. This technology is particularly important when developing software for new processors, or when developing for embedded systems. This allows, for instance, a 32-bit x86 processor to assemble code to run on a 64-bit x64 processor.


  • An assembler directive is a command given to an assembler. These directives may do anything from telling the assembler to include other source files, to telling it to allocate memory for constant data.


Further details

For any given personal computer, mainframe, embedded system, and game console, both past and present, at least one--possibly dozens--of assemblers have been written. For some examples, see the list of assemblers
List of assemblers

This is a list of assemblers: software programs that translate assembly language source code into binary programs....
.

On Unix
Unix

Unix is a computer operating system originally developed in 1969 by a group of American Telephone & Telegraph employees at Bell Labs, including Ken Thompson , Dennis Ritchie, Douglas McIlroy, and Joe Ossanna....
 systems, the assembler is traditionally called as
As (Unix)

as is a generic name for an assembly language#Assembler on Unix. The GNU Project's assembler is named GNU assembler....
, although it is not a single body of code, being typically written anew for each port. A number of Unix variants use GAS
GNU Assembler

The GNU Assembler, commonly known as Gas, is the assembler used by the GNU Project. It is the default back-end of GNU Compiler Collection....
.

Within processor groups, each assembler has its own dialect. Sometimes, some assemblers can read another assembler's dialect, for example, TASM
Tasm

TASM can refer to:*Turbo Assembler, the X86 Assembly_language#Assembler*Table Assembler, a table driven cross-assembler for small microprocessors....
 can read old MASM code, but not the reverse. FASM
FASM

FASM is a free and open source x86 assembly language Assembly language#Assembler supporting the IA-32 and x86-64 architectures. It is known for its high speed, size optimizations, OS portability, and Macro capabilities....
 and NASM have similar syntax, but each support different macros that could make them difficult to translate to each other. The basics are all the same, but the advanced features will differ.

Also, assembly can sometimes be portable across different operating systems on the same type of CPU. Calling convention
Calling convention

In computer science, a calling convention is a scheme for how function s receive parameters from their caller and how they return a result; calling conventions can differ in:...
s between operating systems often differ slightly or not at all, and with care it is possible to gain some portability in assembly language, usually by linking with a C
C (programming language)

C is a general-purpose computer programming language originally developed in 1972 by Dennis Ritchie at the Bell Telephone Laboratories to implement the Unix operating system....
 library that does not change between operating systems.

For example, many things in libc depend on the preprocessor to do OS-specific, C-specific things to the program before compiling. In fact, some functions and symbols are not even guaranteed to exist outside of the preprocessor. Worse, the size and field order of structs, as well as the size of certain typedef
Typedef

typedef is a keyword in the C and C++ programming languages. It is used to give a data type a new name. The intent is to make it easier for programmers to comprehend source code....
s such as off_t, are entirely unavailable in assembly language without help from a configure script, and differ even between versions of Linux
Linux

Linux is a generic term referring to Unix-like computer operating systems based on the Linux kernel. Their development is one of the most prominent examples of free and open source software collaboration; typically all the underlying source code can be used, freely modified, and redistributed by anyone under the terms of the GNU GPL license...
, making it impossible to portably call functions in libc other than ones that only take simple integers and pointers as parameters. To address this issue, FASMLIB
FASMLIB

FASMLIB is a portable general-purpose library for the x86 series of processors written in 32 bit assembly language. It supports FASM, MASM and NASM_/Yasm, on Microsoft Windows and Linux....
 project provides a portable assembly library for Win32 and Linux platforms, but it is yet very incomplete.

Some higher level computer languages, such as C
C (programming language)

C is a general-purpose computer programming language originally developed in 1972 by Dennis Ritchie at the Bell Telephone Laboratories to implement the Unix operating system....
 and Borland Pascal, support inline assembly
Inline assembler

In computer programming, the inline assembler is a feature of some compilers that allows very low level code written in Assembly Language to be embedded in a high level language like C or Ada programming language....
 where relatively brief sections of assembly code can be embedded into the high level language code. The Forth programming language commonly contains an assembler used in CODE words.

Many people use an emulator
Emulator

An emulator duplicates the functions of one system using a different system, so that the second system behaves like the first system. This focus on exact reproduction of external behavior is in contrast to some other forms of computer simulation, which can concern an abstract model of the system being simulated....
 to debug assembly-language programs.

Example listing of assembly language source code

Address Label Instruction (AT&T syntax) Object code
  .begin 
  .org 2048 
 a_start.equ 3000 
2048 ld length,%
2064 be done00000010 10000000 00000000 00000110
2068 addcc %r1,-4,%r110000010 10000000 01111111 11111100
2072 addcc %r1,%r2,%r410001000 10000000 01000000 00000010
2076 ld %r4,%r511001010 00000001 00000000 00000000
2080 ba loop00010000 10111111 11111111 11111011
2084 addcc %r3,%r5,%r310000110 10000000 11000000 00000101
2088done:jmpl %r15+4,%r010000001 11000011 11100000 00000100
2092length:2000000000 00000000 00000000 00010100
2096address:a_start00000000 00000000 00001011 10111000
  .org a_start 
3000a:


Example of a selection of instructions (for a virtual computer
Universal Virtual Computer

A Universal Virtual Computer is much like a virtual machine in computing by means that it creates a layer between the underlying computer platform and upperlying software....
) with the corresponding address
Memory address

In computer science, a memory address is an identifier for a computer memory location, at which a computer program or a hardware device can store a piece of data and later retrieve it....
 in memory where each instruction will be placed. These addresses are not static, see memory management
Memory management

Memory management is the act of managing computer memory. In its simpler forms, this involves providing ways to allocate portions of memory to programs at their request, and freeing it for reuse when no longer needed....
. Accompanying each instruction is the generated (by the assembler) object code
Object file

In computer science, object code, or an object file, is the representation of code that a compiler or assembler generates by processing a source code file....
 that coincides with the virtual computer's architecture (or ISA
Instruction set

An instruction set is a list of all the instruction , and all their variations, that a processor can execute.Instructions include:* Arithmetic such as add and subtract...
).

See also

  • Little man computer
    Little man computer

    The Little Man Computer is an instructional Model of a computer, created by Dr. Stuart Madnick in 1965. The LMC is generally used to teach students, because it models a simple von Neumann architecture computer - which has all of the basic features of a modern computer....
     - an educational computer model with a base-10 assembly language
  • x86 assembly language
    X86 assembly language

    x86 assembly language is the family of backwards-compatible assembly languages for the x86 class of processors, which includes Intel's Pentium series and AMD's Athlon series....
     - the assembly language for common Intel 80x86
    X86 architecture

    The generic term x86 refers to the most commercially successful instruction set architecture in the history of personal computing. It derived from the model numbers, ending in "86", of the first few processor generations Backward compatibility with the original Intel 8086....
     microprocessors
  • Compiler
    Compiler

    A compiler is a computer program that transforms source code written in a programming language into another computer language . The most common reason for wanting to transform source code is to create an executable program....
  • Disassembler
    Disassembler

    A disassembler is a computer program that translates machine language into assembly language?the inverse operation to that of an Assembly language#Assembler....
  • List of assemblers
    List of assemblers

    This is a list of assemblers: software programs that translate assembly language source code into binary programs....
  • Instruction set
    Instruction set

    An instruction set is a list of all the instruction , and all their variations, that a processor can execute.Instructions include:* Arithmetic such as add and subtract...
  • Microassembler
    Microassembler

    A microassembler is a computer program that helps prepare a microcode to control the low level operation of a computer in much the same way an Assembly language#Assembler helps prepare higher level code for a central processing unit....
  • MACRO-11
    MACRO-11

    MACRO-11 is an assembly language with Macro facilities for PDP-11 minicomputers from Digital Equipment Corporation . It is the successor to PAL-11 , an earlier version of the PDP-11 assembly language without Macro facilities....


Further reading

  • Michael Singer, PDP-11. Assembler Language Programming and Machine Organization, John Wiley & Sons, NY: 1980.
  • Peter Norton, John Socha, Peter Norton's Assembly Language Book for the IBM PC, Brady Books, NY: 1986.
  • Dominic Sweetman: See MIPS Run. Morgan Kaufmann Publishers, 1999. ISBN 1-55860-410-3
  • John Waldron: Introduction to RISC Assembly Language Programming. Addison Wesley, 1998. ISBN 0-201-39828-1
  • Jeff Duntemann: Assembly Language Step-by-Step. Wiley, 2000. ISBN 0-471-37523-3
  • Paul Carter: PC Assembly Language. Free ebook, 2001.
  • Robert Britton: MIPS Assembly Language Programming. Prentice Hall, 2003. ISBN 0-13-142044-5
  • Randall Hyde: The Art of Assembly Language. No Starch Press, 2003. ISBN 1-886411-97-2
    Draft versions as PDF and HTML
  • Jonathan Bartlett: . Bartlett Publishing, 2004. ISBN 0-9752838-4-7
    Also available online
  • "An online book full of helpful ASM info, tutorials and code examples" by the ASM Community


External links

  • , a programming resource about assembly including a and an
  • (a cheat sheet reference)
  • IBM manuals on mainframe
    Mainframe computer

    Mainframes are computers used mainly by large organizations for critical applications, typically bulk data processing such as census, industry and consumer statistics, Enterprise Resource Planning, and financial transaction processing....
     machine language and internals.
  • IBM manuals on mainframe assembler language.
  • by Mark Larson
  • and various assembly articles and tutorials

Software

  • MenuetOS
    MenuetOS

    MenuetOS is an operating system with a Monolithic kernel Preemption , Real-time operating system Kernel , including video drivers, all written in FASM assembly language, for 64-bit and 32-bit x86 architecture computers, by Ville Turjanmaa....
     
  • , a library that generates assembly language code at run-time which is useful for Just-In-Time compilers
  • , a free Assembly IDE, a lot of open source programs to download and a popular
  • - a free component "Go" tools: support 32-bit & 64-bit Windows programming