Open main menu
Home
Random
Recent changes
Special pages
Community portal
Preferences
About Wikipedia
Disclaimers
Incubator escapee wiki
Search
User menu
Talk
Dark mode
Contributions
Create account
Log in
Editing
Assembly language
(section)
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
==== {{Anchor|Two-pass assembler}} Number of passes==== There are two types of assemblers based on how many passes through the source are needed (how many times the assembler reads the source) to produce the object file. * '''One-pass assemblers''' process the source code once. For symbols used before they are defined, the assembler will emit [[Erratum|"errata"]] after the eventual definition, telling the [[linker (computing)|linker]] or the loader to patch the locations where the as yet undefined symbols had been used. * '''Multi-pass assemblers''' create a table with all symbols and their values in the first passes, then use the table in later passes to generate code. In both cases, the assembler must be able to determine the size of each instruction on the initial passes in order to calculate the addresses of subsequent symbols. This means that if the size of an operation referring to an operand defined later depends on the type or distance of the operand, the assembler will make a pessimistic estimate when first encountering the operation, and if necessary, pad it with one or more "[[NOP (code)|no-operation]]" instructions in a later pass or the errata. In an assembler with [[peephole optimization]], addresses may be recalculated between passes to allow replacing pessimistic code with code tailored to the exact distance from the target. The original reason for the use of one-pass assemblers was memory size and speed of assembly β often a second pass would require storing the symbol table in memory (to handle [[forward reference]]s), rewinding and rereading the program source on [[magnetic-tape data storage|tape]], or rereading a deck of [[punched card|cards]] or [[punched tape|punched paper tape]]. Later computers with much larger memories (especially disc storage), had the space to perform all necessary processing without such re-reading. The advantage of the multi-pass assembler is that the absence of errata makes the [[linker (computing)|linking process]] (or the [[loader (computing)|program load]] if the assembler directly produces executable code) faster.<ref name="Beck_1996"/> '''Example:''' in the following code snippet, a one-pass assembler would be able to determine the address of the backward reference <var>BKWD</var> when assembling statement <var>S2</var>, but would not be able to determine the address of the forward reference <var>FWD</var> when assembling the branch statement <var>S1</var>; indeed, <var>FWD</var> may be undefined. A two-pass assembler would determine both addresses in pass 1, so they would be known when generating code in pass 2. {{var|S1}} B {{var|FWD}} ... {{var|FWD}} EQU * ... {{var|BKWD}} EQU * ... {{var|S2}} B {{var|BKWD}}
Edit summary
(Briefly describe your changes)
By publishing changes, you agree to the
Terms of Use
, and you irrevocably agree to release your contribution under the
CC BY-SA 4.0 License
and the
GFDL
. You agree that a hyperlink or URL is sufficient attribution under the Creative Commons license.
Cancel
Editing help
(opens in new window)