add directory Ref-docs

This commit is contained in:
gohigh
2024-02-19 00:21:47 -05:00
parent 5a46ddb732
commit ef50495c9d
2492 changed files with 1609142 additions and 0 deletions

View File

@@ -0,0 +1,564 @@
<html><head><title>NASM Manual</title></head>
<body><h1 align=center>The Netwide Assembler: NASM</h1>
<p>This manual documents NASM, the Netwide Assembler: an assembler
targetting the Intel x86 series of processors, with portable source.
<p><p><a href="nasmdoc1.html">Chapter 1: Introduction</a><br>
<a href="nasmdoc1.html#section-1.1">Section 1.1: What Is NASM?</a><br>
<a href="nasmdoc1.html#section-1.1.1">Section 1.1.1: Why Yet Another Assembler?</a><br>
<a href="nasmdoc1.html#section-1.1.2">Section 1.1.2: Licence Conditions</a><br>
<a href="nasmdoc1.html#section-1.2">Section 1.2: Contact Information</a><br>
<a href="nasmdoc1.html#section-1.3">Section 1.3: Installation</a><br>
<a href="nasmdoc1.html#section-1.3.1">Section 1.3.1: Installing NASM under MS-DOS or Windows</a><br>
<a href="nasmdoc1.html#section-1.3.2">Section 1.3.2: Installing NASM under Unix</a><br>
<p><a href="nasmdoc2.html">Chapter 2: Running NASM</a><br>
<a href="nasmdoc2.html#section-2.1">Section 2.1: NASM Command-Line Syntax</a><br>
<a href="nasmdoc2.html#section-2.1.1">Section 2.1.1: The <code><nobr>-o</nobr></code> Option: Specifying the Output File Name</a><br>
<a href="nasmdoc2.html#section-2.1.2">Section 2.1.2: The <code><nobr>-f</nobr></code> Option: Specifying the Output File Format</a><br>
<a href="nasmdoc2.html#section-2.1.3">Section 2.1.3: The <code><nobr>-l</nobr></code> Option: Generating a Listing File</a><br>
<a href="nasmdoc2.html#section-2.1.4">Section 2.1.4: The <code><nobr>-M</nobr></code> Option: Generate Makefile Dependencies.</a><br>
<a href="nasmdoc2.html#section-2.1.5">Section 2.1.5: The <code><nobr>-F</nobr></code> Option: Selecting a Debug Information Format</a><br>
<a href="nasmdoc2.html#section-2.1.6">Section 2.1.6: The <code><nobr>-g</nobr></code> Option: Enabling Debug Information.</a><br>
<a href="nasmdoc2.html#section-2.1.7">Section 2.1.7: The <code><nobr>-X</nobr></code> Option: Selecting an Error Reporting Format</a><br>
<a href="nasmdoc2.html#section-2.1.8">Section 2.1.8: The <code><nobr>-E</nobr></code> Option: Send Errors to a File</a><br>
<a href="nasmdoc2.html#section-2.1.9">Section 2.1.9: The <code><nobr>-s</nobr></code> Option: Send Errors to <code><nobr>stdout</nobr></code></a><br>
<a href="nasmdoc2.html#section-2.1.10">Section 2.1.10: The <code><nobr>-i</nobr></code> Option: Include File Search Directories</a><br>
<a href="nasmdoc2.html#section-2.1.11">Section 2.1.11: The <code><nobr>-p</nobr></code> Option: Pre-Include a File</a><br>
<a href="nasmdoc2.html#section-2.1.12">Section 2.1.12: The <code><nobr>-d</nobr></code> Option: Pre-Define a Macro</a><br>
<a href="nasmdoc2.html#section-2.1.13">Section 2.1.13: The <code><nobr>-u</nobr></code> Option: Undefine a Macro</a><br>
<a href="nasmdoc2.html#section-2.1.14">Section 2.1.14: The <code><nobr>-e</nobr></code> Option: Preprocess Only</a><br>
<a href="nasmdoc2.html#section-2.1.15">Section 2.1.15: The <code><nobr>-a</nobr></code> Option: Don't Preprocess At All</a><br>
<a href="nasmdoc2.html#section-2.1.16">Section 2.1.16: The <code><nobr>-On</nobr></code> Option: Specifying Multipass Optimization.</a><br>
<a href="nasmdoc2.html#section-2.1.17">Section 2.1.17: The <code><nobr>-t</nobr></code> option: Enable TASM Compatibility Mode</a><br>
<a href="nasmdoc2.html#section-2.1.18">Section 2.1.18: The <code><nobr>-w</nobr></code> Option: Enable or Disable Assembly Warnings</a><br>
<a href="nasmdoc2.html#section-2.1.19">Section 2.1.19: The <code><nobr>-v</nobr></code> Option: Display Version Info</a><br>
<a href="nasmdoc2.html#section-2.1.20">Section 2.1.20: The <code><nobr>-y</nobr></code> Option: Display Available Debug Info Formats</a><br>
<a href="nasmdoc2.html#section-2.1.21">Section 2.1.21: The <code><nobr>--prefix</nobr></code> and <code><nobr>--postfix</nobr></code> Options.</a><br>
<a href="nasmdoc2.html#section-2.1.22">Section 2.1.22: The <code><nobr>NASMENV</nobr></code> Environment Variable</a><br>
<a href="nasmdoc2.html#section-2.2">Section 2.2: Quick Start for MASM Users</a><br>
<a href="nasmdoc2.html#section-2.2.1">Section 2.2.1: NASM Is Case-Sensitive</a><br>
<a href="nasmdoc2.html#section-2.2.2">Section 2.2.2: NASM Requires Square Brackets For Memory References</a><br>
<a href="nasmdoc2.html#section-2.2.3">Section 2.2.3: NASM Doesn't Store Variable Types</a><br>
<a href="nasmdoc2.html#section-2.2.4">Section 2.2.4: NASM Doesn't <code><nobr>ASSUME</nobr></code></a><br>
<a href="nasmdoc2.html#section-2.2.5">Section 2.2.5: NASM Doesn't Support Memory Models</a><br>
<a href="nasmdoc2.html#section-2.2.6">Section 2.2.6: Floating-Point Differences</a><br>
<a href="nasmdoc2.html#section-2.2.7">Section 2.2.7: Other Differences</a><br>
<p><a href="nasmdoc3.html">Chapter 3: The NASM Language</a><br>
<a href="nasmdoc3.html#section-3.1">Section 3.1: Layout of a NASM Source Line</a><br>
<a href="nasmdoc3.html#section-3.2">Section 3.2: Pseudo-Instructions</a><br>
<a href="nasmdoc3.html#section-3.2.1">Section 3.2.1: <code><nobr>DB</nobr></code> and friends: Declaring Initialised Data</a><br>
<a href="nasmdoc3.html#section-3.2.2">Section 3.2.2: <code><nobr>RESB</nobr></code> and friends: Declaring Uninitialised Data</a><br>
<a href="nasmdoc3.html#section-3.2.3">Section 3.2.3: <code><nobr>INCBIN</nobr></code>: Including External Binary Files</a><br>
<a href="nasmdoc3.html#section-3.2.4">Section 3.2.4: <code><nobr>EQU</nobr></code>: Defining Constants</a><br>
<a href="nasmdoc3.html#section-3.2.5">Section 3.2.5: <code><nobr>TIMES</nobr></code>: Repeating Instructions or Data</a><br>
<a href="nasmdoc3.html#section-3.3">Section 3.3: Effective Addresses</a><br>
<a href="nasmdoc3.html#section-3.4">Section 3.4: Constants</a><br>
<a href="nasmdoc3.html#section-3.4.1">Section 3.4.1: Numeric Constants</a><br>
<a href="nasmdoc3.html#section-3.4.2">Section 3.4.2: Character Constants</a><br>
<a href="nasmdoc3.html#section-3.4.3">Section 3.4.3: String Constants</a><br>
<a href="nasmdoc3.html#section-3.4.4">Section 3.4.4: Floating-Point Constants</a><br>
<a href="nasmdoc3.html#section-3.5">Section 3.5: Expressions</a><br>
<a href="nasmdoc3.html#section-3.5.1">Section 3.5.1: <code><nobr>|</nobr></code>: Bitwise OR Operator</a><br>
<a href="nasmdoc3.html#section-3.5.2">Section 3.5.2: <code><nobr>^</nobr></code>: Bitwise XOR Operator</a><br>
<a href="nasmdoc3.html#section-3.5.3">Section 3.5.3: <code><nobr>&amp;</nobr></code>: Bitwise AND Operator</a><br>
<a href="nasmdoc3.html#section-3.5.4">Section 3.5.4: <code><nobr>&lt;&lt;</nobr></code> and <code><nobr>&gt;&gt;</nobr></code>: Bit Shift Operators</a><br>
<a href="nasmdoc3.html#section-3.5.5">Section 3.5.5: <code><nobr>+</nobr></code> and <code><nobr>-</nobr></code>: Addition and Subtraction Operators</a><br>
<a href="nasmdoc3.html#section-3.5.6">Section 3.5.6: <code><nobr>*</nobr></code>, <code><nobr>/</nobr></code>, <code><nobr>//</nobr></code>, <code><nobr>%</nobr></code> and <code><nobr>%%</nobr></code>: Multiplication and Division</a><br>
<a href="nasmdoc3.html#section-3.5.7">Section 3.5.7: Unary Operators: <code><nobr>+</nobr></code>, <code><nobr>-</nobr></code>, <code><nobr>~</nobr></code> and <code><nobr>SEG</nobr></code></a><br>
<a href="nasmdoc3.html#section-3.6">Section 3.6: <code><nobr>SEG</nobr></code> and <code><nobr>WRT</nobr></code></a><br>
<a href="nasmdoc3.html#section-3.7">Section 3.7: <code><nobr>STRICT</nobr></code>: Inhibiting Optimization</a><br>
<a href="nasmdoc3.html#section-3.8">Section 3.8: Critical Expressions</a><br>
<a href="nasmdoc3.html#section-3.9">Section 3.9: Local Labels</a><br>
<p><a href="nasmdoc4.html">Chapter 4: The NASM Preprocessor</a><br>
<a href="nasmdoc4.html#section-4.1">Section 4.1: Single-Line Macros</a><br>
<a href="nasmdoc4.html#section-4.1.1">Section 4.1.1: The Normal Way: <code><nobr>%define</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.1.2">Section 4.1.2: Enhancing %define: <code><nobr>%xdefine</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.1.3">Section 4.1.3: Concatenating Single Line Macro Tokens: <code><nobr>%+</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.1.4">Section 4.1.4: Undefining macros: <code><nobr>%undef</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.1.5">Section 4.1.5: Preprocessor Variables: <code><nobr>%assign</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.2">Section 4.2: String Handling in Macros: <code><nobr>%strlen</nobr></code> and <code><nobr>%substr</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.2.1">Section 4.2.1: String Length: <code><nobr>%strlen</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.2.2">Section 4.2.2: Sub-strings: <code><nobr>%substr</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.3">Section 4.3: Multi-Line Macros: <code><nobr>%macro</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.3.1">Section 4.3.1: Overloading Multi-Line Macros</a><br>
<a href="nasmdoc4.html#section-4.3.2">Section 4.3.2: Macro-Local Labels</a><br>
<a href="nasmdoc4.html#section-4.3.3">Section 4.3.3: Greedy Macro Parameters</a><br>
<a href="nasmdoc4.html#section-4.3.4">Section 4.3.4: Default Macro Parameters</a><br>
<a href="nasmdoc4.html#section-4.3.5">Section 4.3.5: <code><nobr>%0</nobr></code>: Macro Parameter Counter</a><br>
<a href="nasmdoc4.html#section-4.3.6">Section 4.3.6: <code><nobr>%rotate</nobr></code>: Rotating Macro Parameters</a><br>
<a href="nasmdoc4.html#section-4.3.7">Section 4.3.7: Concatenating Macro Parameters</a><br>
<a href="nasmdoc4.html#section-4.3.8">Section 4.3.8: Condition Codes as Macro Parameters</a><br>
<a href="nasmdoc4.html#section-4.3.9">Section 4.3.9: Disabling Listing Expansion</a><br>
<a href="nasmdoc4.html#section-4.4">Section 4.4: Conditional Assembly</a><br>
<a href="nasmdoc4.html#section-4.4.1">Section 4.4.1: <code><nobr>%ifdef</nobr></code>: Testing Single-Line Macro Existence</a><br>
<a href="nasmdoc4.html#section-4.4.2">Section 4.4.2: <code><nobr>ifmacro</nobr></code>: Testing Multi-Line Macro Existence</a><br>
<a href="nasmdoc4.html#section-4.4.3">Section 4.4.3: <code><nobr>%ifctx</nobr></code>: Testing the Context Stack</a><br>
<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4: <code><nobr>%if</nobr></code>: Testing Arbitrary Numeric Expressions</a><br>
<a href="nasmdoc4.html#section-4.4.5">Section 4.4.5: <code><nobr>%ifidn</nobr></code> and <code><nobr>%ifidni</nobr></code>: Testing Exact Text Identity</a><br>
<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6: <code><nobr>%ifid</nobr></code>, <code><nobr>%ifnum</nobr></code>, <code><nobr>%ifstr</nobr></code>: Testing Token Types</a><br>
<a href="nasmdoc4.html#section-4.4.7">Section 4.4.7: <code><nobr>%error</nobr></code>: Reporting User-Defined Errors</a><br>
<a href="nasmdoc4.html#section-4.5">Section 4.5: Preprocessor Loops: <code><nobr>%rep</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.6">Section 4.6: Including Other Files</a><br>
<a href="nasmdoc4.html#section-4.7">Section 4.7: The Context Stack</a><br>
<a href="nasmdoc4.html#section-4.7.1">Section 4.7.1: <code><nobr>%push</nobr></code> and <code><nobr>%pop</nobr></code>: Creating and Removing Contexts</a><br>
<a href="nasmdoc4.html#section-4.7.2">Section 4.7.2: Context-Local Labels</a><br>
<a href="nasmdoc4.html#section-4.7.3">Section 4.7.3: Context-Local Single-Line Macros</a><br>
<a href="nasmdoc4.html#section-4.7.4">Section 4.7.4: <code><nobr>%repl</nobr></code>: Renaming a Context</a><br>
<a href="nasmdoc4.html#section-4.7.5">Section 4.7.5: Example Use of the Context Stack: Block IFs</a><br>
<a href="nasmdoc4.html#section-4.8">Section 4.8: Standard Macros</a><br>
<a href="nasmdoc4.html#section-4.8.1">Section 4.8.1: <code><nobr>__NASM_MAJOR__</nobr></code>, <code><nobr>__NASM_MINOR__</nobr></code>, <code><nobr>__NASM_SUBMINOR__</nobr></code> and <code><nobr>___NASM_PATCHLEVEL__</nobr></code>: NASM Version</a><br>
<a href="nasmdoc4.html#section-4.8.2">Section 4.8.2: <code><nobr>__NASM_VERSION_ID__</nobr></code>: NASM Version ID</a><br>
<a href="nasmdoc4.html#section-4.8.3">Section 4.8.3: <code><nobr>__NASM_VER__</nobr></code>: NASM Version string</a><br>
<a href="nasmdoc4.html#section-4.8.4">Section 4.8.4: <code><nobr>__FILE__</nobr></code> and <code><nobr>__LINE__</nobr></code>: File Name and Line Number</a><br>
<a href="nasmdoc4.html#section-4.8.5">Section 4.8.5: <code><nobr>STRUC</nobr></code> and <code><nobr>ENDSTRUC</nobr></code>: Declaring Structure Data Types</a><br>
<a href="nasmdoc4.html#section-4.8.6">Section 4.8.6: <code><nobr>ISTRUC</nobr></code>, <code><nobr>AT</nobr></code> and <code><nobr>IEND</nobr></code>: Declaring Instances of Structures</a><br>
<a href="nasmdoc4.html#section-4.8.7">Section 4.8.7: <code><nobr>ALIGN</nobr></code> and <code><nobr>ALIGNB</nobr></code>: Data Alignment</a><br>
<a href="nasmdoc4.html#section-4.9">Section 4.9: TASM Compatible Preprocessor Directives</a><br>
<a href="nasmdoc4.html#section-4.9.1">Section 4.9.1: <code><nobr>%arg</nobr></code> Directive</a><br>
<a href="nasmdoc4.html#section-4.9.2">Section 4.9.2: <code><nobr>%stacksize</nobr></code> Directive</a><br>
<a href="nasmdoc4.html#section-4.9.3">Section 4.9.3: <code><nobr>%local</nobr></code> Directive</a><br>
<a href="nasmdoc4.html#section-4.10">Section 4.10: Other Preprocessor Directives</a><br>
<a href="nasmdoc4.html#section-4.10.1">Section 4.10.1: <code><nobr>%line</nobr></code> Directive</a><br>
<a href="nasmdoc4.html#section-4.10.2">Section 4.10.2: <code><nobr>%!</nobr></code><code><nobr>&lt;env&gt;</nobr></code>: Read an environment variable.</a><br>
<p><a href="nasmdoc5.html">Chapter 5: Assembler Directives</a><br>
<a href="nasmdoc5.html#section-5.1">Section 5.1: <code><nobr>BITS</nobr></code>: Specifying Target Processor Mode</a><br>
<a href="nasmdoc5.html#section-5.1.1">Section 5.1.1: <code><nobr>USE16</nobr></code> &amp; <code><nobr>USE32</nobr></code>: Aliases for BITS</a><br>
<a href="nasmdoc5.html#section-5.2">Section 5.2: <code><nobr>SECTION</nobr></code> or <code><nobr>SEGMENT</nobr></code>: Changing and Defining Sections</a><br>
<a href="nasmdoc5.html#section-5.2.1">Section 5.2.1: The <code><nobr>__SECT__</nobr></code> Macro</a><br>
<a href="nasmdoc5.html#section-5.3">Section 5.3: <code><nobr>ABSOLUTE</nobr></code>: Defining Absolute Labels</a><br>
<a href="nasmdoc5.html#section-5.4">Section 5.4: <code><nobr>EXTERN</nobr></code>: Importing Symbols from Other Modules</a><br>
<a href="nasmdoc5.html#section-5.5">Section 5.5: <code><nobr>GLOBAL</nobr></code>: Exporting Symbols to Other Modules</a><br>
<a href="nasmdoc5.html#section-5.6">Section 5.6: <code><nobr>COMMON</nobr></code>: Defining Common Data Areas</a><br>
<a href="nasmdoc5.html#section-5.7">Section 5.7: <code><nobr>CPU</nobr></code>: Defining CPU Dependencies</a><br>
<p><a href="nasmdoc6.html">Chapter 6: Output Formats</a><br>
<a href="nasmdoc6.html#section-6.1">Section 6.1: <code><nobr>bin</nobr></code>: Flat-Form Binary Output</a><br>
<a href="nasmdoc6.html#section-6.1.1">Section 6.1.1: <code><nobr>ORG</nobr></code>: Binary File Program Origin</a><br>
<a href="nasmdoc6.html#section-6.1.2">Section 6.1.2: <code><nobr>bin</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.1.3">Section 6.1.3: <code><nobr>Multisection</nobr></code> support for the BIN format.</a><br>
<a href="nasmdoc6.html#section-6.1.4">Section 6.1.4: Map files</a><br>
<a href="nasmdoc6.html#section-6.2">Section 6.2: <code><nobr>obj</nobr></code>: Microsoft OMF Object Files</a><br>
<a href="nasmdoc6.html#section-6.2.1">Section 6.2.1: <code><nobr>obj</nobr></code> Extensions to the <code><nobr>SEGMENT</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.2.2">Section 6.2.2: <code><nobr>GROUP</nobr></code>: Defining Groups of Segments</a><br>
<a href="nasmdoc6.html#section-6.2.3">Section 6.2.3: <code><nobr>UPPERCASE</nobr></code>: Disabling Case Sensitivity in Output</a><br>
<a href="nasmdoc6.html#section-6.2.4">Section 6.2.4: <code><nobr>IMPORT</nobr></code>: Importing DLL Symbols</a><br>
<a href="nasmdoc6.html#section-6.2.5">Section 6.2.5: <code><nobr>EXPORT</nobr></code>: Exporting DLL Symbols</a><br>
<a href="nasmdoc6.html#section-6.2.6">Section 6.2.6: <code><nobr>..start</nobr></code>: Defining the Program Entry Point</a><br>
<a href="nasmdoc6.html#section-6.2.7">Section 6.2.7: <code><nobr>obj</nobr></code> Extensions to the <code><nobr>EXTERN</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.2.8">Section 6.2.8: <code><nobr>obj</nobr></code> Extensions to the <code><nobr>COMMON</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.3">Section 6.3: <code><nobr>win32</nobr></code>: Microsoft Win32 Object Files</a><br>
<a href="nasmdoc6.html#section-6.3.1">Section 6.3.1: <code><nobr>win32</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.4">Section 6.4: <code><nobr>coff</nobr></code>: Common Object File Format</a><br>
<a href="nasmdoc6.html#section-6.5">Section 6.5: <code><nobr>elf</nobr></code>: Executable and Linkable Format Object Files</a><br>
<a href="nasmdoc6.html#section-6.5.1">Section 6.5.1: <code><nobr>elf</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.5.2">Section 6.5.2: Position-Independent Code: <code><nobr>elf</nobr></code> Special Symbols and <code><nobr>WRT</nobr></code></a><br>
<a href="nasmdoc6.html#section-6.5.3">Section 6.5.3: <code><nobr>elf</nobr></code> Extensions to the <code><nobr>GLOBAL</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.5.4">Section 6.5.4: <code><nobr>elf</nobr></code> Extensions to the <code><nobr>COMMON</nobr></code> Directive </a><br>
<a href="nasmdoc6.html#section-6.5.5">Section 6.5.5: 16-bit code and ELF </a><br>
<a href="nasmdoc6.html#section-6.6">Section 6.6: <code><nobr>aout</nobr></code>: Linux <code><nobr>a.out</nobr></code> Object Files</a><br>
<a href="nasmdoc6.html#section-6.7">Section 6.7: <code><nobr>aoutb</nobr></code>: NetBSD/FreeBSD/OpenBSD <code><nobr>a.out</nobr></code> Object Files</a><br>
<a href="nasmdoc6.html#section-6.8">Section 6.8: <code><nobr>as86</nobr></code>: Minix/Linux <code><nobr>as86</nobr></code> Object Files</a><br>
<a href="nasmdoc6.html#section-6.9">Section 6.9: <code><nobr>rdf</nobr></code>: Relocatable Dynamic Object File Format</a><br>
<a href="nasmdoc6.html#section-6.9.1">Section 6.9.1: Requiring a Library: The <code><nobr>LIBRARY</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.9.2">Section 6.9.2: Specifying a Module Name: The <code><nobr>MODULE</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.9.3">Section 6.9.3: <code><nobr>rdf</nobr></code> Extensions to the <code><nobr>GLOBAL</nobr></code> directive</a><br>
<a href="nasmdoc6.html#section-6.10">Section 6.10: <code><nobr>dbg</nobr></code>: Debugging Format</a><br>
<p><a href="nasmdoc7.html">Chapter 7: Writing 16-bit Code (DOS, Windows 3/3.1)</a><br>
<a href="nasmdoc7.html#section-7.1">Section 7.1: Producing <code><nobr>.EXE</nobr></code> Files</a><br>
<a href="nasmdoc7.html#section-7.1.1">Section 7.1.1: Using the <code><nobr>obj</nobr></code> Format To Generate <code><nobr>.EXE</nobr></code> Files</a><br>
<a href="nasmdoc7.html#section-7.1.2">Section 7.1.2: Using the <code><nobr>bin</nobr></code> Format To Generate <code><nobr>.EXE</nobr></code> Files</a><br>
<a href="nasmdoc7.html#section-7.2">Section 7.2: Producing <code><nobr>.COM</nobr></code> Files</a><br>
<a href="nasmdoc7.html#section-7.2.1">Section 7.2.1: Using the <code><nobr>bin</nobr></code> Format To Generate <code><nobr>.COM</nobr></code> Files</a><br>
<a href="nasmdoc7.html#section-7.2.2">Section 7.2.2: Using the <code><nobr>obj</nobr></code> Format To Generate <code><nobr>.COM</nobr></code> Files</a><br>
<a href="nasmdoc7.html#section-7.3">Section 7.3: Producing <code><nobr>.SYS</nobr></code> Files</a><br>
<a href="nasmdoc7.html#section-7.4">Section 7.4: Interfacing to 16-bit C Programs</a><br>
<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1: External Symbol Names</a><br>
<a href="nasmdoc7.html#section-7.4.2">Section 7.4.2: Memory Models</a><br>
<a href="nasmdoc7.html#section-7.4.3">Section 7.4.3: Function Definitions and Function Calls</a><br>
<a href="nasmdoc7.html#section-7.4.4">Section 7.4.4: Accessing Data Items</a><br>
<a href="nasmdoc7.html#section-7.4.5">Section 7.4.5: <code><nobr>c16.mac</nobr></code>: Helper Macros for the 16-bit C Interface</a><br>
<a href="nasmdoc7.html#section-7.5">Section 7.5: Interfacing to Borland Pascal Programs</a><br>
<a href="nasmdoc7.html#section-7.5.1">Section 7.5.1: The Pascal Calling Convention</a><br>
<a href="nasmdoc7.html#section-7.5.2">Section 7.5.2: Borland Pascal Segment Name Restrictions</a><br>
<a href="nasmdoc7.html#section-7.5.3">Section 7.5.3: Using <code><nobr>c16.mac</nobr></code> With Pascal Programs</a><br>
<p><a href="nasmdoc8.html">Chapter 8: Writing 32-bit Code (Unix, Win32, DJGPP)</a><br>
<a href="nasmdoc8.html#section-8.1">Section 8.1: Interfacing to 32-bit C Programs</a><br>
<a href="nasmdoc8.html#section-8.1.1">Section 8.1.1: External Symbol Names</a><br>
<a href="nasmdoc8.html#section-8.1.2">Section 8.1.2: Function Definitions and Function Calls</a><br>
<a href="nasmdoc8.html#section-8.1.3">Section 8.1.3: Accessing Data Items</a><br>
<a href="nasmdoc8.html#section-8.1.4">Section 8.1.4: <code><nobr>c32.mac</nobr></code>: Helper Macros for the 32-bit C Interface</a><br>
<a href="nasmdoc8.html#section-8.2">Section 8.2: Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF Shared Libraries</a><br>
<a href="nasmdoc8.html#section-8.2.1">Section 8.2.1: Obtaining the Address of the GOT</a><br>
<a href="nasmdoc8.html#section-8.2.2">Section 8.2.2: Finding Your Local Data Items</a><br>
<a href="nasmdoc8.html#section-8.2.3">Section 8.2.3: Finding External and Common Data Items</a><br>
<a href="nasmdoc8.html#section-8.2.4">Section 8.2.4: Exporting Symbols to the Library User</a><br>
<a href="nasmdoc8.html#section-8.2.5">Section 8.2.5: Calling Procedures Outside the Library</a><br>
<a href="nasmdoc8.html#section-8.2.6">Section 8.2.6: Generating the Library File</a><br>
<p><a href="nasmdoc9.html">Chapter 9: Mixing 16 and 32 Bit Code</a><br>
<a href="nasmdoc9.html#section-9.1">Section 9.1: Mixed-Size Jumps</a><br>
<a href="nasmdoc9.html#section-9.2">Section 9.2: Addressing Between Different-Size Segments</a><br>
<a href="nasmdoc9.html#section-9.3">Section 9.3: Other Mixed-Size Instructions</a><br>
<p><a href="nasmdo10.html">Chapter 10: Troubleshooting</a><br>
<a href="nasmdo10.html#section-10.1">Section 10.1: Common Problems</a><br>
<a href="nasmdo10.html#section-10.1.1">Section 10.1.1: NASM Generates Inefficient Code</a><br>
<a href="nasmdo10.html#section-10.1.2">Section 10.1.2: My Jumps are Out of Range</a><br>
<a href="nasmdo10.html#section-10.1.3">Section 10.1.3: <code><nobr>ORG</nobr></code> Doesn't Work</a><br>
<a href="nasmdo10.html#section-10.1.4">Section 10.1.4: <code><nobr>TIMES</nobr></code> Doesn't Work</a><br>
<a href="nasmdo10.html#section-10.2">Section 10.2: Bugs</a><br>
<p><a href="nasmdoca.html">Appendix A: Ndisasm</a><br>
<a href="nasmdoca.html#section-A.1">Section A.1: Introduction</a><br>
<a href="nasmdoca.html#section-A.2">Section A.2: Getting Started: Installation</a><br>
<a href="nasmdoca.html#section-A.3">Section A.3: Running NDISASM</a><br>
<a href="nasmdoca.html#section-A.3.1">Section A.3.1: COM Files: Specifying an Origin</a><br>
<a href="nasmdoca.html#section-A.3.2">Section A.3.2: Code Following Data: Synchronisation</a><br>
<a href="nasmdoca.html#section-A.3.3">Section A.3.3: Mixed Code and Data: Automatic (Intelligent) Synchronisation </a><br>
<a href="nasmdoca.html#section-A.3.4">Section A.3.4: Other Options</a><br>
<a href="nasmdoca.html#section-A.4">Section A.4: Bugs and Improvements</a><br>
<p><a href="nasmdocb.html">Appendix B: x86 Instruction Reference</a><br>
<a href="nasmdocb.html#section-B.1">Section B.1: Key to Operand Specifications</a><br>
<a href="nasmdocb.html#section-B.2">Section B.2: Key to Opcode Descriptions</a><br>
<a href="nasmdocb.html#section-B.2.1">Section B.2.1: Register Values</a><br>
<a href="nasmdocb.html#section-B.2.2">Section B.2.2: Condition Codes</a><br>
<a href="nasmdocb.html#section-B.2.3">Section B.2.3: SSE Condition Predicates</a><br>
<a href="nasmdocb.html#section-B.2.4">Section B.2.4: Status Flags</a><br>
<a href="nasmdocb.html#section-B.2.5">Section B.2.5: Effective Address Encoding: ModR/M and SIB</a><br>
<a href="nasmdocb.html#section-B.3">Section B.3: Key to Instruction Flags</a><br>
<a href="nasmdocb.html#section-B.4">Section B.4: x86 Instruction Set</a><br>
<a href="nasmdocb.html#section-B.4.1">Section B.4.1: <code><nobr>AAA</nobr></code>, <code><nobr>AAS</nobr></code>, <code><nobr>AAM</nobr></code>, <code><nobr>AAD</nobr></code>: ASCII Adjustments</a><br>
<a href="nasmdocb.html#section-B.4.2">Section B.4.2: <code><nobr>ADC</nobr></code>: Add with Carry</a><br>
<a href="nasmdocb.html#section-B.4.3">Section B.4.3: <code><nobr>ADD</nobr></code>: Add Integers</a><br>
<a href="nasmdocb.html#section-B.4.4">Section B.4.4: <code><nobr>ADDPD</nobr></code>: ADD Packed Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.5">Section B.4.5: <code><nobr>ADDPS</nobr></code>: ADD Packed Single-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.6">Section B.4.6: <code><nobr>ADDSD</nobr></code>: ADD Scalar Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.7">Section B.4.7: <code><nobr>ADDSS</nobr></code>: ADD Scalar Single-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.8">Section B.4.8: <code><nobr>AND</nobr></code>: Bitwise AND</a><br>
<a href="nasmdocb.html#section-B.4.9">Section B.4.9: <code><nobr>ANDNPD</nobr></code>: Bitwise Logical AND NOT of Packed Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.10">Section B.4.10: <code><nobr>ANDNPS</nobr></code>: Bitwise Logical AND NOT of Packed Single-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.11">Section B.4.11: <code><nobr>ANDPD</nobr></code>: Bitwise Logical AND For Single FP</a><br>
<a href="nasmdocb.html#section-B.4.12">Section B.4.12: <code><nobr>ANDPS</nobr></code>: Bitwise Logical AND For Single FP</a><br>
<a href="nasmdocb.html#section-B.4.13">Section B.4.13: <code><nobr>ARPL</nobr></code>: Adjust RPL Field of Selector</a><br>
<a href="nasmdocb.html#section-B.4.14">Section B.4.14: <code><nobr>BOUND</nobr></code>: Check Array Index against Bounds</a><br>
<a href="nasmdocb.html#section-B.4.15">Section B.4.15: <code><nobr>BSF</nobr></code>, <code><nobr>BSR</nobr></code>: Bit Scan</a><br>
<a href="nasmdocb.html#section-B.4.16">Section B.4.16: <code><nobr>BSWAP</nobr></code>: Byte Swap</a><br>
<a href="nasmdocb.html#section-B.4.17">Section B.4.17: <code><nobr>BT</nobr></code>, <code><nobr>BTC</nobr></code>, <code><nobr>BTR</nobr></code>, <code><nobr>BTS</nobr></code>: Bit Test</a><br>
<a href="nasmdocb.html#section-B.4.18">Section B.4.18: <code><nobr>CALL</nobr></code>: Call Subroutine</a><br>
<a href="nasmdocb.html#section-B.4.19">Section B.4.19: <code><nobr>CBW</nobr></code>, <code><nobr>CWD</nobr></code>, <code><nobr>CDQ</nobr></code>, <code><nobr>CWDE</nobr></code>: Sign Extensions</a><br>
<a href="nasmdocb.html#section-B.4.20">Section B.4.20: <code><nobr>CLC</nobr></code>, <code><nobr>CLD</nobr></code>, <code><nobr>CLI</nobr></code>, <code><nobr>CLTS</nobr></code>: Clear Flags</a><br>
<a href="nasmdocb.html#section-B.4.21">Section B.4.21: <code><nobr>CLFLUSH</nobr></code>: Flush Cache Line</a><br>
<a href="nasmdocb.html#section-B.4.22">Section B.4.22: <code><nobr>CMC</nobr></code>: Complement Carry Flag</a><br>
<a href="nasmdocb.html#section-B.4.23">Section B.4.23: <code><nobr>CMOVcc</nobr></code>: Conditional Move</a><br>
<a href="nasmdocb.html#section-B.4.24">Section B.4.24: <code><nobr>CMP</nobr></code>: Compare Integers</a><br>
<a href="nasmdocb.html#section-B.4.25">Section B.4.25: <code><nobr>CMPccPD</nobr></code>: Packed Double-Precision FP Compare </a><br>
<a href="nasmdocb.html#section-B.4.26">Section B.4.26: <code><nobr>CMPccPS</nobr></code>: Packed Single-Precision FP Compare </a><br>
<a href="nasmdocb.html#section-B.4.27">Section B.4.27: <code><nobr>CMPSB</nobr></code>, <code><nobr>CMPSW</nobr></code>, <code><nobr>CMPSD</nobr></code>: Compare Strings</a><br>
<a href="nasmdocb.html#section-B.4.28">Section B.4.28: <code><nobr>CMPccSD</nobr></code>: Scalar Double-Precision FP Compare </a><br>
<a href="nasmdocb.html#section-B.4.29">Section B.4.29: <code><nobr>CMPccSS</nobr></code>: Scalar Single-Precision FP Compare </a><br>
<a href="nasmdocb.html#section-B.4.30">Section B.4.30: <code><nobr>CMPXCHG</nobr></code>, <code><nobr>CMPXCHG486</nobr></code>: Compare and Exchange</a><br>
<a href="nasmdocb.html#section-B.4.31">Section B.4.31: <code><nobr>CMPXCHG8B</nobr></code>: Compare and Exchange Eight Bytes</a><br>
<a href="nasmdocb.html#section-B.4.32">Section B.4.32: <code><nobr>COMISD</nobr></code>: Scalar Ordered Double-Precision FP Compare and Set EFLAGS</a><br>
<a href="nasmdocb.html#section-B.4.33">Section B.4.33: <code><nobr>COMISS</nobr></code>: Scalar Ordered Single-Precision FP Compare and Set EFLAGS</a><br>
<a href="nasmdocb.html#section-B.4.34">Section B.4.34: <code><nobr>CPUID</nobr></code>: Get CPU Identification Code</a><br>
<a href="nasmdocb.html#section-B.4.35">Section B.4.35: <code><nobr>CVTDQ2PD</nobr></code>: Packed Signed INT32 to Packed Double-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.36">Section B.4.36: <code><nobr>CVTDQ2PS</nobr></code>: Packed Signed INT32 to Packed Single-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.37">Section B.4.37: <code><nobr>CVTPD2DQ</nobr></code>: Packed Double-Precision FP to Packed Signed INT32 Conversion</a><br>
<a href="nasmdocb.html#section-B.4.38">Section B.4.38: <code><nobr>CVTPD2PI</nobr></code>: Packed Double-Precision FP to Packed Signed INT32 Conversion</a><br>
<a href="nasmdocb.html#section-B.4.39">Section B.4.39: <code><nobr>CVTPD2PS</nobr></code>: Packed Double-Precision FP to Packed Single-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.40">Section B.4.40: <code><nobr>CVTPI2PD</nobr></code>: Packed Signed INT32 to Packed Double-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.41">Section B.4.41: <code><nobr>CVTPI2PS</nobr></code>: Packed Signed INT32 to Packed Single-FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.42">Section B.4.42: <code><nobr>CVTPS2DQ</nobr></code>: Packed Single-Precision FP to Packed Signed INT32 Conversion</a><br>
<a href="nasmdocb.html#section-B.4.43">Section B.4.43: <code><nobr>CVTPS2PD</nobr></code>: Packed Single-Precision FP to Packed Double-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.44">Section B.4.44: <code><nobr>CVTPS2PI</nobr></code>: Packed Single-Precision FP to Packed Signed INT32 Conversion</a><br>
<a href="nasmdocb.html#section-B.4.45">Section B.4.45: <code><nobr>CVTSD2SI</nobr></code>: Scalar Double-Precision FP to Signed INT32 Conversion</a><br>
<a href="nasmdocb.html#section-B.4.46">Section B.4.46: <code><nobr>CVTSD2SS</nobr></code>: Scalar Double-Precision FP to Scalar Single-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.47">Section B.4.47: <code><nobr>CVTSI2SD</nobr></code>: Signed INT32 to Scalar Double-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.48">Section B.4.48: <code><nobr>CVTSI2SS</nobr></code>: Signed INT32 to Scalar Single-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.49">Section B.4.49: <code><nobr>CVTSS2SD</nobr></code>: Scalar Single-Precision FP to Scalar Double-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.50">Section B.4.50: <code><nobr>CVTSS2SI</nobr></code>: Scalar Single-Precision FP to Signed INT32 Conversion</a><br>
<a href="nasmdocb.html#section-B.4.51">Section B.4.51: <code><nobr>CVTTPD2DQ</nobr></code>: Packed Double-Precision FP to Packed Signed INT32 Conversion with Truncation</a><br>
<a href="nasmdocb.html#section-B.4.52">Section B.4.52: <code><nobr>CVTTPD2PI</nobr></code>: Packed Double-Precision FP to Packed Signed INT32 Conversion with Truncation</a><br>
<a href="nasmdocb.html#section-B.4.53">Section B.4.53: <code><nobr>CVTTPS2DQ</nobr></code>: Packed Single-Precision FP to Packed Signed INT32 Conversion with Truncation</a><br>
<a href="nasmdocb.html#section-B.4.54">Section B.4.54: <code><nobr>CVTTPS2PI</nobr></code>: Packed Single-Precision FP to Packed Signed INT32 Conversion with Truncation</a><br>
<a href="nasmdocb.html#section-B.4.55">Section B.4.55: <code><nobr>CVTTSD2SI</nobr></code>: Scalar Double-Precision FP to Signed INT32 Conversion with Truncation</a><br>
<a href="nasmdocb.html#section-B.4.56">Section B.4.56: <code><nobr>CVTTSS2SI</nobr></code>: Scalar Single-Precision FP to Signed INT32 Conversion with Truncation</a><br>
<a href="nasmdocb.html#section-B.4.57">Section B.4.57: <code><nobr>DAA</nobr></code>, <code><nobr>DAS</nobr></code>: Decimal Adjustments</a><br>
<a href="nasmdocb.html#section-B.4.58">Section B.4.58: <code><nobr>DEC</nobr></code>: Decrement Integer</a><br>
<a href="nasmdocb.html#section-B.4.59">Section B.4.59: <code><nobr>DIV</nobr></code>: Unsigned Integer Divide</a><br>
<a href="nasmdocb.html#section-B.4.60">Section B.4.60: <code><nobr>DIVPD</nobr></code>: Packed Double-Precision FP Divide</a><br>
<a href="nasmdocb.html#section-B.4.61">Section B.4.61: <code><nobr>DIVPS</nobr></code>: Packed Single-Precision FP Divide</a><br>
<a href="nasmdocb.html#section-B.4.62">Section B.4.62: <code><nobr>DIVSD</nobr></code>: Scalar Double-Precision FP Divide</a><br>
<a href="nasmdocb.html#section-B.4.63">Section B.4.63: <code><nobr>DIVSS</nobr></code>: Scalar Single-Precision FP Divide</a><br>
<a href="nasmdocb.html#section-B.4.64">Section B.4.64: <code><nobr>EMMS</nobr></code>: Empty MMX State</a><br>
<a href="nasmdocb.html#section-B.4.65">Section B.4.65: <code><nobr>ENTER</nobr></code>: Create Stack Frame</a><br>
<a href="nasmdocb.html#section-B.4.66">Section B.4.66: <code><nobr>F2XM1</nobr></code>: Calculate 2**X-1</a><br>
<a href="nasmdocb.html#section-B.4.67">Section B.4.67: <code><nobr>FABS</nobr></code>: Floating-Point Absolute Value</a><br>
<a href="nasmdocb.html#section-B.4.68">Section B.4.68: <code><nobr>FADD</nobr></code>, <code><nobr>FADDP</nobr></code>: Floating-Point Addition</a><br>
<a href="nasmdocb.html#section-B.4.69">Section B.4.69: <code><nobr>FBLD</nobr></code>, <code><nobr>FBSTP</nobr></code>: BCD Floating-Point Load and Store</a><br>
<a href="nasmdocb.html#section-B.4.70">Section B.4.70: <code><nobr>FCHS</nobr></code>: Floating-Point Change Sign</a><br>
<a href="nasmdocb.html#section-B.4.71">Section B.4.71: <code><nobr>FCLEX</nobr></code>, <code><nobr>FNCLEX</nobr></code>: Clear Floating-Point Exceptions</a><br>
<a href="nasmdocb.html#section-B.4.72">Section B.4.72: <code><nobr>FCMOVcc</nobr></code>: Floating-Point Conditional Move</a><br>
<a href="nasmdocb.html#section-B.4.73">Section B.4.73: <code><nobr>FCOM</nobr></code>, <code><nobr>FCOMP</nobr></code>, <code><nobr>FCOMPP</nobr></code>, <code><nobr>FCOMI</nobr></code>, <code><nobr>FCOMIP</nobr></code>: Floating-Point Compare</a><br>
<a href="nasmdocb.html#section-B.4.74">Section B.4.74: <code><nobr>FCOS</nobr></code>: Cosine</a><br>
<a href="nasmdocb.html#section-B.4.75">Section B.4.75: <code><nobr>FDECSTP</nobr></code>: Decrement Floating-Point Stack Pointer</a><br>
<a href="nasmdocb.html#section-B.4.76">Section B.4.76: <code><nobr>FxDISI</nobr></code>, <code><nobr>FxENI</nobr></code>: Disable and Enable Floating-Point Interrupts</a><br>
<a href="nasmdocb.html#section-B.4.77">Section B.4.77: <code><nobr>FDIV</nobr></code>, <code><nobr>FDIVP</nobr></code>, <code><nobr>FDIVR</nobr></code>, <code><nobr>FDIVRP</nobr></code>: Floating-Point Division</a><br>
<a href="nasmdocb.html#section-B.4.78">Section B.4.78: <code><nobr>FEMMS</nobr></code>: Faster Enter/Exit of the MMX or floating-point state</a><br>
<a href="nasmdocb.html#section-B.4.79">Section B.4.79: <code><nobr>FFREE</nobr></code>: Flag Floating-Point Register as Unused</a><br>
<a href="nasmdocb.html#section-B.4.80">Section B.4.80: <code><nobr>FIADD</nobr></code>: Floating-Point/Integer Addition</a><br>
<a href="nasmdocb.html#section-B.4.81">Section B.4.81: <code><nobr>FICOM</nobr></code>, <code><nobr>FICOMP</nobr></code>: Floating-Point/Integer Compare</a><br>
<a href="nasmdocb.html#section-B.4.82">Section B.4.82: <code><nobr>FIDIV</nobr></code>, <code><nobr>FIDIVR</nobr></code>: Floating-Point/Integer Division</a><br>
<a href="nasmdocb.html#section-B.4.83">Section B.4.83: <code><nobr>FILD</nobr></code>, <code><nobr>FIST</nobr></code>, <code><nobr>FISTP</nobr></code>: Floating-Point/Integer Conversion</a><br>
<a href="nasmdocb.html#section-B.4.84">Section B.4.84: <code><nobr>FIMUL</nobr></code>: Floating-Point/Integer Multiplication</a><br>
<a href="nasmdocb.html#section-B.4.85">Section B.4.85: <code><nobr>FINCSTP</nobr></code>: Increment Floating-Point Stack Pointer</a><br>
<a href="nasmdocb.html#section-B.4.86">Section B.4.86: <code><nobr>FINIT</nobr></code>, <code><nobr>FNINIT</nobr></code>: Initialise Floating-Point Unit</a><br>
<a href="nasmdocb.html#section-B.4.87">Section B.4.87: <code><nobr>FISUB</nobr></code>: Floating-Point/Integer Subtraction</a><br>
<a href="nasmdocb.html#section-B.4.88">Section B.4.88: <code><nobr>FLD</nobr></code>: Floating-Point Load</a><br>
<a href="nasmdocb.html#section-B.4.89">Section B.4.89: <code><nobr>FLDxx</nobr></code>: Floating-Point Load Constants</a><br>
<a href="nasmdocb.html#section-B.4.90">Section B.4.90: <code><nobr>FLDCW</nobr></code>: Load Floating-Point Control Word</a><br>
<a href="nasmdocb.html#section-B.4.91">Section B.4.91: <code><nobr>FLDENV</nobr></code>: Load Floating-Point Environment</a><br>
<a href="nasmdocb.html#section-B.4.92">Section B.4.92: <code><nobr>FMUL</nobr></code>, <code><nobr>FMULP</nobr></code>: Floating-Point Multiply</a><br>
<a href="nasmdocb.html#section-B.4.93">Section B.4.93: <code><nobr>FNOP</nobr></code>: Floating-Point No Operation</a><br>
<a href="nasmdocb.html#section-B.4.94">Section B.4.94: <code><nobr>FPATAN</nobr></code>, <code><nobr>FPTAN</nobr></code>: Arctangent and Tangent</a><br>
<a href="nasmdocb.html#section-B.4.95">Section B.4.95: <code><nobr>FPREM</nobr></code>, <code><nobr>FPREM1</nobr></code>: Floating-Point Partial Remainder</a><br>
<a href="nasmdocb.html#section-B.4.96">Section B.4.96: <code><nobr>FRNDINT</nobr></code>: Floating-Point Round to Integer</a><br>
<a href="nasmdocb.html#section-B.4.97">Section B.4.97: <code><nobr>FSAVE</nobr></code>, <code><nobr>FRSTOR</nobr></code>: Save/Restore Floating-Point State</a><br>
<a href="nasmdocb.html#section-B.4.98">Section B.4.98: <code><nobr>FSCALE</nobr></code>: Scale Floating-Point Value by Power of Two</a><br>
<a href="nasmdocb.html#section-B.4.99">Section B.4.99: <code><nobr>FSETPM</nobr></code>: Set Protected Mode</a><br>
<a href="nasmdocb.html#section-B.4.100">Section B.4.100: <code><nobr>FSIN</nobr></code>, <code><nobr>FSINCOS</nobr></code>: Sine and Cosine</a><br>
<a href="nasmdocb.html#section-B.4.101">Section B.4.101: <code><nobr>FSQRT</nobr></code>: Floating-Point Square Root</a><br>
<a href="nasmdocb.html#section-B.4.102">Section B.4.102: <code><nobr>FST</nobr></code>, <code><nobr>FSTP</nobr></code>: Floating-Point Store</a><br>
<a href="nasmdocb.html#section-B.4.103">Section B.4.103: <code><nobr>FSTCW</nobr></code>: Store Floating-Point Control Word</a><br>
<a href="nasmdocb.html#section-B.4.104">Section B.4.104: <code><nobr>FSTENV</nobr></code>: Store Floating-Point Environment</a><br>
<a href="nasmdocb.html#section-B.4.105">Section B.4.105: <code><nobr>FSTSW</nobr></code>: Store Floating-Point Status Word</a><br>
<a href="nasmdocb.html#section-B.4.106">Section B.4.106: <code><nobr>FSUB</nobr></code>, <code><nobr>FSUBP</nobr></code>, <code><nobr>FSUBR</nobr></code>, <code><nobr>FSUBRP</nobr></code>: Floating-Point Subtract</a><br>
<a href="nasmdocb.html#section-B.4.107">Section B.4.107: <code><nobr>FTST</nobr></code>: Test <code><nobr>ST0</nobr></code> Against Zero</a><br>
<a href="nasmdocb.html#section-B.4.108">Section B.4.108: <code><nobr>FUCOMxx</nobr></code>: Floating-Point Unordered Compare</a><br>
<a href="nasmdocb.html#section-B.4.109">Section B.4.109: <code><nobr>FXAM</nobr></code>: Examine Class of Value in <code><nobr>ST0</nobr></code></a><br>
<a href="nasmdocb.html#section-B.4.110">Section B.4.110: <code><nobr>FXCH</nobr></code>: Floating-Point Exchange</a><br>
<a href="nasmdocb.html#section-B.4.111">Section B.4.111: <code><nobr>FXRSTOR</nobr></code>: Restore <code><nobr>FP</nobr></code>, <code><nobr>MMX</nobr></code> and <code><nobr>SSE</nobr></code> State</a><br>
<a href="nasmdocb.html#section-B.4.112">Section B.4.112: <code><nobr>FXSAVE</nobr></code>: Store <code><nobr>FP</nobr></code>, <code><nobr>MMX</nobr></code> and <code><nobr>SSE</nobr></code> State</a><br>
<a href="nasmdocb.html#section-B.4.113">Section B.4.113: <code><nobr>FXTRACT</nobr></code>: Extract Exponent and Significand</a><br>
<a href="nasmdocb.html#section-B.4.114">Section B.4.114: <code><nobr>FYL2X</nobr></code>, <code><nobr>FYL2XP1</nobr></code>: Compute Y times Log2(X) or Log2(X+1)</a><br>
<a href="nasmdocb.html#section-B.4.115">Section B.4.115: <code><nobr>HLT</nobr></code>: Halt Processor</a><br>
<a href="nasmdocb.html#section-B.4.116">Section B.4.116: <code><nobr>IBTS</nobr></code>: Insert Bit String</a><br>
<a href="nasmdocb.html#section-B.4.117">Section B.4.117: <code><nobr>IDIV</nobr></code>: Signed Integer Divide</a><br>
<a href="nasmdocb.html#section-B.4.118">Section B.4.118: <code><nobr>IMUL</nobr></code>: Signed Integer Multiply</a><br>
<a href="nasmdocb.html#section-B.4.119">Section B.4.119: <code><nobr>IN</nobr></code>: Input from I/O Port</a><br>
<a href="nasmdocb.html#section-B.4.120">Section B.4.120: <code><nobr>INC</nobr></code>: Increment Integer</a><br>
<a href="nasmdocb.html#section-B.4.121">Section B.4.121: <code><nobr>INSB</nobr></code>, <code><nobr>INSW</nobr></code>, <code><nobr>INSD</nobr></code>: Input String from I/O Port</a><br>
<a href="nasmdocb.html#section-B.4.122">Section B.4.122: <code><nobr>INT</nobr></code>: Software Interrupt</a><br>
<a href="nasmdocb.html#section-B.4.123">Section B.4.123: <code><nobr>INT3</nobr></code>, <code><nobr>INT1</nobr></code>, <code><nobr>ICEBP</nobr></code>, <code><nobr>INT01</nobr></code>: Breakpoints</a><br>
<a href="nasmdocb.html#section-B.4.124">Section B.4.124: <code><nobr>INTO</nobr></code>: Interrupt if Overflow</a><br>
<a href="nasmdocb.html#section-B.4.125">Section B.4.125: <code><nobr>INVD</nobr></code>: Invalidate Internal Caches</a><br>
<a href="nasmdocb.html#section-B.4.126">Section B.4.126: <code><nobr>INVLPG</nobr></code>: Invalidate TLB Entry</a><br>
<a href="nasmdocb.html#section-B.4.127">Section B.4.127: <code><nobr>IRET</nobr></code>, <code><nobr>IRETW</nobr></code>, <code><nobr>IRETD</nobr></code>: Return from Interrupt</a><br>
<a href="nasmdocb.html#section-B.4.128">Section B.4.128: <code><nobr>Jcc</nobr></code>: Conditional Branch</a><br>
<a href="nasmdocb.html#section-B.4.129">Section B.4.129: <code><nobr>JCXZ</nobr></code>, <code><nobr>JECXZ</nobr></code>: Jump if CX/ECX Zero</a><br>
<a href="nasmdocb.html#section-B.4.130">Section B.4.130: <code><nobr>JMP</nobr></code>: Jump</a><br>
<a href="nasmdocb.html#section-B.4.131">Section B.4.131: <code><nobr>LAHF</nobr></code>: Load AH from Flags</a><br>
<a href="nasmdocb.html#section-B.4.132">Section B.4.132: <code><nobr>LAR</nobr></code>: Load Access Rights</a><br>
<a href="nasmdocb.html#section-B.4.133">Section B.4.133: <code><nobr>LDMXCSR</nobr></code>: Load Streaming SIMD Extension Control/Status</a><br>
<a href="nasmdocb.html#section-B.4.134">Section B.4.134: <code><nobr>LDS</nobr></code>, <code><nobr>LES</nobr></code>, <code><nobr>LFS</nobr></code>, <code><nobr>LGS</nobr></code>, <code><nobr>LSS</nobr></code>: Load Far Pointer</a><br>
<a href="nasmdocb.html#section-B.4.135">Section B.4.135: <code><nobr>LEA</nobr></code>: Load Effective Address</a><br>
<a href="nasmdocb.html#section-B.4.136">Section B.4.136: <code><nobr>LEAVE</nobr></code>: Destroy Stack Frame</a><br>
<a href="nasmdocb.html#section-B.4.137">Section B.4.137: <code><nobr>LFENCE</nobr></code>: Load Fence</a><br>
<a href="nasmdocb.html#section-B.4.138">Section B.4.138: <code><nobr>LGDT</nobr></code>, <code><nobr>LIDT</nobr></code>, <code><nobr>LLDT</nobr></code>: Load Descriptor Tables</a><br>
<a href="nasmdocb.html#section-B.4.139">Section B.4.139: <code><nobr>LMSW</nobr></code>: Load/Store Machine Status Word</a><br>
<a href="nasmdocb.html#section-B.4.140">Section B.4.140: <code><nobr>LOADALL</nobr></code>, <code><nobr>LOADALL286</nobr></code>: Load Processor State</a><br>
<a href="nasmdocb.html#section-B.4.141">Section B.4.141: <code><nobr>LODSB</nobr></code>, <code><nobr>LODSW</nobr></code>, <code><nobr>LODSD</nobr></code>: Load from String</a><br>
<a href="nasmdocb.html#section-B.4.142">Section B.4.142: <code><nobr>LOOP</nobr></code>, <code><nobr>LOOPE</nobr></code>, <code><nobr>LOOPZ</nobr></code>, <code><nobr>LOOPNE</nobr></code>, <code><nobr>LOOPNZ</nobr></code>: Loop with Counter</a><br>
<a href="nasmdocb.html#section-B.4.143">Section B.4.143: <code><nobr>LSL</nobr></code>: Load Segment Limit</a><br>
<a href="nasmdocb.html#section-B.4.144">Section B.4.144: <code><nobr>LTR</nobr></code>: Load Task Register</a><br>
<a href="nasmdocb.html#section-B.4.145">Section B.4.145: <code><nobr>MASKMOVDQU</nobr></code>: Byte Mask Write</a><br>
<a href="nasmdocb.html#section-B.4.146">Section B.4.146: <code><nobr>MASKMOVQ</nobr></code>: Byte Mask Write</a><br>
<a href="nasmdocb.html#section-B.4.147">Section B.4.147: <code><nobr>MAXPD</nobr></code>: Return Packed Double-Precision FP Maximum</a><br>
<a href="nasmdocb.html#section-B.4.148">Section B.4.148: <code><nobr>MAXPS</nobr></code>: Return Packed Single-Precision FP Maximum</a><br>
<a href="nasmdocb.html#section-B.4.149">Section B.4.149: <code><nobr>MAXSD</nobr></code>: Return Scalar Double-Precision FP Maximum</a><br>
<a href="nasmdocb.html#section-B.4.150">Section B.4.150: <code><nobr>MAXSS</nobr></code>: Return Scalar Single-Precision FP Maximum</a><br>
<a href="nasmdocb.html#section-B.4.151">Section B.4.151: <code><nobr>MFENCE</nobr></code>: Memory Fence</a><br>
<a href="nasmdocb.html#section-B.4.152">Section B.4.152: <code><nobr>MINPD</nobr></code>: Return Packed Double-Precision FP Minimum</a><br>
<a href="nasmdocb.html#section-B.4.153">Section B.4.153: <code><nobr>MINPS</nobr></code>: Return Packed Single-Precision FP Minimum</a><br>
<a href="nasmdocb.html#section-B.4.154">Section B.4.154: <code><nobr>MINSD</nobr></code>: Return Scalar Double-Precision FP Minimum</a><br>
<a href="nasmdocb.html#section-B.4.155">Section B.4.155: <code><nobr>MINSS</nobr></code>: Return Scalar Single-Precision FP Minimum</a><br>
<a href="nasmdocb.html#section-B.4.156">Section B.4.156: <code><nobr>MOV</nobr></code>: Move Data</a><br>
<a href="nasmdocb.html#section-B.4.157">Section B.4.157: <code><nobr>MOVAPD</nobr></code>: Move Aligned Packed Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.158">Section B.4.158: <code><nobr>MOVAPS</nobr></code>: Move Aligned Packed Single-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.159">Section B.4.159: <code><nobr>MOVD</nobr></code>: Move Doubleword to/from MMX Register</a><br>
<a href="nasmdocb.html#section-B.4.160">Section B.4.160: <code><nobr>MOVDQ2Q</nobr></code>: Move Quadword from XMM to MMX register.</a><br>
<a href="nasmdocb.html#section-B.4.161">Section B.4.161: <code><nobr>MOVDQA</nobr></code>: Move Aligned Double Quadword</a><br>
<a href="nasmdocb.html#section-B.4.162">Section B.4.162: <code><nobr>MOVDQU</nobr></code>: Move Unaligned Double Quadword</a><br>
<a href="nasmdocb.html#section-B.4.163">Section B.4.163: <code><nobr>MOVHLPS</nobr></code>: Move Packed Single-Precision FP High to Low</a><br>
<a href="nasmdocb.html#section-B.4.164">Section B.4.164: <code><nobr>MOVHPD</nobr></code>: Move High Packed Double-Precision FP</a><br>
<a href="nasmdocb.html#section-B.4.165">Section B.4.165: <code><nobr>MOVHPS</nobr></code>: Move High Packed Single-Precision FP</a><br>
<a href="nasmdocb.html#section-B.4.166">Section B.4.166: <code><nobr>MOVLHPS</nobr></code>: Move Packed Single-Precision FP Low to High</a><br>
<a href="nasmdocb.html#section-B.4.167">Section B.4.167: <code><nobr>MOVLPD</nobr></code>: Move Low Packed Double-Precision FP</a><br>
<a href="nasmdocb.html#section-B.4.168">Section B.4.168: <code><nobr>MOVLPS</nobr></code>: Move Low Packed Single-Precision FP</a><br>
<a href="nasmdocb.html#section-B.4.169">Section B.4.169: <code><nobr>MOVMSKPD</nobr></code>: Extract Packed Double-Precision FP Sign Mask</a><br>
<a href="nasmdocb.html#section-B.4.170">Section B.4.170: <code><nobr>MOVMSKPS</nobr></code>: Extract Packed Single-Precision FP Sign Mask</a><br>
<a href="nasmdocb.html#section-B.4.171">Section B.4.171: <code><nobr>MOVNTDQ</nobr></code>: Move Double Quadword Non Temporal</a><br>
<a href="nasmdocb.html#section-B.4.172">Section B.4.172: <code><nobr>MOVNTI</nobr></code>: Move Doubleword Non Temporal</a><br>
<a href="nasmdocb.html#section-B.4.173">Section B.4.173: <code><nobr>MOVNTPD</nobr></code>: Move Aligned Four Packed Single-Precision FP Values Non Temporal</a><br>
<a href="nasmdocb.html#section-B.4.174">Section B.4.174: <code><nobr>MOVNTPS</nobr></code>: Move Aligned Four Packed Single-Precision FP Values Non Temporal</a><br>
<a href="nasmdocb.html#section-B.4.175">Section B.4.175: <code><nobr>MOVNTQ</nobr></code>: Move Quadword Non Temporal</a><br>
<a href="nasmdocb.html#section-B.4.176">Section B.4.176: <code><nobr>MOVQ</nobr></code>: Move Quadword to/from MMX Register</a><br>
<a href="nasmdocb.html#section-B.4.177">Section B.4.177: <code><nobr>MOVQ2DQ</nobr></code>: Move Quadword from MMX to XMM register.</a><br>
<a href="nasmdocb.html#section-B.4.178">Section B.4.178: <code><nobr>MOVSB</nobr></code>, <code><nobr>MOVSW</nobr></code>, <code><nobr>MOVSD</nobr></code>: Move String</a><br>
<a href="nasmdocb.html#section-B.4.179">Section B.4.179: <code><nobr>MOVSD</nobr></code>: Move Scalar Double-Precision FP Value</a><br>
<a href="nasmdocb.html#section-B.4.180">Section B.4.180: <code><nobr>MOVSS</nobr></code>: Move Scalar Single-Precision FP Value</a><br>
<a href="nasmdocb.html#section-B.4.181">Section B.4.181: <code><nobr>MOVSX</nobr></code>, <code><nobr>MOVZX</nobr></code>: Move Data with Sign or Zero Extend</a><br>
<a href="nasmdocb.html#section-B.4.182">Section B.4.182: <code><nobr>MOVUPD</nobr></code>: Move Unaligned Packed Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.183">Section B.4.183: <code><nobr>MOVUPS</nobr></code>: Move Unaligned Packed Single-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.184">Section B.4.184: <code><nobr>MUL</nobr></code>: Unsigned Integer Multiply</a><br>
<a href="nasmdocb.html#section-B.4.185">Section B.4.185: <code><nobr>MULPD</nobr></code>: Packed Single-FP Multiply</a><br>
<a href="nasmdocb.html#section-B.4.186">Section B.4.186: <code><nobr>MULPS</nobr></code>: Packed Single-FP Multiply</a><br>
<a href="nasmdocb.html#section-B.4.187">Section B.4.187: <code><nobr>MULSD</nobr></code>: Scalar Single-FP Multiply</a><br>
<a href="nasmdocb.html#section-B.4.188">Section B.4.188: <code><nobr>MULSS</nobr></code>: Scalar Single-FP Multiply</a><br>
<a href="nasmdocb.html#section-B.4.189">Section B.4.189: <code><nobr>NEG</nobr></code>, <code><nobr>NOT</nobr></code>: Two's and One's Complement</a><br>
<a href="nasmdocb.html#section-B.4.190">Section B.4.190: <code><nobr>NOP</nobr></code>: No Operation</a><br>
<a href="nasmdocb.html#section-B.4.191">Section B.4.191: <code><nobr>OR</nobr></code>: Bitwise OR</a><br>
<a href="nasmdocb.html#section-B.4.192">Section B.4.192: <code><nobr>ORPD</nobr></code>: Bit-wise Logical OR of Double-Precision FP Data</a><br>
<a href="nasmdocb.html#section-B.4.193">Section B.4.193: <code><nobr>ORPS</nobr></code>: Bit-wise Logical OR of Single-Precision FP Data</a><br>
<a href="nasmdocb.html#section-B.4.194">Section B.4.194: <code><nobr>OUT</nobr></code>: Output Data to I/O Port</a><br>
<a href="nasmdocb.html#section-B.4.195">Section B.4.195: <code><nobr>OUTSB</nobr></code>, <code><nobr>OUTSW</nobr></code>, <code><nobr>OUTSD</nobr></code>: Output String to I/O Port</a><br>
<a href="nasmdocb.html#section-B.4.196">Section B.4.196: <code><nobr>PACKSSDW</nobr></code>, <code><nobr>PACKSSWB</nobr></code>, <code><nobr>PACKUSWB</nobr></code>: Pack Data</a><br>
<a href="nasmdocb.html#section-B.4.197">Section B.4.197: <code><nobr>PADDB</nobr></code>, <code><nobr>PADDW</nobr></code>, <code><nobr>PADDD</nobr></code>: Add Packed Integers</a><br>
<a href="nasmdocb.html#section-B.4.198">Section B.4.198: <code><nobr>PADDQ</nobr></code>: Add Packed Quadword Integers</a><br>
<a href="nasmdocb.html#section-B.4.199">Section B.4.199: <code><nobr>PADDSB</nobr></code>, <code><nobr>PADDSW</nobr></code>: Add Packed Signed Integers With Saturation</a><br>
<a href="nasmdocb.html#section-B.4.200">Section B.4.200: <code><nobr>PADDSIW</nobr></code>: MMX Packed Addition to Implicit Destination</a><br>
<a href="nasmdocb.html#section-B.4.201">Section B.4.201: <code><nobr>PADDUSB</nobr></code>, <code><nobr>PADDUSW</nobr></code>: Add Packed Unsigned Integers With Saturation</a><br>
<a href="nasmdocb.html#section-B.4.202">Section B.4.202: <code><nobr>PAND</nobr></code>, <code><nobr>PANDN</nobr></code>: MMX Bitwise AND and AND-NOT</a><br>
<a href="nasmdocb.html#section-B.4.203">Section B.4.203: <code><nobr>PAUSE</nobr></code>: Spin Loop Hint</a><br>
<a href="nasmdocb.html#section-B.4.204">Section B.4.204: <code><nobr>PAVEB</nobr></code>: MMX Packed Average</a><br>
<a href="nasmdocb.html#section-B.4.205">Section B.4.205: <code><nobr>PAVGB</nobr></code> <code><nobr>PAVGW</nobr></code>: Average Packed Integers</a><br>
<a href="nasmdocb.html#section-B.4.206">Section B.4.206: <code><nobr>PAVGUSB</nobr></code>: Average of unsigned packed 8-bit values</a><br>
<a href="nasmdocb.html#section-B.4.207">Section B.4.207: <code><nobr>PCMPxx</nobr></code>: Compare Packed Integers.</a><br>
<a href="nasmdocb.html#section-B.4.208">Section B.4.208: <code><nobr>PDISTIB</nobr></code>: MMX Packed Distance and Accumulate with Implied Register</a><br>
<a href="nasmdocb.html#section-B.4.209">Section B.4.209: <code><nobr>PEXTRW</nobr></code>: Extract Word</a><br>
<a href="nasmdocb.html#section-B.4.210">Section B.4.210: <code><nobr>PF2ID</nobr></code>: Packed Single-Precision FP to Integer Convert</a><br>
<a href="nasmdocb.html#section-B.4.211">Section B.4.211: <code><nobr>PF2IW</nobr></code>: Packed Single-Precision FP to Integer Word Convert</a><br>
<a href="nasmdocb.html#section-B.4.212">Section B.4.212: <code><nobr>PFACC</nobr></code>: Packed Single-Precision FP Accumulate</a><br>
<a href="nasmdocb.html#section-B.4.213">Section B.4.213: <code><nobr>PFADD</nobr></code>: Packed Single-Precision FP Addition</a><br>
<a href="nasmdocb.html#section-B.4.214">Section B.4.214: <code><nobr>PFCMPxx</nobr></code>: Packed Single-Precision FP Compare </a><br>
<a href="nasmdocb.html#section-B.4.215">Section B.4.215: <code><nobr>PFMAX</nobr></code>: Packed Single-Precision FP Maximum</a><br>
<a href="nasmdocb.html#section-B.4.216">Section B.4.216: <code><nobr>PFMIN</nobr></code>: Packed Single-Precision FP Minimum</a><br>
<a href="nasmdocb.html#section-B.4.217">Section B.4.217: <code><nobr>PFMUL</nobr></code>: Packed Single-Precision FP Multiply</a><br>
<a href="nasmdocb.html#section-B.4.218">Section B.4.218: <code><nobr>PFNACC</nobr></code>: Packed Single-Precision FP Negative Accumulate</a><br>
<a href="nasmdocb.html#section-B.4.219">Section B.4.219: <code><nobr>PFPNACC</nobr></code>: Packed Single-Precision FP Mixed Accumulate</a><br>
<a href="nasmdocb.html#section-B.4.220">Section B.4.220: <code><nobr>PFRCP</nobr></code>: Packed Single-Precision FP Reciprocal Approximation</a><br>
<a href="nasmdocb.html#section-B.4.221">Section B.4.221: <code><nobr>PFRCPIT1</nobr></code>: Packed Single-Precision FP Reciprocal, First Iteration Step</a><br>
<a href="nasmdocb.html#section-B.4.222">Section B.4.222: <code><nobr>PFRCPIT2</nobr></code>: Packed Single-Precision FP Reciprocal/ Reciprocal Square Root, Second Iteration Step</a><br>
<a href="nasmdocb.html#section-B.4.223">Section B.4.223: <code><nobr>PFRSQIT1</nobr></code>: Packed Single-Precision FP Reciprocal Square Root, First Iteration Step</a><br>
<a href="nasmdocb.html#section-B.4.224">Section B.4.224: <code><nobr>PFRSQRT</nobr></code>: Packed Single-Precision FP Reciprocal Square Root Approximation</a><br>
<a href="nasmdocb.html#section-B.4.225">Section B.4.225: <code><nobr>PFSUB</nobr></code>: Packed Single-Precision FP Subtract</a><br>
<a href="nasmdocb.html#section-B.4.226">Section B.4.226: <code><nobr>PFSUBR</nobr></code>: Packed Single-Precision FP Reverse Subtract</a><br>
<a href="nasmdocb.html#section-B.4.227">Section B.4.227: <code><nobr>PI2FD</nobr></code>: Packed Doubleword Integer to Single-Precision FP Convert</a><br>
<a href="nasmdocb.html#section-B.4.228">Section B.4.228: <code><nobr>PF2IW</nobr></code>: Packed Word Integer to Single-Precision FP Convert</a><br>
<a href="nasmdocb.html#section-B.4.229">Section B.4.229: <code><nobr>PINSRW</nobr></code>: Insert Word</a><br>
<a href="nasmdocb.html#section-B.4.230">Section B.4.230: <code><nobr>PMACHRIW</nobr></code>: Packed Multiply and Accumulate with Rounding</a><br>
<a href="nasmdocb.html#section-B.4.231">Section B.4.231: <code><nobr>PMADDWD</nobr></code>: MMX Packed Multiply and Add</a><br>
<a href="nasmdocb.html#section-B.4.232">Section B.4.232: <code><nobr>PMAGW</nobr></code>: MMX Packed Magnitude</a><br>
<a href="nasmdocb.html#section-B.4.233">Section B.4.233: <code><nobr>PMAXSW</nobr></code>: Packed Signed Integer Word Maximum</a><br>
<a href="nasmdocb.html#section-B.4.234">Section B.4.234: <code><nobr>PMAXUB</nobr></code>: Packed Unsigned Integer Byte Maximum</a><br>
<a href="nasmdocb.html#section-B.4.235">Section B.4.235: <code><nobr>PMINSW</nobr></code>: Packed Signed Integer Word Minimum</a><br>
<a href="nasmdocb.html#section-B.4.236">Section B.4.236: <code><nobr>PMINUB</nobr></code>: Packed Unsigned Integer Byte Minimum</a><br>
<a href="nasmdocb.html#section-B.4.237">Section B.4.237: <code><nobr>PMOVMSKB</nobr></code>: Move Byte Mask To Integer</a><br>
<a href="nasmdocb.html#section-B.4.238">Section B.4.238: <code><nobr>PMULHRWC</nobr></code>, <code><nobr>PMULHRIW</nobr></code>: Multiply Packed 16-bit Integers With Rounding, and Store High Word</a><br>
<a href="nasmdocb.html#section-B.4.239">Section B.4.239: <code><nobr>PMULHRWA</nobr></code>: Multiply Packed 16-bit Integers With Rounding, and Store High Word</a><br>
<a href="nasmdocb.html#section-B.4.240">Section B.4.240: <code><nobr>PMULHUW</nobr></code>: Multiply Packed 16-bit Integers, and Store High Word</a><br>
<a href="nasmdocb.html#section-B.4.241">Section B.4.241: <code><nobr>PMULHW</nobr></code>, <code><nobr>PMULLW</nobr></code>: Multiply Packed 16-bit Integers, and Store</a><br>
<a href="nasmdocb.html#section-B.4.242">Section B.4.242: <code><nobr>PMULUDQ</nobr></code>: Multiply Packed Unsigned 32-bit Integers, and Store.</a><br>
<a href="nasmdocb.html#section-B.4.243">Section B.4.243: <code><nobr>PMVccZB</nobr></code>: MMX Packed Conditional Move</a><br>
<a href="nasmdocb.html#section-B.4.244">Section B.4.244: <code><nobr>POP</nobr></code>: Pop Data from Stack</a><br>
<a href="nasmdocb.html#section-B.4.245">Section B.4.245: <code><nobr>POPAx</nobr></code>: Pop All General-Purpose Registers</a><br>
<a href="nasmdocb.html#section-B.4.246">Section B.4.246: <code><nobr>POPFx</nobr></code>: Pop Flags Register</a><br>
<a href="nasmdocb.html#section-B.4.247">Section B.4.247: <code><nobr>POR</nobr></code>: MMX Bitwise OR</a><br>
<a href="nasmdocb.html#section-B.4.248">Section B.4.248: <code><nobr>PREFETCH</nobr></code>: Prefetch Data Into Caches</a><br>
<a href="nasmdocb.html#section-B.4.249">Section B.4.249: <code><nobr>PREFETCHh</nobr></code>: Prefetch Data Into Caches </a><br>
<a href="nasmdocb.html#section-B.4.250">Section B.4.250: <code><nobr>PSADBW</nobr></code>: Packed Sum of Absolute Differences</a><br>
<a href="nasmdocb.html#section-B.4.251">Section B.4.251: <code><nobr>PSHUFD</nobr></code>: Shuffle Packed Doublewords</a><br>
<a href="nasmdocb.html#section-B.4.252">Section B.4.252: <code><nobr>PSHUFHW</nobr></code>: Shuffle Packed High Words</a><br>
<a href="nasmdocb.html#section-B.4.253">Section B.4.253: <code><nobr>PSHUFLW</nobr></code>: Shuffle Packed Low Words</a><br>
<a href="nasmdocb.html#section-B.4.254">Section B.4.254: <code><nobr>PSHUFW</nobr></code>: Shuffle Packed Words</a><br>
<a href="nasmdocb.html#section-B.4.255">Section B.4.255: <code><nobr>PSLLx</nobr></code>: Packed Data Bit Shift Left Logical</a><br>
<a href="nasmdocb.html#section-B.4.256">Section B.4.256: <code><nobr>PSRAx</nobr></code>: Packed Data Bit Shift Right Arithmetic</a><br>
<a href="nasmdocb.html#section-B.4.257">Section B.4.257: <code><nobr>PSRLx</nobr></code>: Packed Data Bit Shift Right Logical</a><br>
<a href="nasmdocb.html#section-B.4.258">Section B.4.258: <code><nobr>PSUBx</nobr></code>: Subtract Packed Integers</a><br>
<a href="nasmdocb.html#section-B.4.259">Section B.4.259: <code><nobr>PSUBSxx</nobr></code>, <code><nobr>PSUBUSx</nobr></code>: Subtract Packed Integers With Saturation</a><br>
<a href="nasmdocb.html#section-B.4.260">Section B.4.260: <code><nobr>PSUBSIW</nobr></code>: MMX Packed Subtract with Saturation to Implied Destination</a><br>
<a href="nasmdocb.html#section-B.4.261">Section B.4.261: <code><nobr>PSWAPD</nobr></code>: Swap Packed Data </a><br>
<a href="nasmdocb.html#section-B.4.262">Section B.4.262: <code><nobr>PUNPCKxxx</nobr></code>: Unpack and Interleave Data</a><br>
<a href="nasmdocb.html#section-B.4.263">Section B.4.263: <code><nobr>PUSH</nobr></code>: Push Data on Stack</a><br>
<a href="nasmdocb.html#section-B.4.264">Section B.4.264: <code><nobr>PUSHAx</nobr></code>: Push All General-Purpose Registers</a><br>
<a href="nasmdocb.html#section-B.4.265">Section B.4.265: <code><nobr>PUSHFx</nobr></code>: Push Flags Register</a><br>
<a href="nasmdocb.html#section-B.4.266">Section B.4.266: <code><nobr>PXOR</nobr></code>: MMX Bitwise XOR</a><br>
<a href="nasmdocb.html#section-B.4.267">Section B.4.267: <code><nobr>RCL</nobr></code>, <code><nobr>RCR</nobr></code>: Bitwise Rotate through Carry Bit</a><br>
<a href="nasmdocb.html#section-B.4.268">Section B.4.268: <code><nobr>RCPPS</nobr></code>: Packed Single-Precision FP Reciprocal</a><br>
<a href="nasmdocb.html#section-B.4.269">Section B.4.269: <code><nobr>RCPSS</nobr></code>: Scalar Single-Precision FP Reciprocal</a><br>
<a href="nasmdocb.html#section-B.4.270">Section B.4.270: <code><nobr>RDMSR</nobr></code>: Read Model-Specific Registers</a><br>
<a href="nasmdocb.html#section-B.4.271">Section B.4.271: <code><nobr>RDPMC</nobr></code>: Read Performance-Monitoring Counters</a><br>
<a href="nasmdocb.html#section-B.4.272">Section B.4.272: <code><nobr>RDSHR</nobr></code>: Read SMM Header Pointer Register</a><br>
<a href="nasmdocb.html#section-B.4.273">Section B.4.273: <code><nobr>RDTSC</nobr></code>: Read Time-Stamp Counter</a><br>
<a href="nasmdocb.html#section-B.4.274">Section B.4.274: <code><nobr>RET</nobr></code>, <code><nobr>RETF</nobr></code>, <code><nobr>RETN</nobr></code>: Return from Procedure Call</a><br>
<a href="nasmdocb.html#section-B.4.275">Section B.4.275: <code><nobr>ROL</nobr></code>, <code><nobr>ROR</nobr></code>: Bitwise Rotate</a><br>
<a href="nasmdocb.html#section-B.4.276">Section B.4.276: <code><nobr>RSDC</nobr></code>: Restore Segment Register and Descriptor</a><br>
<a href="nasmdocb.html#section-B.4.277">Section B.4.277: <code><nobr>RSLDT</nobr></code>: Restore Segment Register and Descriptor</a><br>
<a href="nasmdocb.html#section-B.4.278">Section B.4.278: <code><nobr>RSM</nobr></code>: Resume from System-Management Mode</a><br>
<a href="nasmdocb.html#section-B.4.279">Section B.4.279: <code><nobr>RSQRTPS</nobr></code>: Packed Single-Precision FP Square Root Reciprocal</a><br>
<a href="nasmdocb.html#section-B.4.280">Section B.4.280: <code><nobr>RSQRTSS</nobr></code>: Scalar Single-Precision FP Square Root Reciprocal</a><br>
<a href="nasmdocb.html#section-B.4.281">Section B.4.281: <code><nobr>RSTS</nobr></code>: Restore TSR and Descriptor</a><br>
<a href="nasmdocb.html#section-B.4.282">Section B.4.282: <code><nobr>SAHF</nobr></code>: Store AH to Flags</a><br>
<a href="nasmdocb.html#section-B.4.283">Section B.4.283: <code><nobr>SAL</nobr></code>, <code><nobr>SAR</nobr></code>: Bitwise Arithmetic Shifts</a><br>
<a href="nasmdocb.html#section-B.4.284">Section B.4.284: <code><nobr>SALC</nobr></code>: Set AL from Carry Flag</a><br>
<a href="nasmdocb.html#section-B.4.285">Section B.4.285: <code><nobr>SBB</nobr></code>: Subtract with Borrow</a><br>
<a href="nasmdocb.html#section-B.4.286">Section B.4.286: <code><nobr>SCASB</nobr></code>, <code><nobr>SCASW</nobr></code>, <code><nobr>SCASD</nobr></code>: Scan String</a><br>
<a href="nasmdocb.html#section-B.4.287">Section B.4.287: <code><nobr>SETcc</nobr></code>: Set Register from Condition</a><br>
<a href="nasmdocb.html#section-B.4.288">Section B.4.288: <code><nobr>SFENCE</nobr></code>: Store Fence</a><br>
<a href="nasmdocb.html#section-B.4.289">Section B.4.289: <code><nobr>SGDT</nobr></code>, <code><nobr>SIDT</nobr></code>, <code><nobr>SLDT</nobr></code>: Store Descriptor Table Pointers</a><br>
<a href="nasmdocb.html#section-B.4.290">Section B.4.290: <code><nobr>SHL</nobr></code>, <code><nobr>SHR</nobr></code>: Bitwise Logical Shifts</a><br>
<a href="nasmdocb.html#section-B.4.291">Section B.4.291: <code><nobr>SHLD</nobr></code>, <code><nobr>SHRD</nobr></code>: Bitwise Double-Precision Shifts</a><br>
<a href="nasmdocb.html#section-B.4.292">Section B.4.292: <code><nobr>SHUFPD</nobr></code>: Shuffle Packed Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.293">Section B.4.293: <code><nobr>SHUFPS</nobr></code>: Shuffle Packed Single-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.294">Section B.4.294: <code><nobr>SMI</nobr></code>: System Management Interrupt</a><br>
<a href="nasmdocb.html#section-B.4.295">Section B.4.295: <code><nobr>SMINT</nobr></code>, <code><nobr>SMINTOLD</nobr></code>: Software SMM Entry (CYRIX)</a><br>
<a href="nasmdocb.html#section-B.4.296">Section B.4.296: <code><nobr>SMSW</nobr></code>: Store Machine Status Word</a><br>
<a href="nasmdocb.html#section-B.4.297">Section B.4.297: <code><nobr>SQRTPD</nobr></code>: Packed Double-Precision FP Square Root</a><br>
<a href="nasmdocb.html#section-B.4.298">Section B.4.298: <code><nobr>SQRTPS</nobr></code>: Packed Single-Precision FP Square Root</a><br>
<a href="nasmdocb.html#section-B.4.299">Section B.4.299: <code><nobr>SQRTSD</nobr></code>: Scalar Double-Precision FP Square Root</a><br>
<a href="nasmdocb.html#section-B.4.300">Section B.4.300: <code><nobr>SQRTSS</nobr></code>: Scalar Single-Precision FP Square Root</a><br>
<a href="nasmdocb.html#section-B.4.301">Section B.4.301: <code><nobr>STC</nobr></code>, <code><nobr>STD</nobr></code>, <code><nobr>STI</nobr></code>: Set Flags</a><br>
<a href="nasmdocb.html#section-B.4.302">Section B.4.302: <code><nobr>STMXCSR</nobr></code>: Store Streaming SIMD Extension Control/Status</a><br>
<a href="nasmdocb.html#section-B.4.303">Section B.4.303: <code><nobr>STOSB</nobr></code>, <code><nobr>STOSW</nobr></code>, <code><nobr>STOSD</nobr></code>: Store Byte to String</a><br>
<a href="nasmdocb.html#section-B.4.304">Section B.4.304: <code><nobr>STR</nobr></code>: Store Task Register</a><br>
<a href="nasmdocb.html#section-B.4.305">Section B.4.305: <code><nobr>SUB</nobr></code>: Subtract Integers</a><br>
<a href="nasmdocb.html#section-B.4.306">Section B.4.306: <code><nobr>SUBPD</nobr></code>: Packed Double-Precision FP Subtract</a><br>
<a href="nasmdocb.html#section-B.4.307">Section B.4.307: <code><nobr>SUBPS</nobr></code>: Packed Single-Precision FP Subtract</a><br>
<a href="nasmdocb.html#section-B.4.308">Section B.4.308: <code><nobr>SUBSD</nobr></code>: Scalar Single-FP Subtract</a><br>
<a href="nasmdocb.html#section-B.4.309">Section B.4.309: <code><nobr>SUBSS</nobr></code>: Scalar Single-FP Subtract</a><br>
<a href="nasmdocb.html#section-B.4.310">Section B.4.310: <code><nobr>SVDC</nobr></code>: Save Segment Register and Descriptor</a><br>
<a href="nasmdocb.html#section-B.4.311">Section B.4.311: <code><nobr>SVLDT</nobr></code>: Save LDTR and Descriptor</a><br>
<a href="nasmdocb.html#section-B.4.312">Section B.4.312: <code><nobr>SVTS</nobr></code>: Save TSR and Descriptor</a><br>
<a href="nasmdocb.html#section-B.4.313">Section B.4.313: <code><nobr>SYSCALL</nobr></code>: Call Operating System</a><br>
<a href="nasmdocb.html#section-B.4.314">Section B.4.314: <code><nobr>SYSENTER</nobr></code>: Fast System Call</a><br>
<a href="nasmdocb.html#section-B.4.315">Section B.4.315: <code><nobr>SYSEXIT</nobr></code>: Fast Return From System Call</a><br>
<a href="nasmdocb.html#section-B.4.316">Section B.4.316: <code><nobr>SYSRET</nobr></code>: Return From Operating System</a><br>
<a href="nasmdocb.html#section-B.4.317">Section B.4.317: <code><nobr>TEST</nobr></code>: Test Bits (notional bitwise AND)</a><br>
<a href="nasmdocb.html#section-B.4.318">Section B.4.318: <code><nobr>UCOMISD</nobr></code>: Unordered Scalar Double-Precision FP compare and set EFLAGS</a><br>
<a href="nasmdocb.html#section-B.4.319">Section B.4.319: <code><nobr>UCOMISS</nobr></code>: Unordered Scalar Single-Precision FP compare and set EFLAGS</a><br>
<a href="nasmdocb.html#section-B.4.320">Section B.4.320: <code><nobr>UD0</nobr></code>, <code><nobr>UD1</nobr></code>, <code><nobr>UD2</nobr></code>: Undefined Instruction</a><br>
<a href="nasmdocb.html#section-B.4.321">Section B.4.321: <code><nobr>UMOV</nobr></code>: User Move Data</a><br>
<a href="nasmdocb.html#section-B.4.322">Section B.4.322: <code><nobr>UNPCKHPD</nobr></code>: Unpack and Interleave High Packed Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.323">Section B.4.323: <code><nobr>UNPCKHPS</nobr></code>: Unpack and Interleave High Packed Single-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.324">Section B.4.324: <code><nobr>UNPCKLPD</nobr></code>: Unpack and Interleave Low Packed Double-Precision FP Data</a><br>
<a href="nasmdocb.html#section-B.4.325">Section B.4.325: <code><nobr>UNPCKLPS</nobr></code>: Unpack and Interleave Low Packed Single-Precision FP Data</a><br>
<a href="nasmdocb.html#section-B.4.326">Section B.4.326: <code><nobr>VERR</nobr></code>, <code><nobr>VERW</nobr></code>: Verify Segment Readability/Writability</a><br>
<a href="nasmdocb.html#section-B.4.327">Section B.4.327: <code><nobr>WAIT</nobr></code>: Wait for Floating-Point Processor</a><br>
<a href="nasmdocb.html#section-B.4.328">Section B.4.328: <code><nobr>WBINVD</nobr></code>: Write Back and Invalidate Cache</a><br>
<a href="nasmdocb.html#section-B.4.329">Section B.4.329: <code><nobr>WRMSR</nobr></code>: Write Model-Specific Registers</a><br>
<a href="nasmdocb.html#section-B.4.330">Section B.4.330: <code><nobr>WRSHR</nobr></code>: Write SMM Header Pointer Register</a><br>
<a href="nasmdocb.html#section-B.4.331">Section B.4.331: <code><nobr>XADD</nobr></code>: Exchange and Add</a><br>
<a href="nasmdocb.html#section-B.4.332">Section B.4.332: <code><nobr>XBTS</nobr></code>: Extract Bit String</a><br>
<a href="nasmdocb.html#section-B.4.333">Section B.4.333: <code><nobr>XCHG</nobr></code>: Exchange</a><br>
<a href="nasmdocb.html#section-B.4.334">Section B.4.334: <code><nobr>XLATB</nobr></code>: Translate Byte in Lookup Table</a><br>
<a href="nasmdocb.html#section-B.4.335">Section B.4.335: <code><nobr>XOR</nobr></code>: Bitwise Exclusive OR</a><br>
<a href="nasmdocb.html#section-B.4.336">Section B.4.336: <code><nobr>XORPD</nobr></code>: Bitwise Logical XOR of Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.337">Section B.4.337: <code><nobr>XORPS</nobr></code>: Bitwise Logical XOR of Single-Precision FP Values</a><br>
<p><a href="nasmdoci.html">Index</a>
</body></html>

View File

@@ -0,0 +1,178 @@
<html><head><title>NASM Manual</title></head>
<body><h1 align=center>The Netwide Assembler: NASM</h1>
<p align=center><a href="nasmdoca.html">Next Chapter</a> |
<a href="nasmdoc9.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
<h2><a name="chapter-10">Chapter 10: Troubleshooting</a></h2>
<p>This chapter describes some of the common problems that users have been
known to encounter with NASM, and answers them. It also gives instructions
for reporting bugs in NASM if you find a difficulty that isn't listed here.
<h3><a name="section-10.1">10.1 Common Problems</a></h3>
<h4><a name="section-10.1.1">10.1.1 NASM Generates Inefficient Code</a></h4>
<p>We sometimes get `bug' reports about NASM generating inefficient, or
even `wrong', code on instructions such as
<code><nobr>ADD ESP,8</nobr></code>. This is a deliberate design feature,
connected to predictability of output: NASM, on seeing
<code><nobr>ADD ESP,8</nobr></code>, will generate the form of the
instruction which leaves room for a 32-bit offset. You need to code
<code><nobr>ADD ESP,BYTE 8</nobr></code> if you want the space-efficient
form of the instruction. This isn't a bug, it's user error: if you prefer
to have NASM produce the more efficient code automatically enable
optimization with the <code><nobr>-On</nobr></code> option (see
<a href="nasmdoc2.html#section-2.1.16">section 2.1.16</a>).
<h4><a name="section-10.1.2">10.1.2 My Jumps are Out of Range</a></h4>
<p>Similarly, people complain that when they issue conditional jumps (which
are <code><nobr>SHORT</nobr></code> by default) that try to jump too far,
NASM reports `short jump out of range' instead of making the jumps longer.
<p>This, again, is partly a predictability issue, but in fact has a more
practical reason as well. NASM has no means of being told what type of
processor the code it is generating will be run on; so it cannot decide for
itself that it should generate <code><nobr>Jcc NEAR</nobr></code> type
instructions, because it doesn't know that it's working for a 386 or above.
Alternatively, it could replace the out-of-range short
<code><nobr>JNE</nobr></code> instruction with a very short
<code><nobr>JE</nobr></code> instruction that jumps over a
<code><nobr>JMP NEAR</nobr></code>; this is a sensible solution for
processors below a 386, but hardly efficient on processors which have good
branch prediction <em>and</em> could have used
<code><nobr>JNE NEAR</nobr></code> instead. So, once again, it's up to the
user, not the assembler, to decide what instructions should be generated.
See <a href="nasmdoc2.html#section-2.1.16">section 2.1.16</a>.
<h4><a name="section-10.1.3">10.1.3 <code><nobr>ORG</nobr></code> Doesn't Work</a></h4>
<p>People writing boot sector programs in the <code><nobr>bin</nobr></code>
format often complain that <code><nobr>ORG</nobr></code> doesn't work the
way they'd like: in order to place the <code><nobr>0xAA55</nobr></code>
signature word at the end of a 512-byte boot sector, people who are used to
MASM tend to code
<p><pre>
ORG 0
; some boot sector code
ORG 510
DW 0xAA55
</pre>
<p>This is not the intended use of the <code><nobr>ORG</nobr></code>
directive in NASM, and will not work. The correct way to solve this problem
in NASM is to use the <code><nobr>TIMES</nobr></code> directive, like this:
<p><pre>
ORG 0
; some boot sector code
TIMES 510-($-$$) DB 0
DW 0xAA55
</pre>
<p>The <code><nobr>TIMES</nobr></code> directive will insert exactly enough
zero bytes into the output to move the assembly point up to 510. This
method also has the advantage that if you accidentally fill your boot
sector too full, NASM will catch the problem at assembly time and report
it, so you won't end up with a boot sector that you have to disassemble to
find out what's wrong with it.
<h4><a name="section-10.1.4">10.1.4 <code><nobr>TIMES</nobr></code> Doesn't Work</a></h4>
<p>The other common problem with the above code is people who write the
<code><nobr>TIMES</nobr></code> line as
<p><pre>
TIMES 510-$ DB 0
</pre>
<p>by reasoning that <code><nobr>$</nobr></code> should be a pure number,
just like 510, so the difference between them is also a pure number and can
happily be fed to <code><nobr>TIMES</nobr></code>.
<p>NASM is a <em>modular</em> assembler: the various component parts are
designed to be easily separable for re-use, so they don't exchange
information unnecessarily. In consequence, the
<code><nobr>bin</nobr></code> output format, even though it has been told
by the <code><nobr>ORG</nobr></code> directive that the
<code><nobr>.text</nobr></code> section should start at 0, does not pass
that information back to the expression evaluator. So from the evaluator's
point of view, <code><nobr>$</nobr></code> isn't a pure number: it's an
offset from a section base. Therefore the difference between
<code><nobr>$</nobr></code> and 510 is also not a pure number, but involves
a section base. Values involving section bases cannot be passed as
arguments to <code><nobr>TIMES</nobr></code>.
<p>The solution, as in the previous section, is to code the
<code><nobr>TIMES</nobr></code> line in the form
<p><pre>
TIMES 510-($-$$) DB 0
</pre>
<p>in which <code><nobr>$</nobr></code> and <code><nobr>$$</nobr></code>
are offsets from the same section base, and so their difference is a pure
number. This will solve the problem and generate sensible code.
<h3><a name="section-10.2">10.2 Bugs</a></h3>
<p>We have never yet released a version of NASM with any <em>known</em>
bugs. That doesn't usually stop there being plenty we didn't know about,
though. Any that you find should be reported firstly via the
<code><nobr>bugtracker</nobr></code> at
<a href="https://sourceforge.net/projects/nasm/"><code><nobr>https://sourceforge.net/projects/nasm/</nobr></code></a>
(click on "Bugs"), or if that fails then through one of the contacts in
<a href="nasmdoc1.html#section-1.2">section 1.2</a>.
<p>Please read <a href="nasmdoc2.html#section-2.2">section 2.2</a> first,
and don't report the bug if it's listed in there as a deliberate feature.
(If you think the feature is badly thought out, feel free to send us
reasons why you think it should be changed, but don't just send us mail
saying `This is a bug' if the documentation says we did it on purpose.)
Then read <a href="#section-10.1">section 10.1</a>, and don't bother
reporting the bug if it's listed there.
<p>If you do report a bug, <em>please</em> give us all of the following
information:
<ul>
<li>What operating system you're running NASM under. DOS, Linux, NetBSD,
Win16, Win32, VMS (I'd be impressed), whatever.
<li>If you're running NASM under DOS or Win32, tell us whether you've
compiled your own executable from the DOS source archive, or whether you
were using the standard distribution binaries out of the archive. If you
were using a locally built executable, try to reproduce the problem using
one of the standard binaries, as this will make it easier for us to
reproduce your problem prior to fixing it.
<li>Which version of NASM you're using, and exactly how you invoked it.
Give us the precise command line, and the contents of the
<code><nobr>NASMENV</nobr></code> environment variable if any.
<li>Which versions of any supplementary programs you're using, and how you
invoked them. If the problem only becomes visible at link time, tell us
what linker you're using, what version of it you've got, and the exact
linker command line. If the problem involves linking against object files
generated by a compiler, tell us what compiler, what version, and what
command line or options you used. (If you're compiling in an IDE, please
try to reproduce the problem with the command-line version of the
compiler.)
<li>If at all possible, send us a NASM source file which exhibits the
problem. If this causes copyright problems (e.g. you can only reproduce the
bug in restricted-distribution code) then bear in mind the following two
points: firstly, we guarantee that any source code sent to us for the
purposes of debugging NASM will be used <em>only</em> for the purposes of
debugging NASM, and that we will delete all our copies of it as soon as we
have found and fixed the bug or bugs in question; and secondly, we would
prefer <em>not</em> to be mailed large chunks of code anyway. The smaller
the file, the better. A three-line sample file that does nothing useful
<em>except</em> demonstrate the problem is much easier to work with than a
fully fledged ten-thousand-line program. (Of course, some errors
<em>do</em> only crop up in large files, so this may not be possible.)
<li>A description of what the problem actually <em>is</em>. `It doesn't
work' is <em>not</em> a helpful description! Please describe exactly what
is happening that shouldn't be, or what isn't happening that should.
Examples might be: `NASM generates an error message saying Line 3 for an
error that's actually on Line 5'; `NASM generates an error message that I
believe it shouldn't be generating at all'; `NASM fails to generate an
error message that I believe it <em>should</em> be generating'; `the object
file produced from this source code crashes my linker'; `the ninth byte of
the output file is 66 and I think it should be 77 instead'.
<li>If you believe the output file from NASM to be faulty, send it to us.
That allows us to determine whether our own copy of NASM generates the same
file, or whether the problem is related to portability issues between our
development platforms and yours. We can handle binary files mailed to us as
MIME attachments, uuencoded, and even BinHex. Alternatively, we may be able
to provide an FTP site you can upload the suspect files to; but mailing
them is easier for us.
<li>Any other information or data files that might be helpful. If, for
example, the problem involves NASM failing to generate an object file while
TASM can generate an equivalent file without trouble, then send us
<em>both</em> object files, so we can see what TASM is doing differently
from us.
</ul>
<p align=center><a href="nasmdoca.html">Next Chapter</a> |
<a href="nasmdoc9.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
</body></html>

View File

@@ -0,0 +1,564 @@
<html><head><title>NASM Manual</title></head>
<body><h1 align=center>The Netwide Assembler: NASM</h1>
<p>This manual documents NASM, the Netwide Assembler: an assembler
targetting the Intel x86 series of processors, with portable source.
<p><p><a href="nasmdoc1.html">Chapter 1: Introduction</a><br>
<a href="nasmdoc1.html#section-1.1">Section 1.1: What Is NASM?</a><br>
<a href="nasmdoc1.html#section-1.1.1">Section 1.1.1: Why Yet Another Assembler?</a><br>
<a href="nasmdoc1.html#section-1.1.2">Section 1.1.2: Licence Conditions</a><br>
<a href="nasmdoc1.html#section-1.2">Section 1.2: Contact Information</a><br>
<a href="nasmdoc1.html#section-1.3">Section 1.3: Installation</a><br>
<a href="nasmdoc1.html#section-1.3.1">Section 1.3.1: Installing NASM under MS-DOS or Windows</a><br>
<a href="nasmdoc1.html#section-1.3.2">Section 1.3.2: Installing NASM under Unix</a><br>
<p><a href="nasmdoc2.html">Chapter 2: Running NASM</a><br>
<a href="nasmdoc2.html#section-2.1">Section 2.1: NASM Command-Line Syntax</a><br>
<a href="nasmdoc2.html#section-2.1.1">Section 2.1.1: The <code><nobr>-o</nobr></code> Option: Specifying the Output File Name</a><br>
<a href="nasmdoc2.html#section-2.1.2">Section 2.1.2: The <code><nobr>-f</nobr></code> Option: Specifying the Output File Format</a><br>
<a href="nasmdoc2.html#section-2.1.3">Section 2.1.3: The <code><nobr>-l</nobr></code> Option: Generating a Listing File</a><br>
<a href="nasmdoc2.html#section-2.1.4">Section 2.1.4: The <code><nobr>-M</nobr></code> Option: Generate Makefile Dependencies.</a><br>
<a href="nasmdoc2.html#section-2.1.5">Section 2.1.5: The <code><nobr>-F</nobr></code> Option: Selecting a Debug Information Format</a><br>
<a href="nasmdoc2.html#section-2.1.6">Section 2.1.6: The <code><nobr>-g</nobr></code> Option: Enabling Debug Information.</a><br>
<a href="nasmdoc2.html#section-2.1.7">Section 2.1.7: The <code><nobr>-X</nobr></code> Option: Selecting an Error Reporting Format</a><br>
<a href="nasmdoc2.html#section-2.1.8">Section 2.1.8: The <code><nobr>-E</nobr></code> Option: Send Errors to a File</a><br>
<a href="nasmdoc2.html#section-2.1.9">Section 2.1.9: The <code><nobr>-s</nobr></code> Option: Send Errors to <code><nobr>stdout</nobr></code></a><br>
<a href="nasmdoc2.html#section-2.1.10">Section 2.1.10: The <code><nobr>-i</nobr></code> Option: Include File Search Directories</a><br>
<a href="nasmdoc2.html#section-2.1.11">Section 2.1.11: The <code><nobr>-p</nobr></code> Option: Pre-Include a File</a><br>
<a href="nasmdoc2.html#section-2.1.12">Section 2.1.12: The <code><nobr>-d</nobr></code> Option: Pre-Define a Macro</a><br>
<a href="nasmdoc2.html#section-2.1.13">Section 2.1.13: The <code><nobr>-u</nobr></code> Option: Undefine a Macro</a><br>
<a href="nasmdoc2.html#section-2.1.14">Section 2.1.14: The <code><nobr>-e</nobr></code> Option: Preprocess Only</a><br>
<a href="nasmdoc2.html#section-2.1.15">Section 2.1.15: The <code><nobr>-a</nobr></code> Option: Don't Preprocess At All</a><br>
<a href="nasmdoc2.html#section-2.1.16">Section 2.1.16: The <code><nobr>-On</nobr></code> Option: Specifying Multipass Optimization.</a><br>
<a href="nasmdoc2.html#section-2.1.17">Section 2.1.17: The <code><nobr>-t</nobr></code> option: Enable TASM Compatibility Mode</a><br>
<a href="nasmdoc2.html#section-2.1.18">Section 2.1.18: The <code><nobr>-w</nobr></code> Option: Enable or Disable Assembly Warnings</a><br>
<a href="nasmdoc2.html#section-2.1.19">Section 2.1.19: The <code><nobr>-v</nobr></code> Option: Display Version Info</a><br>
<a href="nasmdoc2.html#section-2.1.20">Section 2.1.20: The <code><nobr>-y</nobr></code> Option: Display Available Debug Info Formats</a><br>
<a href="nasmdoc2.html#section-2.1.21">Section 2.1.21: The <code><nobr>--prefix</nobr></code> and <code><nobr>--postfix</nobr></code> Options.</a><br>
<a href="nasmdoc2.html#section-2.1.22">Section 2.1.22: The <code><nobr>NASMENV</nobr></code> Environment Variable</a><br>
<a href="nasmdoc2.html#section-2.2">Section 2.2: Quick Start for MASM Users</a><br>
<a href="nasmdoc2.html#section-2.2.1">Section 2.2.1: NASM Is Case-Sensitive</a><br>
<a href="nasmdoc2.html#section-2.2.2">Section 2.2.2: NASM Requires Square Brackets For Memory References</a><br>
<a href="nasmdoc2.html#section-2.2.3">Section 2.2.3: NASM Doesn't Store Variable Types</a><br>
<a href="nasmdoc2.html#section-2.2.4">Section 2.2.4: NASM Doesn't <code><nobr>ASSUME</nobr></code></a><br>
<a href="nasmdoc2.html#section-2.2.5">Section 2.2.5: NASM Doesn't Support Memory Models</a><br>
<a href="nasmdoc2.html#section-2.2.6">Section 2.2.6: Floating-Point Differences</a><br>
<a href="nasmdoc2.html#section-2.2.7">Section 2.2.7: Other Differences</a><br>
<p><a href="nasmdoc3.html">Chapter 3: The NASM Language</a><br>
<a href="nasmdoc3.html#section-3.1">Section 3.1: Layout of a NASM Source Line</a><br>
<a href="nasmdoc3.html#section-3.2">Section 3.2: Pseudo-Instructions</a><br>
<a href="nasmdoc3.html#section-3.2.1">Section 3.2.1: <code><nobr>DB</nobr></code> and friends: Declaring Initialised Data</a><br>
<a href="nasmdoc3.html#section-3.2.2">Section 3.2.2: <code><nobr>RESB</nobr></code> and friends: Declaring Uninitialised Data</a><br>
<a href="nasmdoc3.html#section-3.2.3">Section 3.2.3: <code><nobr>INCBIN</nobr></code>: Including External Binary Files</a><br>
<a href="nasmdoc3.html#section-3.2.4">Section 3.2.4: <code><nobr>EQU</nobr></code>: Defining Constants</a><br>
<a href="nasmdoc3.html#section-3.2.5">Section 3.2.5: <code><nobr>TIMES</nobr></code>: Repeating Instructions or Data</a><br>
<a href="nasmdoc3.html#section-3.3">Section 3.3: Effective Addresses</a><br>
<a href="nasmdoc3.html#section-3.4">Section 3.4: Constants</a><br>
<a href="nasmdoc3.html#section-3.4.1">Section 3.4.1: Numeric Constants</a><br>
<a href="nasmdoc3.html#section-3.4.2">Section 3.4.2: Character Constants</a><br>
<a href="nasmdoc3.html#section-3.4.3">Section 3.4.3: String Constants</a><br>
<a href="nasmdoc3.html#section-3.4.4">Section 3.4.4: Floating-Point Constants</a><br>
<a href="nasmdoc3.html#section-3.5">Section 3.5: Expressions</a><br>
<a href="nasmdoc3.html#section-3.5.1">Section 3.5.1: <code><nobr>|</nobr></code>: Bitwise OR Operator</a><br>
<a href="nasmdoc3.html#section-3.5.2">Section 3.5.2: <code><nobr>^</nobr></code>: Bitwise XOR Operator</a><br>
<a href="nasmdoc3.html#section-3.5.3">Section 3.5.3: <code><nobr>&amp;</nobr></code>: Bitwise AND Operator</a><br>
<a href="nasmdoc3.html#section-3.5.4">Section 3.5.4: <code><nobr>&lt;&lt;</nobr></code> and <code><nobr>&gt;&gt;</nobr></code>: Bit Shift Operators</a><br>
<a href="nasmdoc3.html#section-3.5.5">Section 3.5.5: <code><nobr>+</nobr></code> and <code><nobr>-</nobr></code>: Addition and Subtraction Operators</a><br>
<a href="nasmdoc3.html#section-3.5.6">Section 3.5.6: <code><nobr>*</nobr></code>, <code><nobr>/</nobr></code>, <code><nobr>//</nobr></code>, <code><nobr>%</nobr></code> and <code><nobr>%%</nobr></code>: Multiplication and Division</a><br>
<a href="nasmdoc3.html#section-3.5.7">Section 3.5.7: Unary Operators: <code><nobr>+</nobr></code>, <code><nobr>-</nobr></code>, <code><nobr>~</nobr></code> and <code><nobr>SEG</nobr></code></a><br>
<a href="nasmdoc3.html#section-3.6">Section 3.6: <code><nobr>SEG</nobr></code> and <code><nobr>WRT</nobr></code></a><br>
<a href="nasmdoc3.html#section-3.7">Section 3.7: <code><nobr>STRICT</nobr></code>: Inhibiting Optimization</a><br>
<a href="nasmdoc3.html#section-3.8">Section 3.8: Critical Expressions</a><br>
<a href="nasmdoc3.html#section-3.9">Section 3.9: Local Labels</a><br>
<p><a href="nasmdoc4.html">Chapter 4: The NASM Preprocessor</a><br>
<a href="nasmdoc4.html#section-4.1">Section 4.1: Single-Line Macros</a><br>
<a href="nasmdoc4.html#section-4.1.1">Section 4.1.1: The Normal Way: <code><nobr>%define</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.1.2">Section 4.1.2: Enhancing %define: <code><nobr>%xdefine</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.1.3">Section 4.1.3: Concatenating Single Line Macro Tokens: <code><nobr>%+</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.1.4">Section 4.1.4: Undefining macros: <code><nobr>%undef</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.1.5">Section 4.1.5: Preprocessor Variables: <code><nobr>%assign</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.2">Section 4.2: String Handling in Macros: <code><nobr>%strlen</nobr></code> and <code><nobr>%substr</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.2.1">Section 4.2.1: String Length: <code><nobr>%strlen</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.2.2">Section 4.2.2: Sub-strings: <code><nobr>%substr</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.3">Section 4.3: Multi-Line Macros: <code><nobr>%macro</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.3.1">Section 4.3.1: Overloading Multi-Line Macros</a><br>
<a href="nasmdoc4.html#section-4.3.2">Section 4.3.2: Macro-Local Labels</a><br>
<a href="nasmdoc4.html#section-4.3.3">Section 4.3.3: Greedy Macro Parameters</a><br>
<a href="nasmdoc4.html#section-4.3.4">Section 4.3.4: Default Macro Parameters</a><br>
<a href="nasmdoc4.html#section-4.3.5">Section 4.3.5: <code><nobr>%0</nobr></code>: Macro Parameter Counter</a><br>
<a href="nasmdoc4.html#section-4.3.6">Section 4.3.6: <code><nobr>%rotate</nobr></code>: Rotating Macro Parameters</a><br>
<a href="nasmdoc4.html#section-4.3.7">Section 4.3.7: Concatenating Macro Parameters</a><br>
<a href="nasmdoc4.html#section-4.3.8">Section 4.3.8: Condition Codes as Macro Parameters</a><br>
<a href="nasmdoc4.html#section-4.3.9">Section 4.3.9: Disabling Listing Expansion</a><br>
<a href="nasmdoc4.html#section-4.4">Section 4.4: Conditional Assembly</a><br>
<a href="nasmdoc4.html#section-4.4.1">Section 4.4.1: <code><nobr>%ifdef</nobr></code>: Testing Single-Line Macro Existence</a><br>
<a href="nasmdoc4.html#section-4.4.2">Section 4.4.2: <code><nobr>ifmacro</nobr></code>: Testing Multi-Line Macro Existence</a><br>
<a href="nasmdoc4.html#section-4.4.3">Section 4.4.3: <code><nobr>%ifctx</nobr></code>: Testing the Context Stack</a><br>
<a href="nasmdoc4.html#section-4.4.4">Section 4.4.4: <code><nobr>%if</nobr></code>: Testing Arbitrary Numeric Expressions</a><br>
<a href="nasmdoc4.html#section-4.4.5">Section 4.4.5: <code><nobr>%ifidn</nobr></code> and <code><nobr>%ifidni</nobr></code>: Testing Exact Text Identity</a><br>
<a href="nasmdoc4.html#section-4.4.6">Section 4.4.6: <code><nobr>%ifid</nobr></code>, <code><nobr>%ifnum</nobr></code>, <code><nobr>%ifstr</nobr></code>: Testing Token Types</a><br>
<a href="nasmdoc4.html#section-4.4.7">Section 4.4.7: <code><nobr>%error</nobr></code>: Reporting User-Defined Errors</a><br>
<a href="nasmdoc4.html#section-4.5">Section 4.5: Preprocessor Loops: <code><nobr>%rep</nobr></code></a><br>
<a href="nasmdoc4.html#section-4.6">Section 4.6: Including Other Files</a><br>
<a href="nasmdoc4.html#section-4.7">Section 4.7: The Context Stack</a><br>
<a href="nasmdoc4.html#section-4.7.1">Section 4.7.1: <code><nobr>%push</nobr></code> and <code><nobr>%pop</nobr></code>: Creating and Removing Contexts</a><br>
<a href="nasmdoc4.html#section-4.7.2">Section 4.7.2: Context-Local Labels</a><br>
<a href="nasmdoc4.html#section-4.7.3">Section 4.7.3: Context-Local Single-Line Macros</a><br>
<a href="nasmdoc4.html#section-4.7.4">Section 4.7.4: <code><nobr>%repl</nobr></code>: Renaming a Context</a><br>
<a href="nasmdoc4.html#section-4.7.5">Section 4.7.5: Example Use of the Context Stack: Block IFs</a><br>
<a href="nasmdoc4.html#section-4.8">Section 4.8: Standard Macros</a><br>
<a href="nasmdoc4.html#section-4.8.1">Section 4.8.1: <code><nobr>__NASM_MAJOR__</nobr></code>, <code><nobr>__NASM_MINOR__</nobr></code>, <code><nobr>__NASM_SUBMINOR__</nobr></code> and <code><nobr>___NASM_PATCHLEVEL__</nobr></code>: NASM Version</a><br>
<a href="nasmdoc4.html#section-4.8.2">Section 4.8.2: <code><nobr>__NASM_VERSION_ID__</nobr></code>: NASM Version ID</a><br>
<a href="nasmdoc4.html#section-4.8.3">Section 4.8.3: <code><nobr>__NASM_VER__</nobr></code>: NASM Version string</a><br>
<a href="nasmdoc4.html#section-4.8.4">Section 4.8.4: <code><nobr>__FILE__</nobr></code> and <code><nobr>__LINE__</nobr></code>: File Name and Line Number</a><br>
<a href="nasmdoc4.html#section-4.8.5">Section 4.8.5: <code><nobr>STRUC</nobr></code> and <code><nobr>ENDSTRUC</nobr></code>: Declaring Structure Data Types</a><br>
<a href="nasmdoc4.html#section-4.8.6">Section 4.8.6: <code><nobr>ISTRUC</nobr></code>, <code><nobr>AT</nobr></code> and <code><nobr>IEND</nobr></code>: Declaring Instances of Structures</a><br>
<a href="nasmdoc4.html#section-4.8.7">Section 4.8.7: <code><nobr>ALIGN</nobr></code> and <code><nobr>ALIGNB</nobr></code>: Data Alignment</a><br>
<a href="nasmdoc4.html#section-4.9">Section 4.9: TASM Compatible Preprocessor Directives</a><br>
<a href="nasmdoc4.html#section-4.9.1">Section 4.9.1: <code><nobr>%arg</nobr></code> Directive</a><br>
<a href="nasmdoc4.html#section-4.9.2">Section 4.9.2: <code><nobr>%stacksize</nobr></code> Directive</a><br>
<a href="nasmdoc4.html#section-4.9.3">Section 4.9.3: <code><nobr>%local</nobr></code> Directive</a><br>
<a href="nasmdoc4.html#section-4.10">Section 4.10: Other Preprocessor Directives</a><br>
<a href="nasmdoc4.html#section-4.10.1">Section 4.10.1: <code><nobr>%line</nobr></code> Directive</a><br>
<a href="nasmdoc4.html#section-4.10.2">Section 4.10.2: <code><nobr>%!</nobr></code><code><nobr>&lt;env&gt;</nobr></code>: Read an environment variable.</a><br>
<p><a href="nasmdoc5.html">Chapter 5: Assembler Directives</a><br>
<a href="nasmdoc5.html#section-5.1">Section 5.1: <code><nobr>BITS</nobr></code>: Specifying Target Processor Mode</a><br>
<a href="nasmdoc5.html#section-5.1.1">Section 5.1.1: <code><nobr>USE16</nobr></code> &amp; <code><nobr>USE32</nobr></code>: Aliases for BITS</a><br>
<a href="nasmdoc5.html#section-5.2">Section 5.2: <code><nobr>SECTION</nobr></code> or <code><nobr>SEGMENT</nobr></code>: Changing and Defining Sections</a><br>
<a href="nasmdoc5.html#section-5.2.1">Section 5.2.1: The <code><nobr>__SECT__</nobr></code> Macro</a><br>
<a href="nasmdoc5.html#section-5.3">Section 5.3: <code><nobr>ABSOLUTE</nobr></code>: Defining Absolute Labels</a><br>
<a href="nasmdoc5.html#section-5.4">Section 5.4: <code><nobr>EXTERN</nobr></code>: Importing Symbols from Other Modules</a><br>
<a href="nasmdoc5.html#section-5.5">Section 5.5: <code><nobr>GLOBAL</nobr></code>: Exporting Symbols to Other Modules</a><br>
<a href="nasmdoc5.html#section-5.6">Section 5.6: <code><nobr>COMMON</nobr></code>: Defining Common Data Areas</a><br>
<a href="nasmdoc5.html#section-5.7">Section 5.7: <code><nobr>CPU</nobr></code>: Defining CPU Dependencies</a><br>
<p><a href="nasmdoc6.html">Chapter 6: Output Formats</a><br>
<a href="nasmdoc6.html#section-6.1">Section 6.1: <code><nobr>bin</nobr></code>: Flat-Form Binary Output</a><br>
<a href="nasmdoc6.html#section-6.1.1">Section 6.1.1: <code><nobr>ORG</nobr></code>: Binary File Program Origin</a><br>
<a href="nasmdoc6.html#section-6.1.2">Section 6.1.2: <code><nobr>bin</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.1.3">Section 6.1.3: <code><nobr>Multisection</nobr></code> support for the BIN format.</a><br>
<a href="nasmdoc6.html#section-6.1.4">Section 6.1.4: Map files</a><br>
<a href="nasmdoc6.html#section-6.2">Section 6.2: <code><nobr>obj</nobr></code>: Microsoft OMF Object Files</a><br>
<a href="nasmdoc6.html#section-6.2.1">Section 6.2.1: <code><nobr>obj</nobr></code> Extensions to the <code><nobr>SEGMENT</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.2.2">Section 6.2.2: <code><nobr>GROUP</nobr></code>: Defining Groups of Segments</a><br>
<a href="nasmdoc6.html#section-6.2.3">Section 6.2.3: <code><nobr>UPPERCASE</nobr></code>: Disabling Case Sensitivity in Output</a><br>
<a href="nasmdoc6.html#section-6.2.4">Section 6.2.4: <code><nobr>IMPORT</nobr></code>: Importing DLL Symbols</a><br>
<a href="nasmdoc6.html#section-6.2.5">Section 6.2.5: <code><nobr>EXPORT</nobr></code>: Exporting DLL Symbols</a><br>
<a href="nasmdoc6.html#section-6.2.6">Section 6.2.6: <code><nobr>..start</nobr></code>: Defining the Program Entry Point</a><br>
<a href="nasmdoc6.html#section-6.2.7">Section 6.2.7: <code><nobr>obj</nobr></code> Extensions to the <code><nobr>EXTERN</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.2.8">Section 6.2.8: <code><nobr>obj</nobr></code> Extensions to the <code><nobr>COMMON</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.3">Section 6.3: <code><nobr>win32</nobr></code>: Microsoft Win32 Object Files</a><br>
<a href="nasmdoc6.html#section-6.3.1">Section 6.3.1: <code><nobr>win32</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.4">Section 6.4: <code><nobr>coff</nobr></code>: Common Object File Format</a><br>
<a href="nasmdoc6.html#section-6.5">Section 6.5: <code><nobr>elf</nobr></code>: Executable and Linkable Format Object Files</a><br>
<a href="nasmdoc6.html#section-6.5.1">Section 6.5.1: <code><nobr>elf</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.5.2">Section 6.5.2: Position-Independent Code: <code><nobr>elf</nobr></code> Special Symbols and <code><nobr>WRT</nobr></code></a><br>
<a href="nasmdoc6.html#section-6.5.3">Section 6.5.3: <code><nobr>elf</nobr></code> Extensions to the <code><nobr>GLOBAL</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.5.4">Section 6.5.4: <code><nobr>elf</nobr></code> Extensions to the <code><nobr>COMMON</nobr></code> Directive </a><br>
<a href="nasmdoc6.html#section-6.5.5">Section 6.5.5: 16-bit code and ELF </a><br>
<a href="nasmdoc6.html#section-6.6">Section 6.6: <code><nobr>aout</nobr></code>: Linux <code><nobr>a.out</nobr></code> Object Files</a><br>
<a href="nasmdoc6.html#section-6.7">Section 6.7: <code><nobr>aoutb</nobr></code>: NetBSD/FreeBSD/OpenBSD <code><nobr>a.out</nobr></code> Object Files</a><br>
<a href="nasmdoc6.html#section-6.8">Section 6.8: <code><nobr>as86</nobr></code>: Minix/Linux <code><nobr>as86</nobr></code> Object Files</a><br>
<a href="nasmdoc6.html#section-6.9">Section 6.9: <code><nobr>rdf</nobr></code>: Relocatable Dynamic Object File Format</a><br>
<a href="nasmdoc6.html#section-6.9.1">Section 6.9.1: Requiring a Library: The <code><nobr>LIBRARY</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.9.2">Section 6.9.2: Specifying a Module Name: The <code><nobr>MODULE</nobr></code> Directive</a><br>
<a href="nasmdoc6.html#section-6.9.3">Section 6.9.3: <code><nobr>rdf</nobr></code> Extensions to the <code><nobr>GLOBAL</nobr></code> directive</a><br>
<a href="nasmdoc6.html#section-6.10">Section 6.10: <code><nobr>dbg</nobr></code>: Debugging Format</a><br>
<p><a href="nasmdoc7.html">Chapter 7: Writing 16-bit Code (DOS, Windows 3/3.1)</a><br>
<a href="nasmdoc7.html#section-7.1">Section 7.1: Producing <code><nobr>.EXE</nobr></code> Files</a><br>
<a href="nasmdoc7.html#section-7.1.1">Section 7.1.1: Using the <code><nobr>obj</nobr></code> Format To Generate <code><nobr>.EXE</nobr></code> Files</a><br>
<a href="nasmdoc7.html#section-7.1.2">Section 7.1.2: Using the <code><nobr>bin</nobr></code> Format To Generate <code><nobr>.EXE</nobr></code> Files</a><br>
<a href="nasmdoc7.html#section-7.2">Section 7.2: Producing <code><nobr>.COM</nobr></code> Files</a><br>
<a href="nasmdoc7.html#section-7.2.1">Section 7.2.1: Using the <code><nobr>bin</nobr></code> Format To Generate <code><nobr>.COM</nobr></code> Files</a><br>
<a href="nasmdoc7.html#section-7.2.2">Section 7.2.2: Using the <code><nobr>obj</nobr></code> Format To Generate <code><nobr>.COM</nobr></code> Files</a><br>
<a href="nasmdoc7.html#section-7.3">Section 7.3: Producing <code><nobr>.SYS</nobr></code> Files</a><br>
<a href="nasmdoc7.html#section-7.4">Section 7.4: Interfacing to 16-bit C Programs</a><br>
<a href="nasmdoc7.html#section-7.4.1">Section 7.4.1: External Symbol Names</a><br>
<a href="nasmdoc7.html#section-7.4.2">Section 7.4.2: Memory Models</a><br>
<a href="nasmdoc7.html#section-7.4.3">Section 7.4.3: Function Definitions and Function Calls</a><br>
<a href="nasmdoc7.html#section-7.4.4">Section 7.4.4: Accessing Data Items</a><br>
<a href="nasmdoc7.html#section-7.4.5">Section 7.4.5: <code><nobr>c16.mac</nobr></code>: Helper Macros for the 16-bit C Interface</a><br>
<a href="nasmdoc7.html#section-7.5">Section 7.5: Interfacing to Borland Pascal Programs</a><br>
<a href="nasmdoc7.html#section-7.5.1">Section 7.5.1: The Pascal Calling Convention</a><br>
<a href="nasmdoc7.html#section-7.5.2">Section 7.5.2: Borland Pascal Segment Name Restrictions</a><br>
<a href="nasmdoc7.html#section-7.5.3">Section 7.5.3: Using <code><nobr>c16.mac</nobr></code> With Pascal Programs</a><br>
<p><a href="nasmdoc8.html">Chapter 8: Writing 32-bit Code (Unix, Win32, DJGPP)</a><br>
<a href="nasmdoc8.html#section-8.1">Section 8.1: Interfacing to 32-bit C Programs</a><br>
<a href="nasmdoc8.html#section-8.1.1">Section 8.1.1: External Symbol Names</a><br>
<a href="nasmdoc8.html#section-8.1.2">Section 8.1.2: Function Definitions and Function Calls</a><br>
<a href="nasmdoc8.html#section-8.1.3">Section 8.1.3: Accessing Data Items</a><br>
<a href="nasmdoc8.html#section-8.1.4">Section 8.1.4: <code><nobr>c32.mac</nobr></code>: Helper Macros for the 32-bit C Interface</a><br>
<a href="nasmdoc8.html#section-8.2">Section 8.2: Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF Shared Libraries</a><br>
<a href="nasmdoc8.html#section-8.2.1">Section 8.2.1: Obtaining the Address of the GOT</a><br>
<a href="nasmdoc8.html#section-8.2.2">Section 8.2.2: Finding Your Local Data Items</a><br>
<a href="nasmdoc8.html#section-8.2.3">Section 8.2.3: Finding External and Common Data Items</a><br>
<a href="nasmdoc8.html#section-8.2.4">Section 8.2.4: Exporting Symbols to the Library User</a><br>
<a href="nasmdoc8.html#section-8.2.5">Section 8.2.5: Calling Procedures Outside the Library</a><br>
<a href="nasmdoc8.html#section-8.2.6">Section 8.2.6: Generating the Library File</a><br>
<p><a href="nasmdoc9.html">Chapter 9: Mixing 16 and 32 Bit Code</a><br>
<a href="nasmdoc9.html#section-9.1">Section 9.1: Mixed-Size Jumps</a><br>
<a href="nasmdoc9.html#section-9.2">Section 9.2: Addressing Between Different-Size Segments</a><br>
<a href="nasmdoc9.html#section-9.3">Section 9.3: Other Mixed-Size Instructions</a><br>
<p><a href="nasmdo10.html">Chapter 10: Troubleshooting</a><br>
<a href="nasmdo10.html#section-10.1">Section 10.1: Common Problems</a><br>
<a href="nasmdo10.html#section-10.1.1">Section 10.1.1: NASM Generates Inefficient Code</a><br>
<a href="nasmdo10.html#section-10.1.2">Section 10.1.2: My Jumps are Out of Range</a><br>
<a href="nasmdo10.html#section-10.1.3">Section 10.1.3: <code><nobr>ORG</nobr></code> Doesn't Work</a><br>
<a href="nasmdo10.html#section-10.1.4">Section 10.1.4: <code><nobr>TIMES</nobr></code> Doesn't Work</a><br>
<a href="nasmdo10.html#section-10.2">Section 10.2: Bugs</a><br>
<p><a href="nasmdoca.html">Appendix A: Ndisasm</a><br>
<a href="nasmdoca.html#section-A.1">Section A.1: Introduction</a><br>
<a href="nasmdoca.html#section-A.2">Section A.2: Getting Started: Installation</a><br>
<a href="nasmdoca.html#section-A.3">Section A.3: Running NDISASM</a><br>
<a href="nasmdoca.html#section-A.3.1">Section A.3.1: COM Files: Specifying an Origin</a><br>
<a href="nasmdoca.html#section-A.3.2">Section A.3.2: Code Following Data: Synchronisation</a><br>
<a href="nasmdoca.html#section-A.3.3">Section A.3.3: Mixed Code and Data: Automatic (Intelligent) Synchronisation </a><br>
<a href="nasmdoca.html#section-A.3.4">Section A.3.4: Other Options</a><br>
<a href="nasmdoca.html#section-A.4">Section A.4: Bugs and Improvements</a><br>
<p><a href="nasmdocb.html">Appendix B: x86 Instruction Reference</a><br>
<a href="nasmdocb.html#section-B.1">Section B.1: Key to Operand Specifications</a><br>
<a href="nasmdocb.html#section-B.2">Section B.2: Key to Opcode Descriptions</a><br>
<a href="nasmdocb.html#section-B.2.1">Section B.2.1: Register Values</a><br>
<a href="nasmdocb.html#section-B.2.2">Section B.2.2: Condition Codes</a><br>
<a href="nasmdocb.html#section-B.2.3">Section B.2.3: SSE Condition Predicates</a><br>
<a href="nasmdocb.html#section-B.2.4">Section B.2.4: Status Flags</a><br>
<a href="nasmdocb.html#section-B.2.5">Section B.2.5: Effective Address Encoding: ModR/M and SIB</a><br>
<a href="nasmdocb.html#section-B.3">Section B.3: Key to Instruction Flags</a><br>
<a href="nasmdocb.html#section-B.4">Section B.4: x86 Instruction Set</a><br>
<a href="nasmdocb.html#section-B.4.1">Section B.4.1: <code><nobr>AAA</nobr></code>, <code><nobr>AAS</nobr></code>, <code><nobr>AAM</nobr></code>, <code><nobr>AAD</nobr></code>: ASCII Adjustments</a><br>
<a href="nasmdocb.html#section-B.4.2">Section B.4.2: <code><nobr>ADC</nobr></code>: Add with Carry</a><br>
<a href="nasmdocb.html#section-B.4.3">Section B.4.3: <code><nobr>ADD</nobr></code>: Add Integers</a><br>
<a href="nasmdocb.html#section-B.4.4">Section B.4.4: <code><nobr>ADDPD</nobr></code>: ADD Packed Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.5">Section B.4.5: <code><nobr>ADDPS</nobr></code>: ADD Packed Single-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.6">Section B.4.6: <code><nobr>ADDSD</nobr></code>: ADD Scalar Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.7">Section B.4.7: <code><nobr>ADDSS</nobr></code>: ADD Scalar Single-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.8">Section B.4.8: <code><nobr>AND</nobr></code>: Bitwise AND</a><br>
<a href="nasmdocb.html#section-B.4.9">Section B.4.9: <code><nobr>ANDNPD</nobr></code>: Bitwise Logical AND NOT of Packed Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.10">Section B.4.10: <code><nobr>ANDNPS</nobr></code>: Bitwise Logical AND NOT of Packed Single-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.11">Section B.4.11: <code><nobr>ANDPD</nobr></code>: Bitwise Logical AND For Single FP</a><br>
<a href="nasmdocb.html#section-B.4.12">Section B.4.12: <code><nobr>ANDPS</nobr></code>: Bitwise Logical AND For Single FP</a><br>
<a href="nasmdocb.html#section-B.4.13">Section B.4.13: <code><nobr>ARPL</nobr></code>: Adjust RPL Field of Selector</a><br>
<a href="nasmdocb.html#section-B.4.14">Section B.4.14: <code><nobr>BOUND</nobr></code>: Check Array Index against Bounds</a><br>
<a href="nasmdocb.html#section-B.4.15">Section B.4.15: <code><nobr>BSF</nobr></code>, <code><nobr>BSR</nobr></code>: Bit Scan</a><br>
<a href="nasmdocb.html#section-B.4.16">Section B.4.16: <code><nobr>BSWAP</nobr></code>: Byte Swap</a><br>
<a href="nasmdocb.html#section-B.4.17">Section B.4.17: <code><nobr>BT</nobr></code>, <code><nobr>BTC</nobr></code>, <code><nobr>BTR</nobr></code>, <code><nobr>BTS</nobr></code>: Bit Test</a><br>
<a href="nasmdocb.html#section-B.4.18">Section B.4.18: <code><nobr>CALL</nobr></code>: Call Subroutine</a><br>
<a href="nasmdocb.html#section-B.4.19">Section B.4.19: <code><nobr>CBW</nobr></code>, <code><nobr>CWD</nobr></code>, <code><nobr>CDQ</nobr></code>, <code><nobr>CWDE</nobr></code>: Sign Extensions</a><br>
<a href="nasmdocb.html#section-B.4.20">Section B.4.20: <code><nobr>CLC</nobr></code>, <code><nobr>CLD</nobr></code>, <code><nobr>CLI</nobr></code>, <code><nobr>CLTS</nobr></code>: Clear Flags</a><br>
<a href="nasmdocb.html#section-B.4.21">Section B.4.21: <code><nobr>CLFLUSH</nobr></code>: Flush Cache Line</a><br>
<a href="nasmdocb.html#section-B.4.22">Section B.4.22: <code><nobr>CMC</nobr></code>: Complement Carry Flag</a><br>
<a href="nasmdocb.html#section-B.4.23">Section B.4.23: <code><nobr>CMOVcc</nobr></code>: Conditional Move</a><br>
<a href="nasmdocb.html#section-B.4.24">Section B.4.24: <code><nobr>CMP</nobr></code>: Compare Integers</a><br>
<a href="nasmdocb.html#section-B.4.25">Section B.4.25: <code><nobr>CMPccPD</nobr></code>: Packed Double-Precision FP Compare </a><br>
<a href="nasmdocb.html#section-B.4.26">Section B.4.26: <code><nobr>CMPccPS</nobr></code>: Packed Single-Precision FP Compare </a><br>
<a href="nasmdocb.html#section-B.4.27">Section B.4.27: <code><nobr>CMPSB</nobr></code>, <code><nobr>CMPSW</nobr></code>, <code><nobr>CMPSD</nobr></code>: Compare Strings</a><br>
<a href="nasmdocb.html#section-B.4.28">Section B.4.28: <code><nobr>CMPccSD</nobr></code>: Scalar Double-Precision FP Compare </a><br>
<a href="nasmdocb.html#section-B.4.29">Section B.4.29: <code><nobr>CMPccSS</nobr></code>: Scalar Single-Precision FP Compare </a><br>
<a href="nasmdocb.html#section-B.4.30">Section B.4.30: <code><nobr>CMPXCHG</nobr></code>, <code><nobr>CMPXCHG486</nobr></code>: Compare and Exchange</a><br>
<a href="nasmdocb.html#section-B.4.31">Section B.4.31: <code><nobr>CMPXCHG8B</nobr></code>: Compare and Exchange Eight Bytes</a><br>
<a href="nasmdocb.html#section-B.4.32">Section B.4.32: <code><nobr>COMISD</nobr></code>: Scalar Ordered Double-Precision FP Compare and Set EFLAGS</a><br>
<a href="nasmdocb.html#section-B.4.33">Section B.4.33: <code><nobr>COMISS</nobr></code>: Scalar Ordered Single-Precision FP Compare and Set EFLAGS</a><br>
<a href="nasmdocb.html#section-B.4.34">Section B.4.34: <code><nobr>CPUID</nobr></code>: Get CPU Identification Code</a><br>
<a href="nasmdocb.html#section-B.4.35">Section B.4.35: <code><nobr>CVTDQ2PD</nobr></code>: Packed Signed INT32 to Packed Double-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.36">Section B.4.36: <code><nobr>CVTDQ2PS</nobr></code>: Packed Signed INT32 to Packed Single-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.37">Section B.4.37: <code><nobr>CVTPD2DQ</nobr></code>: Packed Double-Precision FP to Packed Signed INT32 Conversion</a><br>
<a href="nasmdocb.html#section-B.4.38">Section B.4.38: <code><nobr>CVTPD2PI</nobr></code>: Packed Double-Precision FP to Packed Signed INT32 Conversion</a><br>
<a href="nasmdocb.html#section-B.4.39">Section B.4.39: <code><nobr>CVTPD2PS</nobr></code>: Packed Double-Precision FP to Packed Single-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.40">Section B.4.40: <code><nobr>CVTPI2PD</nobr></code>: Packed Signed INT32 to Packed Double-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.41">Section B.4.41: <code><nobr>CVTPI2PS</nobr></code>: Packed Signed INT32 to Packed Single-FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.42">Section B.4.42: <code><nobr>CVTPS2DQ</nobr></code>: Packed Single-Precision FP to Packed Signed INT32 Conversion</a><br>
<a href="nasmdocb.html#section-B.4.43">Section B.4.43: <code><nobr>CVTPS2PD</nobr></code>: Packed Single-Precision FP to Packed Double-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.44">Section B.4.44: <code><nobr>CVTPS2PI</nobr></code>: Packed Single-Precision FP to Packed Signed INT32 Conversion</a><br>
<a href="nasmdocb.html#section-B.4.45">Section B.4.45: <code><nobr>CVTSD2SI</nobr></code>: Scalar Double-Precision FP to Signed INT32 Conversion</a><br>
<a href="nasmdocb.html#section-B.4.46">Section B.4.46: <code><nobr>CVTSD2SS</nobr></code>: Scalar Double-Precision FP to Scalar Single-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.47">Section B.4.47: <code><nobr>CVTSI2SD</nobr></code>: Signed INT32 to Scalar Double-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.48">Section B.4.48: <code><nobr>CVTSI2SS</nobr></code>: Signed INT32 to Scalar Single-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.49">Section B.4.49: <code><nobr>CVTSS2SD</nobr></code>: Scalar Single-Precision FP to Scalar Double-Precision FP Conversion</a><br>
<a href="nasmdocb.html#section-B.4.50">Section B.4.50: <code><nobr>CVTSS2SI</nobr></code>: Scalar Single-Precision FP to Signed INT32 Conversion</a><br>
<a href="nasmdocb.html#section-B.4.51">Section B.4.51: <code><nobr>CVTTPD2DQ</nobr></code>: Packed Double-Precision FP to Packed Signed INT32 Conversion with Truncation</a><br>
<a href="nasmdocb.html#section-B.4.52">Section B.4.52: <code><nobr>CVTTPD2PI</nobr></code>: Packed Double-Precision FP to Packed Signed INT32 Conversion with Truncation</a><br>
<a href="nasmdocb.html#section-B.4.53">Section B.4.53: <code><nobr>CVTTPS2DQ</nobr></code>: Packed Single-Precision FP to Packed Signed INT32 Conversion with Truncation</a><br>
<a href="nasmdocb.html#section-B.4.54">Section B.4.54: <code><nobr>CVTTPS2PI</nobr></code>: Packed Single-Precision FP to Packed Signed INT32 Conversion with Truncation</a><br>
<a href="nasmdocb.html#section-B.4.55">Section B.4.55: <code><nobr>CVTTSD2SI</nobr></code>: Scalar Double-Precision FP to Signed INT32 Conversion with Truncation</a><br>
<a href="nasmdocb.html#section-B.4.56">Section B.4.56: <code><nobr>CVTTSS2SI</nobr></code>: Scalar Single-Precision FP to Signed INT32 Conversion with Truncation</a><br>
<a href="nasmdocb.html#section-B.4.57">Section B.4.57: <code><nobr>DAA</nobr></code>, <code><nobr>DAS</nobr></code>: Decimal Adjustments</a><br>
<a href="nasmdocb.html#section-B.4.58">Section B.4.58: <code><nobr>DEC</nobr></code>: Decrement Integer</a><br>
<a href="nasmdocb.html#section-B.4.59">Section B.4.59: <code><nobr>DIV</nobr></code>: Unsigned Integer Divide</a><br>
<a href="nasmdocb.html#section-B.4.60">Section B.4.60: <code><nobr>DIVPD</nobr></code>: Packed Double-Precision FP Divide</a><br>
<a href="nasmdocb.html#section-B.4.61">Section B.4.61: <code><nobr>DIVPS</nobr></code>: Packed Single-Precision FP Divide</a><br>
<a href="nasmdocb.html#section-B.4.62">Section B.4.62: <code><nobr>DIVSD</nobr></code>: Scalar Double-Precision FP Divide</a><br>
<a href="nasmdocb.html#section-B.4.63">Section B.4.63: <code><nobr>DIVSS</nobr></code>: Scalar Single-Precision FP Divide</a><br>
<a href="nasmdocb.html#section-B.4.64">Section B.4.64: <code><nobr>EMMS</nobr></code>: Empty MMX State</a><br>
<a href="nasmdocb.html#section-B.4.65">Section B.4.65: <code><nobr>ENTER</nobr></code>: Create Stack Frame</a><br>
<a href="nasmdocb.html#section-B.4.66">Section B.4.66: <code><nobr>F2XM1</nobr></code>: Calculate 2**X-1</a><br>
<a href="nasmdocb.html#section-B.4.67">Section B.4.67: <code><nobr>FABS</nobr></code>: Floating-Point Absolute Value</a><br>
<a href="nasmdocb.html#section-B.4.68">Section B.4.68: <code><nobr>FADD</nobr></code>, <code><nobr>FADDP</nobr></code>: Floating-Point Addition</a><br>
<a href="nasmdocb.html#section-B.4.69">Section B.4.69: <code><nobr>FBLD</nobr></code>, <code><nobr>FBSTP</nobr></code>: BCD Floating-Point Load and Store</a><br>
<a href="nasmdocb.html#section-B.4.70">Section B.4.70: <code><nobr>FCHS</nobr></code>: Floating-Point Change Sign</a><br>
<a href="nasmdocb.html#section-B.4.71">Section B.4.71: <code><nobr>FCLEX</nobr></code>, <code><nobr>FNCLEX</nobr></code>: Clear Floating-Point Exceptions</a><br>
<a href="nasmdocb.html#section-B.4.72">Section B.4.72: <code><nobr>FCMOVcc</nobr></code>: Floating-Point Conditional Move</a><br>
<a href="nasmdocb.html#section-B.4.73">Section B.4.73: <code><nobr>FCOM</nobr></code>, <code><nobr>FCOMP</nobr></code>, <code><nobr>FCOMPP</nobr></code>, <code><nobr>FCOMI</nobr></code>, <code><nobr>FCOMIP</nobr></code>: Floating-Point Compare</a><br>
<a href="nasmdocb.html#section-B.4.74">Section B.4.74: <code><nobr>FCOS</nobr></code>: Cosine</a><br>
<a href="nasmdocb.html#section-B.4.75">Section B.4.75: <code><nobr>FDECSTP</nobr></code>: Decrement Floating-Point Stack Pointer</a><br>
<a href="nasmdocb.html#section-B.4.76">Section B.4.76: <code><nobr>FxDISI</nobr></code>, <code><nobr>FxENI</nobr></code>: Disable and Enable Floating-Point Interrupts</a><br>
<a href="nasmdocb.html#section-B.4.77">Section B.4.77: <code><nobr>FDIV</nobr></code>, <code><nobr>FDIVP</nobr></code>, <code><nobr>FDIVR</nobr></code>, <code><nobr>FDIVRP</nobr></code>: Floating-Point Division</a><br>
<a href="nasmdocb.html#section-B.4.78">Section B.4.78: <code><nobr>FEMMS</nobr></code>: Faster Enter/Exit of the MMX or floating-point state</a><br>
<a href="nasmdocb.html#section-B.4.79">Section B.4.79: <code><nobr>FFREE</nobr></code>: Flag Floating-Point Register as Unused</a><br>
<a href="nasmdocb.html#section-B.4.80">Section B.4.80: <code><nobr>FIADD</nobr></code>: Floating-Point/Integer Addition</a><br>
<a href="nasmdocb.html#section-B.4.81">Section B.4.81: <code><nobr>FICOM</nobr></code>, <code><nobr>FICOMP</nobr></code>: Floating-Point/Integer Compare</a><br>
<a href="nasmdocb.html#section-B.4.82">Section B.4.82: <code><nobr>FIDIV</nobr></code>, <code><nobr>FIDIVR</nobr></code>: Floating-Point/Integer Division</a><br>
<a href="nasmdocb.html#section-B.4.83">Section B.4.83: <code><nobr>FILD</nobr></code>, <code><nobr>FIST</nobr></code>, <code><nobr>FISTP</nobr></code>: Floating-Point/Integer Conversion</a><br>
<a href="nasmdocb.html#section-B.4.84">Section B.4.84: <code><nobr>FIMUL</nobr></code>: Floating-Point/Integer Multiplication</a><br>
<a href="nasmdocb.html#section-B.4.85">Section B.4.85: <code><nobr>FINCSTP</nobr></code>: Increment Floating-Point Stack Pointer</a><br>
<a href="nasmdocb.html#section-B.4.86">Section B.4.86: <code><nobr>FINIT</nobr></code>, <code><nobr>FNINIT</nobr></code>: Initialise Floating-Point Unit</a><br>
<a href="nasmdocb.html#section-B.4.87">Section B.4.87: <code><nobr>FISUB</nobr></code>: Floating-Point/Integer Subtraction</a><br>
<a href="nasmdocb.html#section-B.4.88">Section B.4.88: <code><nobr>FLD</nobr></code>: Floating-Point Load</a><br>
<a href="nasmdocb.html#section-B.4.89">Section B.4.89: <code><nobr>FLDxx</nobr></code>: Floating-Point Load Constants</a><br>
<a href="nasmdocb.html#section-B.4.90">Section B.4.90: <code><nobr>FLDCW</nobr></code>: Load Floating-Point Control Word</a><br>
<a href="nasmdocb.html#section-B.4.91">Section B.4.91: <code><nobr>FLDENV</nobr></code>: Load Floating-Point Environment</a><br>
<a href="nasmdocb.html#section-B.4.92">Section B.4.92: <code><nobr>FMUL</nobr></code>, <code><nobr>FMULP</nobr></code>: Floating-Point Multiply</a><br>
<a href="nasmdocb.html#section-B.4.93">Section B.4.93: <code><nobr>FNOP</nobr></code>: Floating-Point No Operation</a><br>
<a href="nasmdocb.html#section-B.4.94">Section B.4.94: <code><nobr>FPATAN</nobr></code>, <code><nobr>FPTAN</nobr></code>: Arctangent and Tangent</a><br>
<a href="nasmdocb.html#section-B.4.95">Section B.4.95: <code><nobr>FPREM</nobr></code>, <code><nobr>FPREM1</nobr></code>: Floating-Point Partial Remainder</a><br>
<a href="nasmdocb.html#section-B.4.96">Section B.4.96: <code><nobr>FRNDINT</nobr></code>: Floating-Point Round to Integer</a><br>
<a href="nasmdocb.html#section-B.4.97">Section B.4.97: <code><nobr>FSAVE</nobr></code>, <code><nobr>FRSTOR</nobr></code>: Save/Restore Floating-Point State</a><br>
<a href="nasmdocb.html#section-B.4.98">Section B.4.98: <code><nobr>FSCALE</nobr></code>: Scale Floating-Point Value by Power of Two</a><br>
<a href="nasmdocb.html#section-B.4.99">Section B.4.99: <code><nobr>FSETPM</nobr></code>: Set Protected Mode</a><br>
<a href="nasmdocb.html#section-B.4.100">Section B.4.100: <code><nobr>FSIN</nobr></code>, <code><nobr>FSINCOS</nobr></code>: Sine and Cosine</a><br>
<a href="nasmdocb.html#section-B.4.101">Section B.4.101: <code><nobr>FSQRT</nobr></code>: Floating-Point Square Root</a><br>
<a href="nasmdocb.html#section-B.4.102">Section B.4.102: <code><nobr>FST</nobr></code>, <code><nobr>FSTP</nobr></code>: Floating-Point Store</a><br>
<a href="nasmdocb.html#section-B.4.103">Section B.4.103: <code><nobr>FSTCW</nobr></code>: Store Floating-Point Control Word</a><br>
<a href="nasmdocb.html#section-B.4.104">Section B.4.104: <code><nobr>FSTENV</nobr></code>: Store Floating-Point Environment</a><br>
<a href="nasmdocb.html#section-B.4.105">Section B.4.105: <code><nobr>FSTSW</nobr></code>: Store Floating-Point Status Word</a><br>
<a href="nasmdocb.html#section-B.4.106">Section B.4.106: <code><nobr>FSUB</nobr></code>, <code><nobr>FSUBP</nobr></code>, <code><nobr>FSUBR</nobr></code>, <code><nobr>FSUBRP</nobr></code>: Floating-Point Subtract</a><br>
<a href="nasmdocb.html#section-B.4.107">Section B.4.107: <code><nobr>FTST</nobr></code>: Test <code><nobr>ST0</nobr></code> Against Zero</a><br>
<a href="nasmdocb.html#section-B.4.108">Section B.4.108: <code><nobr>FUCOMxx</nobr></code>: Floating-Point Unordered Compare</a><br>
<a href="nasmdocb.html#section-B.4.109">Section B.4.109: <code><nobr>FXAM</nobr></code>: Examine Class of Value in <code><nobr>ST0</nobr></code></a><br>
<a href="nasmdocb.html#section-B.4.110">Section B.4.110: <code><nobr>FXCH</nobr></code>: Floating-Point Exchange</a><br>
<a href="nasmdocb.html#section-B.4.111">Section B.4.111: <code><nobr>FXRSTOR</nobr></code>: Restore <code><nobr>FP</nobr></code>, <code><nobr>MMX</nobr></code> and <code><nobr>SSE</nobr></code> State</a><br>
<a href="nasmdocb.html#section-B.4.112">Section B.4.112: <code><nobr>FXSAVE</nobr></code>: Store <code><nobr>FP</nobr></code>, <code><nobr>MMX</nobr></code> and <code><nobr>SSE</nobr></code> State</a><br>
<a href="nasmdocb.html#section-B.4.113">Section B.4.113: <code><nobr>FXTRACT</nobr></code>: Extract Exponent and Significand</a><br>
<a href="nasmdocb.html#section-B.4.114">Section B.4.114: <code><nobr>FYL2X</nobr></code>, <code><nobr>FYL2XP1</nobr></code>: Compute Y times Log2(X) or Log2(X+1)</a><br>
<a href="nasmdocb.html#section-B.4.115">Section B.4.115: <code><nobr>HLT</nobr></code>: Halt Processor</a><br>
<a href="nasmdocb.html#section-B.4.116">Section B.4.116: <code><nobr>IBTS</nobr></code>: Insert Bit String</a><br>
<a href="nasmdocb.html#section-B.4.117">Section B.4.117: <code><nobr>IDIV</nobr></code>: Signed Integer Divide</a><br>
<a href="nasmdocb.html#section-B.4.118">Section B.4.118: <code><nobr>IMUL</nobr></code>: Signed Integer Multiply</a><br>
<a href="nasmdocb.html#section-B.4.119">Section B.4.119: <code><nobr>IN</nobr></code>: Input from I/O Port</a><br>
<a href="nasmdocb.html#section-B.4.120">Section B.4.120: <code><nobr>INC</nobr></code>: Increment Integer</a><br>
<a href="nasmdocb.html#section-B.4.121">Section B.4.121: <code><nobr>INSB</nobr></code>, <code><nobr>INSW</nobr></code>, <code><nobr>INSD</nobr></code>: Input String from I/O Port</a><br>
<a href="nasmdocb.html#section-B.4.122">Section B.4.122: <code><nobr>INT</nobr></code>: Software Interrupt</a><br>
<a href="nasmdocb.html#section-B.4.123">Section B.4.123: <code><nobr>INT3</nobr></code>, <code><nobr>INT1</nobr></code>, <code><nobr>ICEBP</nobr></code>, <code><nobr>INT01</nobr></code>: Breakpoints</a><br>
<a href="nasmdocb.html#section-B.4.124">Section B.4.124: <code><nobr>INTO</nobr></code>: Interrupt if Overflow</a><br>
<a href="nasmdocb.html#section-B.4.125">Section B.4.125: <code><nobr>INVD</nobr></code>: Invalidate Internal Caches</a><br>
<a href="nasmdocb.html#section-B.4.126">Section B.4.126: <code><nobr>INVLPG</nobr></code>: Invalidate TLB Entry</a><br>
<a href="nasmdocb.html#section-B.4.127">Section B.4.127: <code><nobr>IRET</nobr></code>, <code><nobr>IRETW</nobr></code>, <code><nobr>IRETD</nobr></code>: Return from Interrupt</a><br>
<a href="nasmdocb.html#section-B.4.128">Section B.4.128: <code><nobr>Jcc</nobr></code>: Conditional Branch</a><br>
<a href="nasmdocb.html#section-B.4.129">Section B.4.129: <code><nobr>JCXZ</nobr></code>, <code><nobr>JECXZ</nobr></code>: Jump if CX/ECX Zero</a><br>
<a href="nasmdocb.html#section-B.4.130">Section B.4.130: <code><nobr>JMP</nobr></code>: Jump</a><br>
<a href="nasmdocb.html#section-B.4.131">Section B.4.131: <code><nobr>LAHF</nobr></code>: Load AH from Flags</a><br>
<a href="nasmdocb.html#section-B.4.132">Section B.4.132: <code><nobr>LAR</nobr></code>: Load Access Rights</a><br>
<a href="nasmdocb.html#section-B.4.133">Section B.4.133: <code><nobr>LDMXCSR</nobr></code>: Load Streaming SIMD Extension Control/Status</a><br>
<a href="nasmdocb.html#section-B.4.134">Section B.4.134: <code><nobr>LDS</nobr></code>, <code><nobr>LES</nobr></code>, <code><nobr>LFS</nobr></code>, <code><nobr>LGS</nobr></code>, <code><nobr>LSS</nobr></code>: Load Far Pointer</a><br>
<a href="nasmdocb.html#section-B.4.135">Section B.4.135: <code><nobr>LEA</nobr></code>: Load Effective Address</a><br>
<a href="nasmdocb.html#section-B.4.136">Section B.4.136: <code><nobr>LEAVE</nobr></code>: Destroy Stack Frame</a><br>
<a href="nasmdocb.html#section-B.4.137">Section B.4.137: <code><nobr>LFENCE</nobr></code>: Load Fence</a><br>
<a href="nasmdocb.html#section-B.4.138">Section B.4.138: <code><nobr>LGDT</nobr></code>, <code><nobr>LIDT</nobr></code>, <code><nobr>LLDT</nobr></code>: Load Descriptor Tables</a><br>
<a href="nasmdocb.html#section-B.4.139">Section B.4.139: <code><nobr>LMSW</nobr></code>: Load/Store Machine Status Word</a><br>
<a href="nasmdocb.html#section-B.4.140">Section B.4.140: <code><nobr>LOADALL</nobr></code>, <code><nobr>LOADALL286</nobr></code>: Load Processor State</a><br>
<a href="nasmdocb.html#section-B.4.141">Section B.4.141: <code><nobr>LODSB</nobr></code>, <code><nobr>LODSW</nobr></code>, <code><nobr>LODSD</nobr></code>: Load from String</a><br>
<a href="nasmdocb.html#section-B.4.142">Section B.4.142: <code><nobr>LOOP</nobr></code>, <code><nobr>LOOPE</nobr></code>, <code><nobr>LOOPZ</nobr></code>, <code><nobr>LOOPNE</nobr></code>, <code><nobr>LOOPNZ</nobr></code>: Loop with Counter</a><br>
<a href="nasmdocb.html#section-B.4.143">Section B.4.143: <code><nobr>LSL</nobr></code>: Load Segment Limit</a><br>
<a href="nasmdocb.html#section-B.4.144">Section B.4.144: <code><nobr>LTR</nobr></code>: Load Task Register</a><br>
<a href="nasmdocb.html#section-B.4.145">Section B.4.145: <code><nobr>MASKMOVDQU</nobr></code>: Byte Mask Write</a><br>
<a href="nasmdocb.html#section-B.4.146">Section B.4.146: <code><nobr>MASKMOVQ</nobr></code>: Byte Mask Write</a><br>
<a href="nasmdocb.html#section-B.4.147">Section B.4.147: <code><nobr>MAXPD</nobr></code>: Return Packed Double-Precision FP Maximum</a><br>
<a href="nasmdocb.html#section-B.4.148">Section B.4.148: <code><nobr>MAXPS</nobr></code>: Return Packed Single-Precision FP Maximum</a><br>
<a href="nasmdocb.html#section-B.4.149">Section B.4.149: <code><nobr>MAXSD</nobr></code>: Return Scalar Double-Precision FP Maximum</a><br>
<a href="nasmdocb.html#section-B.4.150">Section B.4.150: <code><nobr>MAXSS</nobr></code>: Return Scalar Single-Precision FP Maximum</a><br>
<a href="nasmdocb.html#section-B.4.151">Section B.4.151: <code><nobr>MFENCE</nobr></code>: Memory Fence</a><br>
<a href="nasmdocb.html#section-B.4.152">Section B.4.152: <code><nobr>MINPD</nobr></code>: Return Packed Double-Precision FP Minimum</a><br>
<a href="nasmdocb.html#section-B.4.153">Section B.4.153: <code><nobr>MINPS</nobr></code>: Return Packed Single-Precision FP Minimum</a><br>
<a href="nasmdocb.html#section-B.4.154">Section B.4.154: <code><nobr>MINSD</nobr></code>: Return Scalar Double-Precision FP Minimum</a><br>
<a href="nasmdocb.html#section-B.4.155">Section B.4.155: <code><nobr>MINSS</nobr></code>: Return Scalar Single-Precision FP Minimum</a><br>
<a href="nasmdocb.html#section-B.4.156">Section B.4.156: <code><nobr>MOV</nobr></code>: Move Data</a><br>
<a href="nasmdocb.html#section-B.4.157">Section B.4.157: <code><nobr>MOVAPD</nobr></code>: Move Aligned Packed Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.158">Section B.4.158: <code><nobr>MOVAPS</nobr></code>: Move Aligned Packed Single-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.159">Section B.4.159: <code><nobr>MOVD</nobr></code>: Move Doubleword to/from MMX Register</a><br>
<a href="nasmdocb.html#section-B.4.160">Section B.4.160: <code><nobr>MOVDQ2Q</nobr></code>: Move Quadword from XMM to MMX register.</a><br>
<a href="nasmdocb.html#section-B.4.161">Section B.4.161: <code><nobr>MOVDQA</nobr></code>: Move Aligned Double Quadword</a><br>
<a href="nasmdocb.html#section-B.4.162">Section B.4.162: <code><nobr>MOVDQU</nobr></code>: Move Unaligned Double Quadword</a><br>
<a href="nasmdocb.html#section-B.4.163">Section B.4.163: <code><nobr>MOVHLPS</nobr></code>: Move Packed Single-Precision FP High to Low</a><br>
<a href="nasmdocb.html#section-B.4.164">Section B.4.164: <code><nobr>MOVHPD</nobr></code>: Move High Packed Double-Precision FP</a><br>
<a href="nasmdocb.html#section-B.4.165">Section B.4.165: <code><nobr>MOVHPS</nobr></code>: Move High Packed Single-Precision FP</a><br>
<a href="nasmdocb.html#section-B.4.166">Section B.4.166: <code><nobr>MOVLHPS</nobr></code>: Move Packed Single-Precision FP Low to High</a><br>
<a href="nasmdocb.html#section-B.4.167">Section B.4.167: <code><nobr>MOVLPD</nobr></code>: Move Low Packed Double-Precision FP</a><br>
<a href="nasmdocb.html#section-B.4.168">Section B.4.168: <code><nobr>MOVLPS</nobr></code>: Move Low Packed Single-Precision FP</a><br>
<a href="nasmdocb.html#section-B.4.169">Section B.4.169: <code><nobr>MOVMSKPD</nobr></code>: Extract Packed Double-Precision FP Sign Mask</a><br>
<a href="nasmdocb.html#section-B.4.170">Section B.4.170: <code><nobr>MOVMSKPS</nobr></code>: Extract Packed Single-Precision FP Sign Mask</a><br>
<a href="nasmdocb.html#section-B.4.171">Section B.4.171: <code><nobr>MOVNTDQ</nobr></code>: Move Double Quadword Non Temporal</a><br>
<a href="nasmdocb.html#section-B.4.172">Section B.4.172: <code><nobr>MOVNTI</nobr></code>: Move Doubleword Non Temporal</a><br>
<a href="nasmdocb.html#section-B.4.173">Section B.4.173: <code><nobr>MOVNTPD</nobr></code>: Move Aligned Four Packed Single-Precision FP Values Non Temporal</a><br>
<a href="nasmdocb.html#section-B.4.174">Section B.4.174: <code><nobr>MOVNTPS</nobr></code>: Move Aligned Four Packed Single-Precision FP Values Non Temporal</a><br>
<a href="nasmdocb.html#section-B.4.175">Section B.4.175: <code><nobr>MOVNTQ</nobr></code>: Move Quadword Non Temporal</a><br>
<a href="nasmdocb.html#section-B.4.176">Section B.4.176: <code><nobr>MOVQ</nobr></code>: Move Quadword to/from MMX Register</a><br>
<a href="nasmdocb.html#section-B.4.177">Section B.4.177: <code><nobr>MOVQ2DQ</nobr></code>: Move Quadword from MMX to XMM register.</a><br>
<a href="nasmdocb.html#section-B.4.178">Section B.4.178: <code><nobr>MOVSB</nobr></code>, <code><nobr>MOVSW</nobr></code>, <code><nobr>MOVSD</nobr></code>: Move String</a><br>
<a href="nasmdocb.html#section-B.4.179">Section B.4.179: <code><nobr>MOVSD</nobr></code>: Move Scalar Double-Precision FP Value</a><br>
<a href="nasmdocb.html#section-B.4.180">Section B.4.180: <code><nobr>MOVSS</nobr></code>: Move Scalar Single-Precision FP Value</a><br>
<a href="nasmdocb.html#section-B.4.181">Section B.4.181: <code><nobr>MOVSX</nobr></code>, <code><nobr>MOVZX</nobr></code>: Move Data with Sign or Zero Extend</a><br>
<a href="nasmdocb.html#section-B.4.182">Section B.4.182: <code><nobr>MOVUPD</nobr></code>: Move Unaligned Packed Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.183">Section B.4.183: <code><nobr>MOVUPS</nobr></code>: Move Unaligned Packed Single-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.184">Section B.4.184: <code><nobr>MUL</nobr></code>: Unsigned Integer Multiply</a><br>
<a href="nasmdocb.html#section-B.4.185">Section B.4.185: <code><nobr>MULPD</nobr></code>: Packed Single-FP Multiply</a><br>
<a href="nasmdocb.html#section-B.4.186">Section B.4.186: <code><nobr>MULPS</nobr></code>: Packed Single-FP Multiply</a><br>
<a href="nasmdocb.html#section-B.4.187">Section B.4.187: <code><nobr>MULSD</nobr></code>: Scalar Single-FP Multiply</a><br>
<a href="nasmdocb.html#section-B.4.188">Section B.4.188: <code><nobr>MULSS</nobr></code>: Scalar Single-FP Multiply</a><br>
<a href="nasmdocb.html#section-B.4.189">Section B.4.189: <code><nobr>NEG</nobr></code>, <code><nobr>NOT</nobr></code>: Two's and One's Complement</a><br>
<a href="nasmdocb.html#section-B.4.190">Section B.4.190: <code><nobr>NOP</nobr></code>: No Operation</a><br>
<a href="nasmdocb.html#section-B.4.191">Section B.4.191: <code><nobr>OR</nobr></code>: Bitwise OR</a><br>
<a href="nasmdocb.html#section-B.4.192">Section B.4.192: <code><nobr>ORPD</nobr></code>: Bit-wise Logical OR of Double-Precision FP Data</a><br>
<a href="nasmdocb.html#section-B.4.193">Section B.4.193: <code><nobr>ORPS</nobr></code>: Bit-wise Logical OR of Single-Precision FP Data</a><br>
<a href="nasmdocb.html#section-B.4.194">Section B.4.194: <code><nobr>OUT</nobr></code>: Output Data to I/O Port</a><br>
<a href="nasmdocb.html#section-B.4.195">Section B.4.195: <code><nobr>OUTSB</nobr></code>, <code><nobr>OUTSW</nobr></code>, <code><nobr>OUTSD</nobr></code>: Output String to I/O Port</a><br>
<a href="nasmdocb.html#section-B.4.196">Section B.4.196: <code><nobr>PACKSSDW</nobr></code>, <code><nobr>PACKSSWB</nobr></code>, <code><nobr>PACKUSWB</nobr></code>: Pack Data</a><br>
<a href="nasmdocb.html#section-B.4.197">Section B.4.197: <code><nobr>PADDB</nobr></code>, <code><nobr>PADDW</nobr></code>, <code><nobr>PADDD</nobr></code>: Add Packed Integers</a><br>
<a href="nasmdocb.html#section-B.4.198">Section B.4.198: <code><nobr>PADDQ</nobr></code>: Add Packed Quadword Integers</a><br>
<a href="nasmdocb.html#section-B.4.199">Section B.4.199: <code><nobr>PADDSB</nobr></code>, <code><nobr>PADDSW</nobr></code>: Add Packed Signed Integers With Saturation</a><br>
<a href="nasmdocb.html#section-B.4.200">Section B.4.200: <code><nobr>PADDSIW</nobr></code>: MMX Packed Addition to Implicit Destination</a><br>
<a href="nasmdocb.html#section-B.4.201">Section B.4.201: <code><nobr>PADDUSB</nobr></code>, <code><nobr>PADDUSW</nobr></code>: Add Packed Unsigned Integers With Saturation</a><br>
<a href="nasmdocb.html#section-B.4.202">Section B.4.202: <code><nobr>PAND</nobr></code>, <code><nobr>PANDN</nobr></code>: MMX Bitwise AND and AND-NOT</a><br>
<a href="nasmdocb.html#section-B.4.203">Section B.4.203: <code><nobr>PAUSE</nobr></code>: Spin Loop Hint</a><br>
<a href="nasmdocb.html#section-B.4.204">Section B.4.204: <code><nobr>PAVEB</nobr></code>: MMX Packed Average</a><br>
<a href="nasmdocb.html#section-B.4.205">Section B.4.205: <code><nobr>PAVGB</nobr></code> <code><nobr>PAVGW</nobr></code>: Average Packed Integers</a><br>
<a href="nasmdocb.html#section-B.4.206">Section B.4.206: <code><nobr>PAVGUSB</nobr></code>: Average of unsigned packed 8-bit values</a><br>
<a href="nasmdocb.html#section-B.4.207">Section B.4.207: <code><nobr>PCMPxx</nobr></code>: Compare Packed Integers.</a><br>
<a href="nasmdocb.html#section-B.4.208">Section B.4.208: <code><nobr>PDISTIB</nobr></code>: MMX Packed Distance and Accumulate with Implied Register</a><br>
<a href="nasmdocb.html#section-B.4.209">Section B.4.209: <code><nobr>PEXTRW</nobr></code>: Extract Word</a><br>
<a href="nasmdocb.html#section-B.4.210">Section B.4.210: <code><nobr>PF2ID</nobr></code>: Packed Single-Precision FP to Integer Convert</a><br>
<a href="nasmdocb.html#section-B.4.211">Section B.4.211: <code><nobr>PF2IW</nobr></code>: Packed Single-Precision FP to Integer Word Convert</a><br>
<a href="nasmdocb.html#section-B.4.212">Section B.4.212: <code><nobr>PFACC</nobr></code>: Packed Single-Precision FP Accumulate</a><br>
<a href="nasmdocb.html#section-B.4.213">Section B.4.213: <code><nobr>PFADD</nobr></code>: Packed Single-Precision FP Addition</a><br>
<a href="nasmdocb.html#section-B.4.214">Section B.4.214: <code><nobr>PFCMPxx</nobr></code>: Packed Single-Precision FP Compare </a><br>
<a href="nasmdocb.html#section-B.4.215">Section B.4.215: <code><nobr>PFMAX</nobr></code>: Packed Single-Precision FP Maximum</a><br>
<a href="nasmdocb.html#section-B.4.216">Section B.4.216: <code><nobr>PFMIN</nobr></code>: Packed Single-Precision FP Minimum</a><br>
<a href="nasmdocb.html#section-B.4.217">Section B.4.217: <code><nobr>PFMUL</nobr></code>: Packed Single-Precision FP Multiply</a><br>
<a href="nasmdocb.html#section-B.4.218">Section B.4.218: <code><nobr>PFNACC</nobr></code>: Packed Single-Precision FP Negative Accumulate</a><br>
<a href="nasmdocb.html#section-B.4.219">Section B.4.219: <code><nobr>PFPNACC</nobr></code>: Packed Single-Precision FP Mixed Accumulate</a><br>
<a href="nasmdocb.html#section-B.4.220">Section B.4.220: <code><nobr>PFRCP</nobr></code>: Packed Single-Precision FP Reciprocal Approximation</a><br>
<a href="nasmdocb.html#section-B.4.221">Section B.4.221: <code><nobr>PFRCPIT1</nobr></code>: Packed Single-Precision FP Reciprocal, First Iteration Step</a><br>
<a href="nasmdocb.html#section-B.4.222">Section B.4.222: <code><nobr>PFRCPIT2</nobr></code>: Packed Single-Precision FP Reciprocal/ Reciprocal Square Root, Second Iteration Step</a><br>
<a href="nasmdocb.html#section-B.4.223">Section B.4.223: <code><nobr>PFRSQIT1</nobr></code>: Packed Single-Precision FP Reciprocal Square Root, First Iteration Step</a><br>
<a href="nasmdocb.html#section-B.4.224">Section B.4.224: <code><nobr>PFRSQRT</nobr></code>: Packed Single-Precision FP Reciprocal Square Root Approximation</a><br>
<a href="nasmdocb.html#section-B.4.225">Section B.4.225: <code><nobr>PFSUB</nobr></code>: Packed Single-Precision FP Subtract</a><br>
<a href="nasmdocb.html#section-B.4.226">Section B.4.226: <code><nobr>PFSUBR</nobr></code>: Packed Single-Precision FP Reverse Subtract</a><br>
<a href="nasmdocb.html#section-B.4.227">Section B.4.227: <code><nobr>PI2FD</nobr></code>: Packed Doubleword Integer to Single-Precision FP Convert</a><br>
<a href="nasmdocb.html#section-B.4.228">Section B.4.228: <code><nobr>PF2IW</nobr></code>: Packed Word Integer to Single-Precision FP Convert</a><br>
<a href="nasmdocb.html#section-B.4.229">Section B.4.229: <code><nobr>PINSRW</nobr></code>: Insert Word</a><br>
<a href="nasmdocb.html#section-B.4.230">Section B.4.230: <code><nobr>PMACHRIW</nobr></code>: Packed Multiply and Accumulate with Rounding</a><br>
<a href="nasmdocb.html#section-B.4.231">Section B.4.231: <code><nobr>PMADDWD</nobr></code>: MMX Packed Multiply and Add</a><br>
<a href="nasmdocb.html#section-B.4.232">Section B.4.232: <code><nobr>PMAGW</nobr></code>: MMX Packed Magnitude</a><br>
<a href="nasmdocb.html#section-B.4.233">Section B.4.233: <code><nobr>PMAXSW</nobr></code>: Packed Signed Integer Word Maximum</a><br>
<a href="nasmdocb.html#section-B.4.234">Section B.4.234: <code><nobr>PMAXUB</nobr></code>: Packed Unsigned Integer Byte Maximum</a><br>
<a href="nasmdocb.html#section-B.4.235">Section B.4.235: <code><nobr>PMINSW</nobr></code>: Packed Signed Integer Word Minimum</a><br>
<a href="nasmdocb.html#section-B.4.236">Section B.4.236: <code><nobr>PMINUB</nobr></code>: Packed Unsigned Integer Byte Minimum</a><br>
<a href="nasmdocb.html#section-B.4.237">Section B.4.237: <code><nobr>PMOVMSKB</nobr></code>: Move Byte Mask To Integer</a><br>
<a href="nasmdocb.html#section-B.4.238">Section B.4.238: <code><nobr>PMULHRWC</nobr></code>, <code><nobr>PMULHRIW</nobr></code>: Multiply Packed 16-bit Integers With Rounding, and Store High Word</a><br>
<a href="nasmdocb.html#section-B.4.239">Section B.4.239: <code><nobr>PMULHRWA</nobr></code>: Multiply Packed 16-bit Integers With Rounding, and Store High Word</a><br>
<a href="nasmdocb.html#section-B.4.240">Section B.4.240: <code><nobr>PMULHUW</nobr></code>: Multiply Packed 16-bit Integers, and Store High Word</a><br>
<a href="nasmdocb.html#section-B.4.241">Section B.4.241: <code><nobr>PMULHW</nobr></code>, <code><nobr>PMULLW</nobr></code>: Multiply Packed 16-bit Integers, and Store</a><br>
<a href="nasmdocb.html#section-B.4.242">Section B.4.242: <code><nobr>PMULUDQ</nobr></code>: Multiply Packed Unsigned 32-bit Integers, and Store.</a><br>
<a href="nasmdocb.html#section-B.4.243">Section B.4.243: <code><nobr>PMVccZB</nobr></code>: MMX Packed Conditional Move</a><br>
<a href="nasmdocb.html#section-B.4.244">Section B.4.244: <code><nobr>POP</nobr></code>: Pop Data from Stack</a><br>
<a href="nasmdocb.html#section-B.4.245">Section B.4.245: <code><nobr>POPAx</nobr></code>: Pop All General-Purpose Registers</a><br>
<a href="nasmdocb.html#section-B.4.246">Section B.4.246: <code><nobr>POPFx</nobr></code>: Pop Flags Register</a><br>
<a href="nasmdocb.html#section-B.4.247">Section B.4.247: <code><nobr>POR</nobr></code>: MMX Bitwise OR</a><br>
<a href="nasmdocb.html#section-B.4.248">Section B.4.248: <code><nobr>PREFETCH</nobr></code>: Prefetch Data Into Caches</a><br>
<a href="nasmdocb.html#section-B.4.249">Section B.4.249: <code><nobr>PREFETCHh</nobr></code>: Prefetch Data Into Caches </a><br>
<a href="nasmdocb.html#section-B.4.250">Section B.4.250: <code><nobr>PSADBW</nobr></code>: Packed Sum of Absolute Differences</a><br>
<a href="nasmdocb.html#section-B.4.251">Section B.4.251: <code><nobr>PSHUFD</nobr></code>: Shuffle Packed Doublewords</a><br>
<a href="nasmdocb.html#section-B.4.252">Section B.4.252: <code><nobr>PSHUFHW</nobr></code>: Shuffle Packed High Words</a><br>
<a href="nasmdocb.html#section-B.4.253">Section B.4.253: <code><nobr>PSHUFLW</nobr></code>: Shuffle Packed Low Words</a><br>
<a href="nasmdocb.html#section-B.4.254">Section B.4.254: <code><nobr>PSHUFW</nobr></code>: Shuffle Packed Words</a><br>
<a href="nasmdocb.html#section-B.4.255">Section B.4.255: <code><nobr>PSLLx</nobr></code>: Packed Data Bit Shift Left Logical</a><br>
<a href="nasmdocb.html#section-B.4.256">Section B.4.256: <code><nobr>PSRAx</nobr></code>: Packed Data Bit Shift Right Arithmetic</a><br>
<a href="nasmdocb.html#section-B.4.257">Section B.4.257: <code><nobr>PSRLx</nobr></code>: Packed Data Bit Shift Right Logical</a><br>
<a href="nasmdocb.html#section-B.4.258">Section B.4.258: <code><nobr>PSUBx</nobr></code>: Subtract Packed Integers</a><br>
<a href="nasmdocb.html#section-B.4.259">Section B.4.259: <code><nobr>PSUBSxx</nobr></code>, <code><nobr>PSUBUSx</nobr></code>: Subtract Packed Integers With Saturation</a><br>
<a href="nasmdocb.html#section-B.4.260">Section B.4.260: <code><nobr>PSUBSIW</nobr></code>: MMX Packed Subtract with Saturation to Implied Destination</a><br>
<a href="nasmdocb.html#section-B.4.261">Section B.4.261: <code><nobr>PSWAPD</nobr></code>: Swap Packed Data </a><br>
<a href="nasmdocb.html#section-B.4.262">Section B.4.262: <code><nobr>PUNPCKxxx</nobr></code>: Unpack and Interleave Data</a><br>
<a href="nasmdocb.html#section-B.4.263">Section B.4.263: <code><nobr>PUSH</nobr></code>: Push Data on Stack</a><br>
<a href="nasmdocb.html#section-B.4.264">Section B.4.264: <code><nobr>PUSHAx</nobr></code>: Push All General-Purpose Registers</a><br>
<a href="nasmdocb.html#section-B.4.265">Section B.4.265: <code><nobr>PUSHFx</nobr></code>: Push Flags Register</a><br>
<a href="nasmdocb.html#section-B.4.266">Section B.4.266: <code><nobr>PXOR</nobr></code>: MMX Bitwise XOR</a><br>
<a href="nasmdocb.html#section-B.4.267">Section B.4.267: <code><nobr>RCL</nobr></code>, <code><nobr>RCR</nobr></code>: Bitwise Rotate through Carry Bit</a><br>
<a href="nasmdocb.html#section-B.4.268">Section B.4.268: <code><nobr>RCPPS</nobr></code>: Packed Single-Precision FP Reciprocal</a><br>
<a href="nasmdocb.html#section-B.4.269">Section B.4.269: <code><nobr>RCPSS</nobr></code>: Scalar Single-Precision FP Reciprocal</a><br>
<a href="nasmdocb.html#section-B.4.270">Section B.4.270: <code><nobr>RDMSR</nobr></code>: Read Model-Specific Registers</a><br>
<a href="nasmdocb.html#section-B.4.271">Section B.4.271: <code><nobr>RDPMC</nobr></code>: Read Performance-Monitoring Counters</a><br>
<a href="nasmdocb.html#section-B.4.272">Section B.4.272: <code><nobr>RDSHR</nobr></code>: Read SMM Header Pointer Register</a><br>
<a href="nasmdocb.html#section-B.4.273">Section B.4.273: <code><nobr>RDTSC</nobr></code>: Read Time-Stamp Counter</a><br>
<a href="nasmdocb.html#section-B.4.274">Section B.4.274: <code><nobr>RET</nobr></code>, <code><nobr>RETF</nobr></code>, <code><nobr>RETN</nobr></code>: Return from Procedure Call</a><br>
<a href="nasmdocb.html#section-B.4.275">Section B.4.275: <code><nobr>ROL</nobr></code>, <code><nobr>ROR</nobr></code>: Bitwise Rotate</a><br>
<a href="nasmdocb.html#section-B.4.276">Section B.4.276: <code><nobr>RSDC</nobr></code>: Restore Segment Register and Descriptor</a><br>
<a href="nasmdocb.html#section-B.4.277">Section B.4.277: <code><nobr>RSLDT</nobr></code>: Restore Segment Register and Descriptor</a><br>
<a href="nasmdocb.html#section-B.4.278">Section B.4.278: <code><nobr>RSM</nobr></code>: Resume from System-Management Mode</a><br>
<a href="nasmdocb.html#section-B.4.279">Section B.4.279: <code><nobr>RSQRTPS</nobr></code>: Packed Single-Precision FP Square Root Reciprocal</a><br>
<a href="nasmdocb.html#section-B.4.280">Section B.4.280: <code><nobr>RSQRTSS</nobr></code>: Scalar Single-Precision FP Square Root Reciprocal</a><br>
<a href="nasmdocb.html#section-B.4.281">Section B.4.281: <code><nobr>RSTS</nobr></code>: Restore TSR and Descriptor</a><br>
<a href="nasmdocb.html#section-B.4.282">Section B.4.282: <code><nobr>SAHF</nobr></code>: Store AH to Flags</a><br>
<a href="nasmdocb.html#section-B.4.283">Section B.4.283: <code><nobr>SAL</nobr></code>, <code><nobr>SAR</nobr></code>: Bitwise Arithmetic Shifts</a><br>
<a href="nasmdocb.html#section-B.4.284">Section B.4.284: <code><nobr>SALC</nobr></code>: Set AL from Carry Flag</a><br>
<a href="nasmdocb.html#section-B.4.285">Section B.4.285: <code><nobr>SBB</nobr></code>: Subtract with Borrow</a><br>
<a href="nasmdocb.html#section-B.4.286">Section B.4.286: <code><nobr>SCASB</nobr></code>, <code><nobr>SCASW</nobr></code>, <code><nobr>SCASD</nobr></code>: Scan String</a><br>
<a href="nasmdocb.html#section-B.4.287">Section B.4.287: <code><nobr>SETcc</nobr></code>: Set Register from Condition</a><br>
<a href="nasmdocb.html#section-B.4.288">Section B.4.288: <code><nobr>SFENCE</nobr></code>: Store Fence</a><br>
<a href="nasmdocb.html#section-B.4.289">Section B.4.289: <code><nobr>SGDT</nobr></code>, <code><nobr>SIDT</nobr></code>, <code><nobr>SLDT</nobr></code>: Store Descriptor Table Pointers</a><br>
<a href="nasmdocb.html#section-B.4.290">Section B.4.290: <code><nobr>SHL</nobr></code>, <code><nobr>SHR</nobr></code>: Bitwise Logical Shifts</a><br>
<a href="nasmdocb.html#section-B.4.291">Section B.4.291: <code><nobr>SHLD</nobr></code>, <code><nobr>SHRD</nobr></code>: Bitwise Double-Precision Shifts</a><br>
<a href="nasmdocb.html#section-B.4.292">Section B.4.292: <code><nobr>SHUFPD</nobr></code>: Shuffle Packed Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.293">Section B.4.293: <code><nobr>SHUFPS</nobr></code>: Shuffle Packed Single-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.294">Section B.4.294: <code><nobr>SMI</nobr></code>: System Management Interrupt</a><br>
<a href="nasmdocb.html#section-B.4.295">Section B.4.295: <code><nobr>SMINT</nobr></code>, <code><nobr>SMINTOLD</nobr></code>: Software SMM Entry (CYRIX)</a><br>
<a href="nasmdocb.html#section-B.4.296">Section B.4.296: <code><nobr>SMSW</nobr></code>: Store Machine Status Word</a><br>
<a href="nasmdocb.html#section-B.4.297">Section B.4.297: <code><nobr>SQRTPD</nobr></code>: Packed Double-Precision FP Square Root</a><br>
<a href="nasmdocb.html#section-B.4.298">Section B.4.298: <code><nobr>SQRTPS</nobr></code>: Packed Single-Precision FP Square Root</a><br>
<a href="nasmdocb.html#section-B.4.299">Section B.4.299: <code><nobr>SQRTSD</nobr></code>: Scalar Double-Precision FP Square Root</a><br>
<a href="nasmdocb.html#section-B.4.300">Section B.4.300: <code><nobr>SQRTSS</nobr></code>: Scalar Single-Precision FP Square Root</a><br>
<a href="nasmdocb.html#section-B.4.301">Section B.4.301: <code><nobr>STC</nobr></code>, <code><nobr>STD</nobr></code>, <code><nobr>STI</nobr></code>: Set Flags</a><br>
<a href="nasmdocb.html#section-B.4.302">Section B.4.302: <code><nobr>STMXCSR</nobr></code>: Store Streaming SIMD Extension Control/Status</a><br>
<a href="nasmdocb.html#section-B.4.303">Section B.4.303: <code><nobr>STOSB</nobr></code>, <code><nobr>STOSW</nobr></code>, <code><nobr>STOSD</nobr></code>: Store Byte to String</a><br>
<a href="nasmdocb.html#section-B.4.304">Section B.4.304: <code><nobr>STR</nobr></code>: Store Task Register</a><br>
<a href="nasmdocb.html#section-B.4.305">Section B.4.305: <code><nobr>SUB</nobr></code>: Subtract Integers</a><br>
<a href="nasmdocb.html#section-B.4.306">Section B.4.306: <code><nobr>SUBPD</nobr></code>: Packed Double-Precision FP Subtract</a><br>
<a href="nasmdocb.html#section-B.4.307">Section B.4.307: <code><nobr>SUBPS</nobr></code>: Packed Single-Precision FP Subtract</a><br>
<a href="nasmdocb.html#section-B.4.308">Section B.4.308: <code><nobr>SUBSD</nobr></code>: Scalar Single-FP Subtract</a><br>
<a href="nasmdocb.html#section-B.4.309">Section B.4.309: <code><nobr>SUBSS</nobr></code>: Scalar Single-FP Subtract</a><br>
<a href="nasmdocb.html#section-B.4.310">Section B.4.310: <code><nobr>SVDC</nobr></code>: Save Segment Register and Descriptor</a><br>
<a href="nasmdocb.html#section-B.4.311">Section B.4.311: <code><nobr>SVLDT</nobr></code>: Save LDTR and Descriptor</a><br>
<a href="nasmdocb.html#section-B.4.312">Section B.4.312: <code><nobr>SVTS</nobr></code>: Save TSR and Descriptor</a><br>
<a href="nasmdocb.html#section-B.4.313">Section B.4.313: <code><nobr>SYSCALL</nobr></code>: Call Operating System</a><br>
<a href="nasmdocb.html#section-B.4.314">Section B.4.314: <code><nobr>SYSENTER</nobr></code>: Fast System Call</a><br>
<a href="nasmdocb.html#section-B.4.315">Section B.4.315: <code><nobr>SYSEXIT</nobr></code>: Fast Return From System Call</a><br>
<a href="nasmdocb.html#section-B.4.316">Section B.4.316: <code><nobr>SYSRET</nobr></code>: Return From Operating System</a><br>
<a href="nasmdocb.html#section-B.4.317">Section B.4.317: <code><nobr>TEST</nobr></code>: Test Bits (notional bitwise AND)</a><br>
<a href="nasmdocb.html#section-B.4.318">Section B.4.318: <code><nobr>UCOMISD</nobr></code>: Unordered Scalar Double-Precision FP compare and set EFLAGS</a><br>
<a href="nasmdocb.html#section-B.4.319">Section B.4.319: <code><nobr>UCOMISS</nobr></code>: Unordered Scalar Single-Precision FP compare and set EFLAGS</a><br>
<a href="nasmdocb.html#section-B.4.320">Section B.4.320: <code><nobr>UD0</nobr></code>, <code><nobr>UD1</nobr></code>, <code><nobr>UD2</nobr></code>: Undefined Instruction</a><br>
<a href="nasmdocb.html#section-B.4.321">Section B.4.321: <code><nobr>UMOV</nobr></code>: User Move Data</a><br>
<a href="nasmdocb.html#section-B.4.322">Section B.4.322: <code><nobr>UNPCKHPD</nobr></code>: Unpack and Interleave High Packed Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.323">Section B.4.323: <code><nobr>UNPCKHPS</nobr></code>: Unpack and Interleave High Packed Single-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.324">Section B.4.324: <code><nobr>UNPCKLPD</nobr></code>: Unpack and Interleave Low Packed Double-Precision FP Data</a><br>
<a href="nasmdocb.html#section-B.4.325">Section B.4.325: <code><nobr>UNPCKLPS</nobr></code>: Unpack and Interleave Low Packed Single-Precision FP Data</a><br>
<a href="nasmdocb.html#section-B.4.326">Section B.4.326: <code><nobr>VERR</nobr></code>, <code><nobr>VERW</nobr></code>: Verify Segment Readability/Writability</a><br>
<a href="nasmdocb.html#section-B.4.327">Section B.4.327: <code><nobr>WAIT</nobr></code>: Wait for Floating-Point Processor</a><br>
<a href="nasmdocb.html#section-B.4.328">Section B.4.328: <code><nobr>WBINVD</nobr></code>: Write Back and Invalidate Cache</a><br>
<a href="nasmdocb.html#section-B.4.329">Section B.4.329: <code><nobr>WRMSR</nobr></code>: Write Model-Specific Registers</a><br>
<a href="nasmdocb.html#section-B.4.330">Section B.4.330: <code><nobr>WRSHR</nobr></code>: Write SMM Header Pointer Register</a><br>
<a href="nasmdocb.html#section-B.4.331">Section B.4.331: <code><nobr>XADD</nobr></code>: Exchange and Add</a><br>
<a href="nasmdocb.html#section-B.4.332">Section B.4.332: <code><nobr>XBTS</nobr></code>: Extract Bit String</a><br>
<a href="nasmdocb.html#section-B.4.333">Section B.4.333: <code><nobr>XCHG</nobr></code>: Exchange</a><br>
<a href="nasmdocb.html#section-B.4.334">Section B.4.334: <code><nobr>XLATB</nobr></code>: Translate Byte in Lookup Table</a><br>
<a href="nasmdocb.html#section-B.4.335">Section B.4.335: <code><nobr>XOR</nobr></code>: Bitwise Exclusive OR</a><br>
<a href="nasmdocb.html#section-B.4.336">Section B.4.336: <code><nobr>XORPD</nobr></code>: Bitwise Logical XOR of Double-Precision FP Values</a><br>
<a href="nasmdocb.html#section-B.4.337">Section B.4.337: <code><nobr>XORPS</nobr></code>: Bitwise Logical XOR of Single-Precision FP Values</a><br>
<p><a href="nasmdoci.html">Index</a>
</body></html>

View File

@@ -0,0 +1,164 @@
<html><head><title>NASM Manual</title></head>
<body><h1 align=center>The Netwide Assembler: NASM</h1>
<p align=center><a href="nasmdoc2.html">Next Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
<h2><a name="chapter-1">Chapter 1: Introduction</a></h2>
<h3><a name="section-1.1">1.1 What Is NASM?</a></h3>
<p>The Netwide Assembler, NASM, is an 80x86 assembler designed for
portability and modularity. It supports a range of object file formats,
including Linux and <code><nobr>NetBSD/FreeBSD</nobr></code>
<code><nobr>a.out</nobr></code>, <code><nobr>ELF</nobr></code>,
<code><nobr>COFF</nobr></code>, Microsoft 16-bit
<code><nobr>OBJ</nobr></code> and <code><nobr>Win32</nobr></code>. It will
also output plain binary files. Its syntax is designed to be simple and
easy to understand, similar to Intel's but less complex. It supports
<code><nobr>Pentium</nobr></code>, <code><nobr>P6</nobr></code>,
<code><nobr>MMX</nobr></code>, <code><nobr>3DNow!</nobr></code>,
<code><nobr>SSE</nobr></code> and <code><nobr>SSE2</nobr></code> opcodes,
and has macro capability.
<h4><a name="section-1.1.1">1.1.1 Why Yet Another Assembler?</a></h4>
<p>The Netwide Assembler grew out of an idea on
<code><nobr>comp.lang.asm.x86</nobr></code> (or possibly
<code><nobr>alt.lang.asm</nobr></code> - I forget which), which was
essentially that there didn't seem to be a good <em>free</em> x86-series
assembler around, and that maybe someone ought to write one.
<ul>
<li><code><nobr>a86</nobr></code> is good, but not free, and in particular
you don't get any 32-bit capability until you pay. It's DOS only, too.
<li><code><nobr>gas</nobr></code> is free, and ports over DOS and Unix, but
it's not very good, since it's designed to be a back end to
<code><nobr>gcc</nobr></code>, which always feeds it correct code. So its
error checking is minimal. Also, its syntax is horrible, from the point of
view of anyone trying to actually <em>write</em> anything in it. Plus you
can't write 16-bit code in it (properly).
<li><code><nobr>as86</nobr></code> is Minix- and Linux-specific, and (my
version at least) doesn't seem to have much (or any) documentation.
<li><code><nobr>MASM</nobr></code> isn't very good, and it's (was)
expensive, and it runs only under DOS.
<li><code><nobr>TASM</nobr></code> is better, but still strives for MASM
compatibility, which means millions of directives and tons of red tape. And
its syntax is essentially MASM's, with the contradictions and quirks that
entails (although it sorts out some of those by means of Ideal mode). It's
expensive too. And it's DOS-only.
</ul>
<p>So here, for your coding pleasure, is NASM. At present it's still in
prototype stage - we don't promise that it can outperform any of these
assemblers. But please, <em>please</em> send us bug reports, fixes, helpful
information, and anything else you can get your hands on (and thanks to the
many people who've done this already! You all know who you are), and we'll
improve it out of all recognition. Again.
<h4><a name="section-1.1.2">1.1.2 Licence Conditions</a></h4>
<p>Please see the file <code><nobr>COPYING</nobr></code>, supplied as part
of any NASM distribution archive, for the licence conditions under which
you may use NASM. NASM is now under the so-called GNU Lesser General Public
License, LGPL.
<h3><a name="section-1.2">1.2 Contact Information</a></h3>
<p>The current version of NASM (since about 0.98.08) are maintained by a
team of developers, accessible through the
<code><nobr>nasm-devel</nobr></code> mailing list (see below for the link).
If you want to report a bug, please read
<a href="nasmdo10.html#section-10.2">section 10.2</a> first.
<p>NASM has a WWW page at
<a href="http://nasm.sourceforge.net"><code><nobr>http://nasm.sourceforge.net</nobr></code></a>.
If it's not there, google for us!
<p>The original authors are e-mailable as
<a href="mailto:jules@dsf.org.uk"><code><nobr>jules@dsf.org.uk</nobr></code></a>
and
<a href="mailto:anakin@pobox.com"><code><nobr>anakin@pobox.com</nobr></code></a>.
The latter is no longer involved in the development team.
<p>New releases of NASM are uploaded to the official sites
<a href="http://nasm.sourceforge.net"><code><nobr>http://nasm.sourceforge.net</nobr></code></a>
and to
<a href="ftp://ftp.kernel.org/pub/software/devel/nasm/"><code><nobr>ftp.kernel.org</nobr></code></a>
and
<a href="ftp://ibiblio.org/pub/Linux/devel/lang/assemblers/"><code><nobr>ibiblio.org</nobr></code></a>.
<p>Announcements are posted to
<a href="news:comp.lang.asm.x86"><code><nobr>comp.lang.asm.x86</nobr></code></a>,
<a href="news:alt.lang.asm"><code><nobr>alt.lang.asm</nobr></code></a> and
<a href="news:comp.os.linux.announce"><code><nobr>comp.os.linux.announce</nobr></code></a>
<p>If you want information about NASM beta releases, and the current
development status, please subscribe to the
<code><nobr>nasm-devel</nobr></code> email list by registering at
<a href="http://sourceforge.net/projects/nasm"><code><nobr>http://sourceforge.net/projects/nasm</nobr></code></a>.
<h3><a name="section-1.3">1.3 Installation</a></h3>
<h4><a name="section-1.3.1">1.3.1 Installing NASM under MS-DOS or Windows</a></h4>
<p>Once you've obtained the DOS archive for NASM,
<code><nobr>nasmXXX.zip</nobr></code> (where <code><nobr>XXX</nobr></code>
denotes the version number of NASM contained in the archive), unpack it
into its own directory (for example <code><nobr>c:\nasm</nobr></code>).
<p>The archive will contain four executable files: the NASM executable
files <code><nobr>nasm.exe</nobr></code> and
<code><nobr>nasmw.exe</nobr></code>, and the NDISASM executable files
<code><nobr>ndisasm.exe</nobr></code> and
<code><nobr>ndisasmw.exe</nobr></code>. In each case, the file whose name
ends in <code><nobr>w</nobr></code> is a <code><nobr>Win32</nobr></code>
executable, designed to run under <code><nobr>Windows 95</nobr></code> or
<code><nobr>Windows NT</nobr></code> Intel, and the other one is a 16-bit
<code><nobr>DOS</nobr></code> executable.
<p>The only file NASM needs to run is its own executable, so copy (at
least) one of <code><nobr>nasm.exe</nobr></code> and
<code><nobr>nasmw.exe</nobr></code> to a directory on your PATH, or
alternatively edit <code><nobr>autoexec.bat</nobr></code> to add the
<code><nobr>nasm</nobr></code> directory to your
<code><nobr>PATH</nobr></code>. (If you're only installing the
<code><nobr>Win32</nobr></code> version, you may wish to rename it to
<code><nobr>nasm.exe</nobr></code>.)
<p>That's it - NASM is installed. You don't need the nasm directory to be
present to run NASM (unless you've added it to your
<code><nobr>PATH</nobr></code>), so you can delete it if you need to save
space; however, you may want to keep the documentation or test programs.
<p>If you've downloaded the DOS source archive,
<code><nobr>nasmXXXs.zip</nobr></code>, the <code><nobr>nasm</nobr></code>
directory will also contain the full NASM source code, and a selection of
Makefiles you can (hopefully) use to rebuild your copy of NASM from
scratch.
<p>Note that the source files <code><nobr>insnsa.c</nobr></code>,
<code><nobr>insnsd.c</nobr></code>, <code><nobr>insnsi.h</nobr></code> and
<code><nobr>insnsn.c</nobr></code> are automatically generated from the
master instruction table <code><nobr>insns.dat</nobr></code> by a Perl
script; the file <code><nobr>macros.c</nobr></code> is generated from
<code><nobr>standard.mac</nobr></code> by another Perl script. Although the
NASM source distribution includes these generated files, you will need to
rebuild them (and hence, will need a Perl interpreter) if you change
insns.dat, standard.mac or the documentation. It is possible future source
distributions may not include these files at all. Ports of Perl for a
variety of platforms, including DOS and Windows, are available from
<a href="http://www.cpan.org/ports/">www.cpan.org</a>.
<h4><a name="section-1.3.2">1.3.2 Installing NASM under Unix</a></h4>
<p>Once you've obtained the Unix source archive for NASM,
<code><nobr>nasm-X.XX.tar.gz</nobr></code> (where
<code><nobr>X.XX</nobr></code> denotes the version number of NASM contained
in the archive), unpack it into a directory such as
<code><nobr>/usr/local/src</nobr></code>. The archive, when unpacked, will
create its own subdirectory <code><nobr>nasm-X.XX</nobr></code>.
<p>NASM is an auto-configuring package: once you've unpacked it,
<code><nobr>cd</nobr></code> to the directory it's been unpacked into and
type <code><nobr>./configure</nobr></code>. This shell script will find the
best C compiler to use for building NASM and set up Makefiles accordingly.
<p>Once NASM has auto-configured, you can type
<code><nobr>make</nobr></code> to build the <code><nobr>nasm</nobr></code>
and <code><nobr>ndisasm</nobr></code> binaries, and then
<code><nobr>make install</nobr></code> to install them in
<code><nobr>/usr/local/bin</nobr></code> and install the man pages
<code><nobr>nasm.1</nobr></code> and <code><nobr>ndisasm.1</nobr></code> in
<code><nobr>/usr/local/man/man1</nobr></code>. Alternatively, you can give
options such as <code><nobr>--prefix</nobr></code> to the configure script
(see the file <code><nobr>INSTALL</nobr></code> for more details), or
install the programs yourself.
<p>NASM also comes with a set of utilities for handling the
<code><nobr>RDOFF</nobr></code> custom object-file format, which are in the
<code><nobr>rdoff</nobr></code> subdirectory of the NASM archive. You can
build these with <code><nobr>make rdf</nobr></code> and install them with
<code><nobr>make rdf_install</nobr></code>, if you want them.
<p>If NASM fails to auto-configure, you may still be able to make it
compile by using the fall-back Unix makefile
<code><nobr>Makefile.unx</nobr></code>. Copy or rename that file to
<code><nobr>Makefile</nobr></code> and try typing
<code><nobr>make</nobr></code>. There is also a Makefile.unx file in the
<code><nobr>rdoff</nobr></code> subdirectory.
<p align=center><a href="nasmdoc2.html">Next Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
</body></html>

View File

@@ -0,0 +1,572 @@
<html><head><title>NASM Manual</title></head>
<body><h1 align=center>The Netwide Assembler: NASM</h1>
<p align=center><a href="nasmdoc3.html">Next Chapter</a> |
<a href="nasmdoc1.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
<h2><a name="chapter-2">Chapter 2: Running NASM</a></h2>
<h3><a name="section-2.1">2.1 NASM Command-Line Syntax</a></h3>
<p>To assemble a file, you issue a command of the form
<p><pre>
nasm -f &lt;format&gt; &lt;filename&gt; [-o &lt;output&gt;]
</pre>
<p>For example,
<p><pre>
nasm -f elf myfile.asm
</pre>
<p>will assemble <code><nobr>myfile.asm</nobr></code> into an
<code><nobr>ELF</nobr></code> object file
<code><nobr>myfile.o</nobr></code>. And
<p><pre>
nasm -f bin myfile.asm -o myfile.com
</pre>
<p>will assemble <code><nobr>myfile.asm</nobr></code> into a raw binary
file <code><nobr>myfile.com</nobr></code>.
<p>To produce a listing file, with the hex codes output from NASM displayed
on the left of the original sources, use the <code><nobr>-l</nobr></code>
option to give a listing file name, for example:
<p><pre>
nasm -f coff myfile.asm -l myfile.lst
</pre>
<p>To get further usage instructions from NASM, try typing
<p><pre>
nasm -h
</pre>
<p>As <code><nobr>-hf</nobr></code>, this will also list the available
output file formats, and what they are.
<p>If you use Linux but aren't sure whether your system is
<code><nobr>a.out</nobr></code> or <code><nobr>ELF</nobr></code>, type
<p><pre>
file nasm
</pre>
<p>(in the directory in which you put the NASM binary when you installed
it). If it says something like
<p><pre>
nasm: ELF 32-bit LSB executable i386 (386 and up) Version 1
</pre>
<p>then your system is <code><nobr>ELF</nobr></code>, and you should use
the option <code><nobr>-f elf</nobr></code> when you want NASM to produce
Linux object files. If it says
<p><pre>
nasm: Linux/i386 demand-paged executable (QMAGIC)
</pre>
<p>or something similar, your system is <code><nobr>a.out</nobr></code>,
and you should use <code><nobr>-f aout</nobr></code> instead (Linux
<code><nobr>a.out</nobr></code> systems have long been obsolete, and are
rare these days.)
<p>Like Unix compilers and assemblers, NASM is silent unless it goes wrong:
you won't see any output at all, unless it gives error messages.
<h4><a name="section-2.1.1">2.1.1 The <code><nobr>-o</nobr></code> Option: Specifying the Output File Name</a></h4>
<p>NASM will normally choose the name of your output file for you;
precisely how it does this is dependent on the object file format. For
Microsoft object file formats (<code><nobr>obj</nobr></code> and
<code><nobr>win32</nobr></code>), it will remove the
<code><nobr>.asm</nobr></code> extension (or whatever extension you like to
use - NASM doesn't care) from your source file name and substitute
<code><nobr>.obj</nobr></code>. For Unix object file formats
(<code><nobr>aout</nobr></code>, <code><nobr>coff</nobr></code>,
<code><nobr>elf</nobr></code> and <code><nobr>as86</nobr></code>) it will
substitute <code><nobr>.o</nobr></code>. For <code><nobr>rdf</nobr></code>,
it will use <code><nobr>.rdf</nobr></code>, and for the
<code><nobr>bin</nobr></code> format it will simply remove the extension,
so that <code><nobr>myfile.asm</nobr></code> produces the output file
<code><nobr>myfile</nobr></code>.
<p>If the output file already exists, NASM will overwrite it, unless it has
the same name as the input file, in which case it will give a warning and
use <code><nobr>nasm.out</nobr></code> as the output file name instead.
<p>For situations in which this behaviour is unacceptable, NASM provides
the <code><nobr>-o</nobr></code> command-line option, which allows you to
specify your desired output file name. You invoke
<code><nobr>-o</nobr></code> by following it with the name you wish for the
output file, either with or without an intervening space. For example:
<p><pre>
nasm -f bin program.asm -o program.com
nasm -f bin driver.asm -odriver.sys
</pre>
<p>Note that this is a small o, and is different from a capital O , which
is used to specify the number of optimisation passes required. See
<a href="#section-2.1.16">section 2.1.16</a>.
<h4><a name="section-2.1.2">2.1.2 The <code><nobr>-f</nobr></code> Option: Specifying the Output File Format</a></h4>
<p>If you do not supply the <code><nobr>-f</nobr></code> option to NASM, it
will choose an output file format for you itself. In the distribution
versions of NASM, the default is always <code><nobr>bin</nobr></code>; if
you've compiled your own copy of NASM, you can redefine
<code><nobr>OF_DEFAULT</nobr></code> at compile time and choose what you
want the default to be.
<p>Like <code><nobr>-o</nobr></code>, the intervening space between
<code><nobr>-f</nobr></code> and the output file format is optional; so
<code><nobr>-f elf</nobr></code> and <code><nobr>-felf</nobr></code> are
both valid.
<p>A complete list of the available output file formats can be given by
issuing the command <code><nobr>nasm -hf</nobr></code>.
<h4><a name="section-2.1.3">2.1.3 The <code><nobr>-l</nobr></code> Option: Generating a Listing File</a></h4>
<p>If you supply the <code><nobr>-l</nobr></code> option to NASM, followed
(with the usual optional space) by a file name, NASM will generate a
source-listing file for you, in which addresses and generated code are
listed on the left, and the actual source code, with expansions of
multi-line macros (except those which specifically request no expansion in
source listings: see <a href="nasmdoc4.html#section-4.3.9">section
4.3.9</a>) on the right. For example:
<p><pre>
nasm -f elf myfile.asm -l myfile.lst
</pre>
<p>If a list file is selected, you may turn off listing for a section of
your source with <code><nobr>[list -]</nobr></code>, and turn it back on
with <code><nobr>[list +]</nobr></code>, (the default, obviously). There is
no "user form" (without the brackets). This can be used to list only
sections of interest, avoiding excessively long listings.
<h4><a name="section-2.1.4">2.1.4 The <code><nobr>-M</nobr></code> Option: Generate Makefile Dependencies.</a></h4>
<p>This option can be used to generate makefile dependencies on stdout.
This can be redirected to a file for further processing. For example:
<p><pre>
NASM -M myfile.asm &gt; myfile.dep
</pre>
<h4><a name="section-2.1.5">2.1.5 The <code><nobr>-F</nobr></code> Option: Selecting a Debug Information Format</a></h4>
<p>This option is used to select the format of the debug information
emitted into the output file, to be used by a debugger (or <em>will</em>
be). Use of this switch does <em>not</em> enable output of the selected
debug info format. Use <code><nobr>-g</nobr></code>, see
<a href="#section-2.1.6">section 2.1.6</a>, to enable output.
<p>A complete list of the available debug file formats for an output format
can be seen by issuing the command
<code><nobr>nasm -f &lt;format&gt; -y</nobr></code>. (only "borland" in "-f
obj", as of 0.98.35, but "watch this space") See:
<a href="#section-2.1.20">section 2.1.20</a>.
<p>This should not be confused with the "-f dbg" output format option which
is not built into NASM by default. For information on how to enable it when
building from the sources, see <a href="nasmdoc6.html#section-6.10">section
6.10</a>
<h4><a name="section-2.1.6">2.1.6 The <code><nobr>-g</nobr></code> Option: Enabling Debug Information.</a></h4>
<p>This option can be used to generate debugging information in the
specified format. See: <a href="#section-2.1.5">section 2.1.5</a>. Using
<code><nobr>-g</nobr></code> without <code><nobr>-F</nobr></code> results
in emitting debug info in the default format, if any, for the selected
output format. If no debug information is currently implemented in the
selected output format, <code><nobr>-g</nobr></code> is <em>silently
ignored</em>.
<h4><a name="section-2.1.7">2.1.7 The <code><nobr>-X</nobr></code> Option: Selecting an Error Reporting Format</a></h4>
<p>This option can be used to select an error reporting format for any
error messages that might be produced by NASM.
<p>Currently, two error reporting formats may be selected. They are the
<code><nobr>-Xvc</nobr></code> option and the
<code><nobr>-Xgnu</nobr></code> option. The GNU format is the default and
looks like this:
<p><pre>
filename.asm:65: error: specific error message
</pre>
<p>where <code><nobr>filename.asm</nobr></code> is the name of the source
file in which the error was detected, <code><nobr>65</nobr></code> is the
source file line number on which the error was detected,
<code><nobr>error</nobr></code> is the severity of the error (this could be
<code><nobr>warning</nobr></code>), and
<code><nobr>specific error message</nobr></code> is a more detailed text
message which should help pinpoint the exact problem.
<p>The other format, specified by <code><nobr>-Xvc</nobr></code> is the
style used by Microsoft Visual C++ and some other programs. It looks like
this:
<p><pre>
filename.asm(65) : error: specific error message
</pre>
<p>where the only difference is that the line number is in parentheses
instead of being delimited by colons.
<p>See also the <code><nobr>Visual C++</nobr></code> output format,
<a href="nasmdoc6.html#section-6.3">section 6.3</a>.
<h4><a name="section-2.1.8">2.1.8 The <code><nobr>-E</nobr></code> Option: Send Errors to a File</a></h4>
<p>Under <code><nobr>MS-DOS</nobr></code> it can be difficult (though there
are ways) to redirect the standard-error output of a program to a file.
Since NASM usually produces its warning and error messages on
<code><nobr>stderr</nobr></code>, this can make it hard to capture the
errors if (for example) you want to load them into an editor.
<p>NASM therefore provides the <code><nobr>-E</nobr></code> option, taking
a filename argument which causes errors to be sent to the specified files
rather than standard error. Therefore you can redirect the errors into a
file by typing
<p><pre>
nasm -E myfile.err -f obj myfile.asm
</pre>
<h4><a name="section-2.1.9">2.1.9 The <code><nobr>-s</nobr></code> Option: Send Errors to <code><nobr>stdout</nobr></code></a></h4>
<p>The <code><nobr>-s</nobr></code> option redirects error messages to
<code><nobr>stdout</nobr></code> rather than
<code><nobr>stderr</nobr></code>, so it can be redirected under
<code><nobr>MS-DOS</nobr></code>. To assemble the file
<code><nobr>myfile.asm</nobr></code> and pipe its output to the
<code><nobr>more</nobr></code> program, you can type:
<p><pre>
nasm -s -f obj myfile.asm | more
</pre>
<p>See also the <code><nobr>-E</nobr></code> option,
<a href="#section-2.1.8">section 2.1.8</a>.
<h4><a name="section-2.1.10">2.1.10 The <code><nobr>-i</nobr></code> Option: Include File Search Directories</a></h4>
<p>When NASM sees the <code><nobr>%include</nobr></code> or
<code><nobr>incbin</nobr></code> directive in a source file (see
<a href="nasmdoc4.html#section-4.6">section 4.6</a> or
<a href="nasmdoc3.html#section-3.2.3">section 3.2.3</a>), it will search
for the given file not only in the current directory, but also in any
directories specified on the command line by the use of the
<code><nobr>-i</nobr></code> option. Therefore you can include files from a
macro library, for example, by typing
<p><pre>
nasm -ic:\macrolib\ -f obj myfile.asm
</pre>
<p>(As usual, a space between <code><nobr>-i</nobr></code> and the path
name is allowed, and optional).
<p>NASM, in the interests of complete source-code portability, does not
understand the file naming conventions of the OS it is running on; the
string you provide as an argument to the <code><nobr>-i</nobr></code>
option will be prepended exactly as written to the name of the include
file. Therefore the trailing backslash in the above example is necessary.
Under Unix, a trailing forward slash is similarly necessary.
<p>(You can use this to your advantage, if you're really perverse, by
noting that the option <code><nobr>-ifoo</nobr></code> will cause
<code><nobr>%include "bar.i"</nobr></code> to search for the file
<code><nobr>foobar.i</nobr></code>...)
<p>If you want to define a <em>standard</em> include search path, similar
to <code><nobr>/usr/include</nobr></code> on Unix systems, you should place
one or more <code><nobr>-i</nobr></code> directives in the
<code><nobr>NASMENV</nobr></code> environment variable (see
<a href="#section-2.1.22">section 2.1.22</a>).
<p>For Makefile compatibility with many C compilers, this option can also
be specified as <code><nobr>-I</nobr></code>.
<h4><a name="section-2.1.11">2.1.11 The <code><nobr>-p</nobr></code> Option: Pre-Include a File</a></h4>
<p>NASM allows you to specify files to be <em>pre-included</em> into your
source file, by the use of the <code><nobr>-p</nobr></code> option. So
running
<p><pre>
nasm myfile.asm -p myinc.inc
</pre>
<p>is equivalent to running <code><nobr>nasm myfile.asm</nobr></code> and
placing the directive <code><nobr>%include "myinc.inc"</nobr></code> at the
start of the file.
<p>For consistency with the <code><nobr>-I</nobr></code>,
<code><nobr>-D</nobr></code> and <code><nobr>-U</nobr></code> options, this
option can also be specified as <code><nobr>-P</nobr></code>.
<h4><a name="section-2.1.12">2.1.12 The <code><nobr>-d</nobr></code> Option: Pre-Define a Macro</a></h4>
<p>Just as the <code><nobr>-p</nobr></code> option gives an alternative to
placing <code><nobr>%include</nobr></code> directives at the start of a
source file, the <code><nobr>-d</nobr></code> option gives an alternative
to placing a <code><nobr>%define</nobr></code> directive. You could code
<p><pre>
nasm myfile.asm -dFOO=100
</pre>
<p>as an alternative to placing the directive
<p><pre>
%define FOO 100
</pre>
<p>at the start of the file. You can miss off the macro value, as well: the
option <code><nobr>-dFOO</nobr></code> is equivalent to coding
<code><nobr>%define FOO</nobr></code>. This form of the directive may be
useful for selecting assembly-time options which are then tested using
<code><nobr>%ifdef</nobr></code>, for example
<code><nobr>-dDEBUG</nobr></code>.
<p>For Makefile compatibility with many C compilers, this option can also
be specified as <code><nobr>-D</nobr></code>.
<h4><a name="section-2.1.13">2.1.13 The <code><nobr>-u</nobr></code> Option: Undefine a Macro</a></h4>
<p>The <code><nobr>-u</nobr></code> option undefines a macro that would
otherwise have been pre-defined, either automatically or by a
<code><nobr>-p</nobr></code> or <code><nobr>-d</nobr></code> option
specified earlier on the command lines.
<p>For example, the following command line:
<p><pre>
nasm myfile.asm -dFOO=100 -uFOO
</pre>
<p>would result in <code><nobr>FOO</nobr></code> <em>not</em> being a
predefined macro in the program. This is useful to override options
specified at a different point in a Makefile.
<p>For Makefile compatibility with many C compilers, this option can also
be specified as <code><nobr>-U</nobr></code>.
<h4><a name="section-2.1.14">2.1.14 The <code><nobr>-e</nobr></code> Option: Preprocess Only</a></h4>
<p>NASM allows the preprocessor to be run on its own, up to a point. Using
the <code><nobr>-e</nobr></code> option (which requires no arguments) will
cause NASM to preprocess its input file, expand all the macro references,
remove all the comments and preprocessor directives, and print the
resulting file on standard output (or save it to a file, if the
<code><nobr>-o</nobr></code> option is also used).
<p>This option cannot be applied to programs which require the preprocessor
to evaluate expressions which depend on the values of symbols: so code such
as
<p><pre>
%assign tablesize ($-tablestart)
</pre>
<p>will cause an error in preprocess-only mode.
<h4><a name="section-2.1.15">2.1.15 The <code><nobr>-a</nobr></code> Option: Don't Preprocess At All</a></h4>
<p>If NASM is being used as the back end to a compiler, it might be
desirable to suppress preprocessing completely and assume the compiler has
already done it, to save time and increase compilation speeds. The
<code><nobr>-a</nobr></code> option, requiring no argument, instructs NASM
to replace its powerful preprocessor with a stub preprocessor which does
nothing.
<h4><a name="section-2.1.16">2.1.16 The <code><nobr>-On</nobr></code> Option: Specifying Multipass Optimization.</a></h4>
<p>NASM defaults to being a two pass assembler. This means that if you have
a complex source file which needs more than 2 passes to assemble optimally,
you have to enable extra passes.
<p>Using the <code><nobr>-O</nobr></code> option, you can tell NASM to
carry out multiple passes. The syntax is:
<ul>
<li><code><nobr>-O0</nobr></code> strict two-pass assembly, JMP and Jcc are
handled more like v0.98, except that backward JMPs are short, if possible.
Immediate operands take their long forms if a short form is not specified.
<li><code><nobr>-O1</nobr></code> strict two-pass assembly, but forward
branches are assembled with code guaranteed to reach; may produce larger
code than -O0, but will produce successful assembly more often if branch
offset sizes are not specified. Additionally, immediate operands which will
fit in a signed byte are optimised, unless the long form is specified.
<li><code><nobr>-On</nobr></code> multi-pass optimization, minimize branch
offsets; also will minimize signed immediate bytes, overriding size
specification unless the <code><nobr>strict</nobr></code> keyword has been
used (see <a href="nasmdoc3.html#section-3.7">section 3.7</a>). The number
specifies the maximum number of passes. The more passes, the better the
code, but the slower is the assembly.
</ul>
<p>Note that this is a capital O, and is different from a small o, which is
used to specify the output format. See <a href="#section-2.1.1">section
2.1.1</a>.
<h4><a name="section-2.1.17">2.1.17 The <code><nobr>-t</nobr></code> option: Enable TASM Compatibility Mode</a></h4>
<p>NASM includes a limited form of compatibility with Borland's
<code><nobr>TASM</nobr></code>. When NASM's <code><nobr>-t</nobr></code>
option is used, the following changes are made:
<ul>
<li>local labels may be prefixed with <code><nobr>@@</nobr></code> instead
of <code><nobr>.</nobr></code>
<li>TASM-style response files beginning with <code><nobr>@</nobr></code>
may be specified on the command line. This is different from the
<code><nobr>-@resp</nobr></code> style that NASM natively supports.
<li>size override is supported within brackets. In TASM compatible mode, a
size override inside square brackets changes the size of the operand, and
not the address type of the operand as it does in NASM syntax. E.g.
<code><nobr>mov eax,[DWORD val]</nobr></code> is valid syntax in TASM
compatibility mode. Note that you lose the ability to override the default
address type for the instruction.
<li><code><nobr>%arg</nobr></code> preprocessor directive is supported
which is similar to TASM's <code><nobr>ARG</nobr></code> directive.
<li><code><nobr>%local</nobr></code> preprocessor directive
<li><code><nobr>%stacksize</nobr></code> preprocessor directive
<li>unprefixed forms of some directives supported
(<code><nobr>arg</nobr></code>, <code><nobr>elif</nobr></code>,
<code><nobr>else</nobr></code>, <code><nobr>endif</nobr></code>,
<code><nobr>if</nobr></code>, <code><nobr>ifdef</nobr></code>,
<code><nobr>ifdifi</nobr></code>, <code><nobr>ifndef</nobr></code>,
<code><nobr>include</nobr></code>, <code><nobr>local</nobr></code>)
<li>more...
</ul>
<p>For more information on the directives, see the section on TASM
Compatiblity preprocessor directives in
<a href="nasmdoc4.html#section-4.9">section 4.9</a>.
<h4><a name="section-2.1.18">2.1.18 The <code><nobr>-w</nobr></code> Option: Enable or Disable Assembly Warnings</a></h4>
<p>NASM can observe many conditions during the course of assembly which are
worth mentioning to the user, but not a sufficiently severe error to
justify NASM refusing to generate an output file. These conditions are
reported like errors, but come up with the word `warning' before the
message. Warnings do not prevent NASM from generating an output file and
returning a success status to the operating system.
<p>Some conditions are even less severe than that: they are only sometimes
worth mentioning to the user. Therefore NASM supports the
<code><nobr>-w</nobr></code> command-line option, which enables or disables
certain classes of assembly warning. Such warning classes are described by
a name, for example <code><nobr>orphan-labels</nobr></code>; you can enable
warnings of this class by the command-line option
<code><nobr>-w+orphan-labels</nobr></code> and disable it by
<code><nobr>-w-orphan-labels</nobr></code>.
<p>The suppressible warning classes are:
<ul>
<li><code><nobr>macro-params</nobr></code> covers warnings about multi-line
macros being invoked with the wrong number of parameters. This warning
class is enabled by default; see
<a href="nasmdoc4.html#section-4.3.1">section 4.3.1</a> for an example of
why you might want to disable it.
<li><code><nobr>macro-selfref</nobr></code> warns if a macro references
itself. This warning class is enabled by default.
<li><code><nobr>orphan-labels</nobr></code> covers warnings about source
lines which contain no instruction but define a label without a trailing
colon. NASM does not warn about this somewhat obscure condition by default;
see <a href="nasmdoc3.html#section-3.1">section 3.1</a> for an example of
why you might want it to.
<li><code><nobr>number-overflow</nobr></code> covers warnings about numeric
constants which don't fit in 32 bits (for example, it's easy to type one
too many Fs and produce <code><nobr>0x7ffffffff</nobr></code> by mistake).
This warning class is enabled by default.
<li><code><nobr>gnu-elf-extensions</nobr></code> warns if 8-bit or 16-bit
relocations are used in <code><nobr>-f elf</nobr></code> format. The GNU
extensions allow this. This warning class is enabled by default.
<li>In addition, warning classes may be enabled or disabled across sections
of source code with <code><nobr>[warning +warning-name]</nobr></code> or
<code><nobr>[warning -warning-name]</nobr></code>. No "user form" (without
the brackets) exists.
</ul>
<h4><a name="section-2.1.19">2.1.19 The <code><nobr>-v</nobr></code> Option: Display Version Info</a></h4>
<p>Typing <code><nobr>NASM -v</nobr></code> will display the version of
NASM which you are using, and the date on which it was compiled. This
replaces the deprecated <code><nobr>-r</nobr></code>.
<p>You will need the version number if you report a bug.
<h4><a name="section-2.1.20">2.1.20 The <code><nobr>-y</nobr></code> Option: Display Available Debug Info Formats</a></h4>
<p>Typing <code><nobr>nasm -f &lt;option&gt; -y</nobr></code> will display
a list of the available debug info formats for the given output format. The
default format is indicated by an asterisk. E.g.
<code><nobr>nasm -f obj -y</nobr></code> yields
<code><nobr>* borland</nobr></code>. (as of 0.98.35, the <em>only</em>
debug info format implemented).
<h4><a name="section-2.1.21">2.1.21 The <code><nobr>--prefix</nobr></code> and <code><nobr>--postfix</nobr></code> Options.</a></h4>
<p>The <code><nobr>--prefix</nobr></code> and
<code><nobr>--postfix</nobr></code> options prepend or append
(respectively) the given argument to all <code><nobr>global</nobr></code>
or <code><nobr>extern</nobr></code> variables. E.g.
<code><nobr>--prefix_</nobr></code> will prepend the underscore to all
global and external variables, as C sometimes (but not always) likes it.
<h4><a name="section-2.1.22">2.1.22 The <code><nobr>NASMENV</nobr></code> Environment Variable</a></h4>
<p>If you define an environment variable called
<code><nobr>NASMENV</nobr></code>, the program will interpret it as a list
of extra command-line options, which are processed before the real command
line. You can use this to define standard search directories for include
files, by putting <code><nobr>-i</nobr></code> options in the
<code><nobr>NASMENV</nobr></code> variable.
<p>The value of the variable is split up at white space, so that the value
<code><nobr>-s -ic:\nasmlib</nobr></code> will be treated as two separate
options. However, that means that the value
<code><nobr>-dNAME="my name"</nobr></code> won't do what you might want,
because it will be split at the space and the NASM command-line processing
will get confused by the two nonsensical words
<code><nobr>-dNAME="my</nobr></code> and <code><nobr>name"</nobr></code>.
<p>To get round this, NASM provides a feature whereby, if you begin the
<code><nobr>NASMENV</nobr></code> environment variable with some character
that isn't a minus sign, then NASM will treat this character as the
separator character for options. So setting the
<code><nobr>NASMENV</nobr></code> variable to the value
<code><nobr>!-s!-ic:\nasmlib</nobr></code> is equivalent to setting it to
<code><nobr>-s -ic:\nasmlib</nobr></code>, but
<code><nobr>!-dNAME="my name"</nobr></code> will work.
<p>This environment variable was previously called
<code><nobr>NASM</nobr></code>. This was changed with version 0.98.31.
<h3><a name="section-2.2">2.2 Quick Start for MASM Users</a></h3>
<p>If you're used to writing programs with MASM, or with TASM in
MASM-compatible (non-Ideal) mode, or with <code><nobr>a86</nobr></code>,
this section attempts to outline the major differences between MASM's
syntax and NASM's. If you're not already used to MASM, it's probably worth
skipping this section.
<h4><a name="section-2.2.1">2.2.1 NASM Is Case-Sensitive</a></h4>
<p>One simple difference is that NASM is case-sensitive. It makes a
difference whether you call your label <code><nobr>foo</nobr></code>,
<code><nobr>Foo</nobr></code> or <code><nobr>FOO</nobr></code>. If you're
assembling to <code><nobr>DOS</nobr></code> or
<code><nobr>OS/2</nobr></code> <code><nobr>.OBJ</nobr></code> files, you
can invoke the <code><nobr>UPPERCASE</nobr></code> directive (documented in
<a href="nasmdoc6.html#section-6.2">section 6.2</a>) to ensure that all
symbols exported to other code modules are forced to be upper case; but
even then, <em>within</em> a single module, NASM will distinguish between
labels differing only in case.
<h4><a name="section-2.2.2">2.2.2 NASM Requires Square Brackets For Memory References</a></h4>
<p>NASM was designed with simplicity of syntax in mind. One of the design
goals of NASM is that it should be possible, as far as is practical, for
the user to look at a single line of NASM code and tell what opcode is
generated by it. You can't do this in MASM: if you declare, for example,
<p><pre>
foo equ 1
bar dw 2
</pre>
<p>then the two lines of code
<p><pre>
mov ax,foo
mov ax,bar
</pre>
<p>generate completely different opcodes, despite having identical-looking
syntaxes.
<p>NASM avoids this undesirable situation by having a much simpler syntax
for memory references. The rule is simply that any access to the
<em>contents</em> of a memory location requires square brackets around the
address, and any access to the <em>address</em> of a variable doesn't. So
an instruction of the form <code><nobr>mov ax,foo</nobr></code> will
<em>always</em> refer to a compile-time constant, whether it's an
<code><nobr>EQU</nobr></code> or the address of a variable; and to access
the <em>contents</em> of the variable <code><nobr>bar</nobr></code>, you
must code <code><nobr>mov ax,[bar]</nobr></code>.
<p>This also means that NASM has no need for MASM's
<code><nobr>OFFSET</nobr></code> keyword, since the MASM code
<code><nobr>mov ax,offset bar</nobr></code> means exactly the same thing as
NASM's <code><nobr>mov ax,bar</nobr></code>. If you're trying to get large
amounts of MASM code to assemble sensibly under NASM, you can always code
<code><nobr>%idefine offset</nobr></code> to make the preprocessor treat
the <code><nobr>OFFSET</nobr></code> keyword as a no-op.
<p>This issue is even more confusing in <code><nobr>a86</nobr></code>,
where declaring a label with a trailing colon defines it to be a `label' as
opposed to a `variable' and causes <code><nobr>a86</nobr></code> to adopt
NASM-style semantics; so in <code><nobr>a86</nobr></code>,
<code><nobr>mov ax,var</nobr></code> has different behaviour depending on
whether <code><nobr>var</nobr></code> was declared as
<code><nobr>var: dw 0</nobr></code> (a label) or
<code><nobr>var dw 0</nobr></code> (a word-size variable). NASM is very
simple by comparison: <em>everything</em> is a label.
<p>NASM, in the interests of simplicity, also does not support the hybrid
syntaxes supported by MASM and its clones, such as
<code><nobr>mov ax,table[bx]</nobr></code>, where a memory reference is
denoted by one portion outside square brackets and another portion inside.
The correct syntax for the above is
<code><nobr>mov ax,[table+bx]</nobr></code>. Likewise,
<code><nobr>mov ax,es:[di]</nobr></code> is wrong and
<code><nobr>mov ax,[es:di]</nobr></code> is right.
<h4><a name="section-2.2.3">2.2.3 NASM Doesn't Store Variable Types</a></h4>
<p>NASM, by design, chooses not to remember the types of variables you
declare. Whereas MASM will remember, on seeing
<code><nobr>var dw 0</nobr></code>, that you declared
<code><nobr>var</nobr></code> as a word-size variable, and will then be
able to fill in the ambiguity in the size of the instruction
<code><nobr>mov var,2</nobr></code>, NASM will deliberately remember
nothing about the symbol <code><nobr>var</nobr></code> except where it
begins, and so you must explicitly code
<code><nobr>mov word [var],2</nobr></code>.
<p>For this reason, NASM doesn't support the
<code><nobr>LODS</nobr></code>, <code><nobr>MOVS</nobr></code>,
<code><nobr>STOS</nobr></code>, <code><nobr>SCAS</nobr></code>,
<code><nobr>CMPS</nobr></code>, <code><nobr>INS</nobr></code>, or
<code><nobr>OUTS</nobr></code> instructions, but only supports the forms
such as <code><nobr>LODSB</nobr></code>, <code><nobr>MOVSW</nobr></code>,
and <code><nobr>SCASD</nobr></code>, which explicitly specify the size of
the components of the strings being manipulated.
<h4><a name="section-2.2.4">2.2.4 NASM Doesn't <code><nobr>ASSUME</nobr></code></a></h4>
<p>As part of NASM's drive for simplicity, it also does not support the
<code><nobr>ASSUME</nobr></code> directive. NASM will not keep track of
what values you choose to put in your segment registers, and will never
<em>automatically</em> generate a segment override prefix.
<h4><a name="section-2.2.5">2.2.5 NASM Doesn't Support Memory Models</a></h4>
<p>NASM also does not have any directives to support different 16-bit
memory models. The programmer has to keep track of which functions are
supposed to be called with a far call and which with a near call, and is
responsible for putting the correct form of <code><nobr>RET</nobr></code>
instruction (<code><nobr>RETN</nobr></code> or
<code><nobr>RETF</nobr></code>; NASM accepts <code><nobr>RET</nobr></code>
itself as an alternate form for <code><nobr>RETN</nobr></code>); in
addition, the programmer is responsible for coding CALL FAR instructions
where necessary when calling <em>external</em> functions, and must also
keep track of which external variable definitions are far and which are
near.
<h4><a name="section-2.2.6">2.2.6 Floating-Point Differences</a></h4>
<p>NASM uses different names to refer to floating-point registers from
MASM: where MASM would call them <code><nobr>ST(0)</nobr></code>,
<code><nobr>ST(1)</nobr></code> and so on, and
<code><nobr>a86</nobr></code> would call them simply
<code><nobr>0</nobr></code>, <code><nobr>1</nobr></code> and so on, NASM
chooses to call them <code><nobr>st0</nobr></code>,
<code><nobr>st1</nobr></code> etc.
<p>As of version 0.96, NASM now treats the instructions with `nowait' forms
in the same way as MASM-compatible assemblers. The idiosyncratic treatment
employed by 0.95 and earlier was based on a misunderstanding by the
authors.
<h4><a name="section-2.2.7">2.2.7 Other Differences</a></h4>
<p>For historical reasons, NASM uses the keyword
<code><nobr>TWORD</nobr></code> where MASM and compatible assemblers use
<code><nobr>TBYTE</nobr></code>.
<p>NASM does not declare uninitialised storage in the same way as MASM:
where a MASM programmer might use
<code><nobr>stack db 64 dup (?)</nobr></code>, NASM requires
<code><nobr>stack resb 64</nobr></code>, intended to be read as `reserve 64
bytes'. For a limited amount of compatibility, since NASM treats
<code><nobr>?</nobr></code> as a valid character in symbol names, you can
code <code><nobr>? equ 0</nobr></code> and then writing
<code><nobr>dw ?</nobr></code> will at least do something vaguely useful.
<code><nobr>DUP</nobr></code> is still not a supported syntax, however.
<p>In addition to all of this, macros and directives work completely
differently to MASM. See <a href="nasmdoc4.html">chapter 4</a> and
<a href="nasmdoc5.html">chapter 5</a> for further details.
<p align=center><a href="nasmdoc3.html">Next Chapter</a> |
<a href="nasmdoc1.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
</body></html>

View File

@@ -0,0 +1,648 @@
<html><head><title>NASM Manual</title></head>
<body><h1 align=center>The Netwide Assembler: NASM</h1>
<p align=center><a href="nasmdoc4.html">Next Chapter</a> |
<a href="nasmdoc2.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
<h2><a name="chapter-3">Chapter 3: The NASM Language</a></h2>
<h3><a name="section-3.1">3.1 Layout of a NASM Source Line</a></h3>
<p>Like most assemblers, each NASM source line contains (unless it is a
macro, a preprocessor directive or an assembler directive: see
<a href="nasmdoc4.html">chapter 4</a> and <a href="nasmdoc5.html">chapter
5</a>) some combination of the four fields
<p><pre>
label: instruction operands ; comment
</pre>
<p>As usual, most of these fields are optional; the presence or absence of
any combination of a label, an instruction and a comment is allowed. Of
course, the operand field is either required or forbidden by the presence
and nature of the instruction field.
<p>NASM uses backslash (\) as the line continuation character; if a line
ends with backslash, the next line is considered to be a part of the
backslash-ended line.
<p>NASM places no restrictions on white space within a line: labels may
have white space before them, or instructions may have no space before
them, or anything. The colon after a label is also optional. (Note that
this means that if you intend to code <code><nobr>lodsb</nobr></code> alone
on a line, and type <code><nobr>lodab</nobr></code> by accident, then
that's still a valid source line which does nothing but define a label.
Running NASM with the command-line option
<code><nobr>-w+orphan-labels</nobr></code> will cause it to warn you if you
define a label alone on a line without a trailing colon.)
<p>Valid characters in labels are letters, numbers,
<code><nobr>_</nobr></code>, <code><nobr>$</nobr></code>,
<code><nobr>#</nobr></code>, <code><nobr>@</nobr></code>,
<code><nobr>~</nobr></code>, <code><nobr>.</nobr></code>, and
<code><nobr>?</nobr></code>. The only characters which may be used as the
<em>first</em> character of an identifier are letters,
<code><nobr>.</nobr></code> (with special meaning: see
<a href="#section-3.9">section 3.9</a>), <code><nobr>_</nobr></code> and
<code><nobr>?</nobr></code>. An identifier may also be prefixed with a
<code><nobr>$</nobr></code> to indicate that it is intended to be read as
an identifier and not a reserved word; thus, if some other module you are
linking with defines a symbol called <code><nobr>eax</nobr></code>, you can
refer to <code><nobr>$eax</nobr></code> in NASM code to distinguish the
symbol from the register.
<p>The instruction field may contain any machine instruction: Pentium and
P6 instructions, FPU instructions, MMX instructions and even undocumented
instructions are all supported. The instruction may be prefixed by
<code><nobr>LOCK</nobr></code>, <code><nobr>REP</nobr></code>,
<code><nobr>REPE</nobr></code>/<code><nobr>REPZ</nobr></code> or
<code><nobr>REPNE</nobr></code>/<code><nobr>REPNZ</nobr></code>, in the
usual way. Explicit address-size and operand-size prefixes
<code><nobr>A16</nobr></code>, <code><nobr>A32</nobr></code>,
<code><nobr>O16</nobr></code> and <code><nobr>O32</nobr></code> are
provided - one example of their use is given in
<a href="nasmdoc9.html">chapter 9</a>. You can also use the name of a
segment register as an instruction prefix: coding
<code><nobr>es mov [bx],ax</nobr></code> is equivalent to coding
<code><nobr>mov [es:bx],ax</nobr></code>. We recommend the latter syntax,
since it is consistent with other syntactic features of the language, but
for instructions such as <code><nobr>LODSB</nobr></code>, which has no
operands and yet can require a segment override, there is no clean
syntactic way to proceed apart from <code><nobr>es lodsb</nobr></code>.
<p>An instruction is not required to use a prefix: prefixes such as
<code><nobr>CS</nobr></code>, <code><nobr>A32</nobr></code>,
<code><nobr>LOCK</nobr></code> or <code><nobr>REPE</nobr></code> can appear
on a line by themselves, and NASM will just generate the prefix bytes.
<p>In addition to actual machine instructions, NASM also supports a number
of pseudo-instructions, described in <a href="#section-3.2">section
3.2</a>.
<p>Instruction operands may take a number of forms: they can be registers,
described simply by the register name (e.g. <code><nobr>ax</nobr></code>,
<code><nobr>bp</nobr></code>, <code><nobr>ebx</nobr></code>,
<code><nobr>cr0</nobr></code>: NASM does not use the
<code><nobr>gas</nobr></code>-style syntax in which register names must be
prefixed by a <code><nobr>%</nobr></code> sign), or they can be effective
addresses (see <a href="#section-3.3">section 3.3</a>), constants
(<a href="#section-3.4">section 3.4</a>) or expressions
(<a href="#section-3.5">section 3.5</a>).
<p>For floating-point instructions, NASM accepts a wide range of syntaxes:
you can use two-operand forms like MASM supports, or you can use NASM's
native single-operand forms in most cases. Details of all forms of each
supported instruction are given in <a href="nasmdocb.html">appendix B</a>.
For example, you can code:
<p><pre>
fadd st1 ; this sets st0 := st0 + st1
fadd st0,st1 ; so does this
fadd st1,st0 ; this sets st1 := st1 + st0
fadd to st1 ; so does this
</pre>
<p>Almost any floating-point instruction that references memory must use
one of the prefixes <code><nobr>DWORD</nobr></code>,
<code><nobr>QWORD</nobr></code> or <code><nobr>TWORD</nobr></code> to
indicate what size of memory operand it refers to.
<h3><a name="section-3.2">3.2 Pseudo-Instructions</a></h3>
<p>Pseudo-instructions are things which, though not real x86 machine
instructions, are used in the instruction field anyway because that's the
most convenient place to put them. The current pseudo-instructions are
<code><nobr>DB</nobr></code>, <code><nobr>DW</nobr></code>,
<code><nobr>DD</nobr></code>, <code><nobr>DQ</nobr></code> and
<code><nobr>DT</nobr></code>, their uninitialised counterparts
<code><nobr>RESB</nobr></code>, <code><nobr>RESW</nobr></code>,
<code><nobr>RESD</nobr></code>, <code><nobr>RESQ</nobr></code> and
<code><nobr>REST</nobr></code>, the <code><nobr>INCBIN</nobr></code>
command, the <code><nobr>EQU</nobr></code> command, and the
<code><nobr>TIMES</nobr></code> prefix.
<h4><a name="section-3.2.1">3.2.1 <code><nobr>DB</nobr></code> and friends: Declaring Initialised Data</a></h4>
<p><code><nobr>DB</nobr></code>, <code><nobr>DW</nobr></code>,
<code><nobr>DD</nobr></code>, <code><nobr>DQ</nobr></code> and
<code><nobr>DT</nobr></code> are used, much as in MASM, to declare
initialised data in the output file. They can be invoked in a wide range of
ways:
<p><pre>
db 0x55 ; just the byte 0x55
db 0x55,0x56,0x57 ; three bytes in succession
db 'a',0x55 ; character constants are OK
db 'hello',13,10,'$' ; so are string constants
dw 0x1234 ; 0x34 0x12
dw 'a' ; 0x61 0x00 (it's just a number)
dw 'ab' ; 0x61 0x62 (character constant)
dw 'abc' ; 0x61 0x62 0x63 0x00 (string)
dd 0x12345678 ; 0x78 0x56 0x34 0x12
dd 1.234567e20 ; floating-point constant
dq 1.234567e20 ; double-precision float
dt 1.234567e20 ; extended-precision float
</pre>
<p><code><nobr>DQ</nobr></code> and <code><nobr>DT</nobr></code> do not
accept numeric constants or string constants as operands.
<h4><a name="section-3.2.2">3.2.2 <code><nobr>RESB</nobr></code> and friends: Declaring Uninitialised Data</a></h4>
<p><code><nobr>RESB</nobr></code>, <code><nobr>RESW</nobr></code>,
<code><nobr>RESD</nobr></code>, <code><nobr>RESQ</nobr></code> and
<code><nobr>REST</nobr></code> are designed to be used in the BSS section
of a module: they declare <em>uninitialised</em> storage space. Each takes
a single operand, which is the number of bytes, words, doublewords or
whatever to reserve. As stated in
<a href="nasmdoc2.html#section-2.2.7">section 2.2.7</a>, NASM does not
support the MASM/TASM syntax of reserving uninitialised space by writing
<code><nobr>DW ?</nobr></code> or similar things: this is what it does
instead. The operand to a <code><nobr>RESB</nobr></code>-type
pseudo-instruction is a <em>critical expression</em>: see
<a href="#section-3.8">section 3.8</a>.
<p>For example:
<p><pre>
buffer: resb 64 ; reserve 64 bytes
wordvar: resw 1 ; reserve a word
realarray resq 10 ; array of ten reals
</pre>
<h4><a name="section-3.2.3">3.2.3 <code><nobr>INCBIN</nobr></code>: Including External Binary Files</a></h4>
<p><code><nobr>INCBIN</nobr></code> is borrowed from the old Amiga
assembler DevPac: it includes a binary file verbatim into the output file.
This can be handy for (for example) including graphics and sound data
directly into a game executable file. It can be called in one of these
three ways:
<p><pre>
incbin "file.dat" ; include the whole file
incbin "file.dat",1024 ; skip the first 1024 bytes
incbin "file.dat",1024,512 ; skip the first 1024, and
; actually include at most 512
</pre>
<h4><a name="section-3.2.4">3.2.4 <code><nobr>EQU</nobr></code>: Defining Constants</a></h4>
<p><code><nobr>EQU</nobr></code> defines a symbol to a given constant
value: when <code><nobr>EQU</nobr></code> is used, the source line must
contain a label. The action of <code><nobr>EQU</nobr></code> is to define
the given label name to the value of its (only) operand. This definition is
absolute, and cannot change later. So, for example,
<p><pre>
message db 'hello, world'
msglen equ $-message
</pre>
<p>defines <code><nobr>msglen</nobr></code> to be the constant 12.
<code><nobr>msglen</nobr></code> may not then be redefined later. This is
not a preprocessor definition either: the value of
<code><nobr>msglen</nobr></code> is evaluated <em>once</em>, using the
value of <code><nobr>$</nobr></code> (see <a href="#section-3.5">section
3.5</a> for an explanation of <code><nobr>$</nobr></code>) at the point of
definition, rather than being evaluated wherever it is referenced and using
the value of <code><nobr>$</nobr></code> at the point of reference. Note
that the operand to an <code><nobr>EQU</nobr></code> is also a critical
expression (<a href="#section-3.8">section 3.8</a>).
<h4><a name="section-3.2.5">3.2.5 <code><nobr>TIMES</nobr></code>: Repeating Instructions or Data</a></h4>
<p>The <code><nobr>TIMES</nobr></code> prefix causes the instruction to be
assembled multiple times. This is partly present as NASM's equivalent of
the <code><nobr>DUP</nobr></code> syntax supported by MASM-compatible
assemblers, in that you can code
<p><pre>
zerobuf: times 64 db 0
</pre>
<p>or similar things; but <code><nobr>TIMES</nobr></code> is more versatile
than that. The argument to <code><nobr>TIMES</nobr></code> is not just a
numeric constant, but a numeric <em>expression</em>, so you can do things
like
<p><pre>
buffer: db 'hello, world'
times 64-$+buffer db ' '
</pre>
<p>which will store exactly enough spaces to make the total length of
<code><nobr>buffer</nobr></code> up to 64. Finally,
<code><nobr>TIMES</nobr></code> can be applied to ordinary instructions, so
you can code trivial unrolled loops in it:
<p><pre>
times 100 movsb
</pre>
<p>Note that there is no effective difference between
<code><nobr>times 100 resb 1</nobr></code> and
<code><nobr>resb 100</nobr></code>, except that the latter will be
assembled about 100 times faster due to the internal structure of the
assembler.
<p>The operand to <code><nobr>TIMES</nobr></code>, like that of
<code><nobr>EQU</nobr></code> and those of <code><nobr>RESB</nobr></code>
and friends, is a critical expression (<a href="#section-3.8">section
3.8</a>).
<p>Note also that <code><nobr>TIMES</nobr></code> can't be applied to
macros: the reason for this is that <code><nobr>TIMES</nobr></code> is
processed after the macro phase, which allows the argument to
<code><nobr>TIMES</nobr></code> to contain expressions such as
<code><nobr>64-$+buffer</nobr></code> as above. To repeat more than one
line of code, or a complex macro, use the preprocessor
<code><nobr>%rep</nobr></code> directive.
<h3><a name="section-3.3">3.3 Effective Addresses</a></h3>
<p>An effective address is any operand to an instruction which references
memory. Effective addresses, in NASM, have a very simple syntax: they
consist of an expression evaluating to the desired address, enclosed in
square brackets. For example:
<p><pre>
wordvar dw 123
mov ax,[wordvar]
mov ax,[wordvar+1]
mov ax,[es:wordvar+bx]
</pre>
<p>Anything not conforming to this simple system is not a valid memory
reference in NASM, for example <code><nobr>es:wordvar[bx]</nobr></code>.
<p>More complicated effective addresses, such as those involving more than
one register, work in exactly the same way:
<p><pre>
mov eax,[ebx*2+ecx+offset]
mov ax,[bp+di+8]
</pre>
<p>NASM is capable of doing algebra on these effective addresses, so that
things which don't necessarily <em>look</em> legal are perfectly all right:
<p><pre>
mov eax,[ebx*5] ; assembles as [ebx*4+ebx]
mov eax,[label1*2-label2] ; ie [label1+(label1-label2)]
</pre>
<p>Some forms of effective address have more than one assembled form; in
most such cases NASM will generate the smallest form it can. For example,
there are distinct assembled forms for the 32-bit effective addresses
<code><nobr>[eax*2+0]</nobr></code> and
<code><nobr>[eax+eax]</nobr></code>, and NASM will generally generate the
latter on the grounds that the former requires four bytes to store a zero
offset.
<p>NASM has a hinting mechanism which will cause
<code><nobr>[eax+ebx]</nobr></code> and <code><nobr>[ebx+eax]</nobr></code>
to generate different opcodes; this is occasionally useful because
<code><nobr>[esi+ebp]</nobr></code> and <code><nobr>[ebp+esi]</nobr></code>
have different default segment registers.
<p>However, you can force NASM to generate an effective address in a
particular form by the use of the keywords <code><nobr>BYTE</nobr></code>,
<code><nobr>WORD</nobr></code>, <code><nobr>DWORD</nobr></code> and
<code><nobr>NOSPLIT</nobr></code>. If you need
<code><nobr>[eax+3]</nobr></code> to be assembled using a double-word
offset field instead of the one byte NASM will normally generate, you can
code <code><nobr>[dword eax+3]</nobr></code>. Similarly, you can force NASM
to use a byte offset for a small value which it hasn't seen on the first
pass (see <a href="#section-3.8">section 3.8</a> for an example of such a
code fragment) by using <code><nobr>[byte eax+offset]</nobr></code>. As
special cases, <code><nobr>[byte eax]</nobr></code> will code
<code><nobr>[eax+0]</nobr></code> with a byte offset of zero, and
<code><nobr>[dword eax]</nobr></code> will code it with a double-word
offset of zero. The normal form, <code><nobr>[eax]</nobr></code>, will be
coded with no offset field.
<p>The form described in the previous paragraph is also useful if you are
trying to access data in a 32-bit segment from within 16 bit code. For more
information on this see the section on mixed-size addressing
(<a href="nasmdoc9.html#section-9.2">section 9.2</a>). In particular, if
you need to access data with a known offset that is larger than will fit in
a 16-bit value, if you don't specify that it is a dword offset, nasm will
cause the high word of the offset to be lost.
<p>Similarly, NASM will split <code><nobr>[eax*2]</nobr></code> into
<code><nobr>[eax+eax]</nobr></code> because that allows the offset field to
be absent and space to be saved; in fact, it will also split
<code><nobr>[eax*2+offset]</nobr></code> into
<code><nobr>[eax+eax+offset]</nobr></code>. You can combat this behaviour
by the use of the <code><nobr>NOSPLIT</nobr></code> keyword:
<code><nobr>[nosplit eax*2]</nobr></code> will force
<code><nobr>[eax*2+0]</nobr></code> to be generated literally.
<h3><a name="section-3.4">3.4 Constants</a></h3>
<p>NASM understands four different types of constant: numeric, character,
string and floating-point.
<h4><a name="section-3.4.1">3.4.1 Numeric Constants</a></h4>
<p>A numeric constant is simply a number. NASM allows you to specify
numbers in a variety of number bases, in a variety of ways: you can suffix
<code><nobr>H</nobr></code>, <code><nobr>Q</nobr></code> or
<code><nobr>O</nobr></code>, and <code><nobr>B</nobr></code> for hex, octal
and binary, or you can prefix <code><nobr>0x</nobr></code> for hex in the
style of C, or you can prefix <code><nobr>$</nobr></code> for hex in the
style of Borland Pascal. Note, though, that the <code><nobr>$</nobr></code>
prefix does double duty as a prefix on identifiers (see
<a href="#section-3.1">section 3.1</a>), so a hex number prefixed with a
<code><nobr>$</nobr></code> sign must have a digit after the
<code><nobr>$</nobr></code> rather than a letter.
<p>Some examples:
<p><pre>
mov ax,100 ; decimal
mov ax,0a2h ; hex
mov ax,$0a2 ; hex again: the 0 is required
mov ax,0xa2 ; hex yet again
mov ax,777q ; octal
mov ax,777o ; octal again
mov ax,10010011b ; binary
</pre>
<h4><a name="section-3.4.2">3.4.2 Character Constants</a></h4>
<p>A character constant consists of up to four characters enclosed in
either single or double quotes. The type of quote makes no difference to
NASM, except of course that surrounding the constant with single quotes
allows double quotes to appear within it and vice versa.
<p>A character constant with more than one character will be arranged with
little-endian order in mind: if you code
<p><pre>
mov eax,'abcd'
</pre>
<p>then the constant generated is not <code><nobr>0x61626364</nobr></code>,
but <code><nobr>0x64636261</nobr></code>, so that if you were then to store
the value into memory, it would read <code><nobr>abcd</nobr></code> rather
than <code><nobr>dcba</nobr></code>. This is also the sense of character
constants understood by the Pentium's <code><nobr>CPUID</nobr></code>
instruction (see <a href="nasmdocb.html#section-B.4.34">section
B.4.34</a>).
<h4><a name="section-3.4.3">3.4.3 String Constants</a></h4>
<p>String constants are only acceptable to some pseudo-instructions, namely
the <code><nobr>DB</nobr></code> family and
<code><nobr>INCBIN</nobr></code>.
<p>A string constant looks like a character constant, only longer. It is
treated as a concatenation of maximum-size character constants for the
conditions. So the following are equivalent:
<p><pre>
db 'hello' ; string constant
db 'h','e','l','l','o' ; equivalent character constants
</pre>
<p>And the following are also equivalent:
<p><pre>
dd 'ninechars' ; doubleword string constant
dd 'nine','char','s' ; becomes three doublewords
db 'ninechars',0,0,0 ; and really looks like this
</pre>
<p>Note that when used as an operand to <code><nobr>db</nobr></code>, a
constant like <code><nobr>'ab'</nobr></code> is treated as a string
constant despite being short enough to be a character constant, because
otherwise <code><nobr>db 'ab'</nobr></code> would have the same effect as
<code><nobr>db 'a'</nobr></code>, which would be silly. Similarly,
three-character or four-character constants are treated as strings when
they are operands to <code><nobr>dw</nobr></code>.
<h4><a name="section-3.4.4">3.4.4 Floating-Point Constants</a></h4>
<p>Floating-point constants are acceptable only as arguments to
<code><nobr>DD</nobr></code>, <code><nobr>DQ</nobr></code> and
<code><nobr>DT</nobr></code>. They are expressed in the traditional form:
digits, then a period, then optionally more digits, then optionally an
<code><nobr>E</nobr></code> followed by an exponent. The period is
mandatory, so that NASM can distinguish between
<code><nobr>dd 1</nobr></code>, which declares an integer constant, and
<code><nobr>dd 1.0</nobr></code> which declares a floating-point constant.
<p>Some examples:
<p><pre>
dd 1.2 ; an easy one
dq 1.e10 ; 10,000,000,000
dq 1.e+10 ; synonymous with 1.e10
dq 1.e-10 ; 0.000 000 000 1
dt 3.141592653589793238462 ; pi
</pre>
<p>NASM cannot do compile-time arithmetic on floating-point constants. This
is because NASM is designed to be portable - although it always generates
code to run on x86 processors, the assembler itself can run on any system
with an ANSI C compiler. Therefore, the assembler cannot guarantee the
presence of a floating-point unit capable of handling the Intel number
formats, and so for NASM to be able to do floating arithmetic it would have
to include its own complete set of floating-point routines, which would
significantly increase the size of the assembler for very little benefit.
<h3><a name="section-3.5">3.5 Expressions</a></h3>
<p>Expressions in NASM are similar in syntax to those in C.
<p>NASM does not guarantee the size of the integers used to evaluate
expressions at compile time: since NASM can compile and run on 64-bit
systems quite happily, don't assume that expressions are evaluated in
32-bit registers and so try to make deliberate use of integer overflow. It
might not always work. The only thing NASM will guarantee is what's
guaranteed by ANSI C: you always have <em>at least</em> 32 bits to work in.
<p>NASM supports two special tokens in expressions, allowing calculations
to involve the current assembly position: the <code><nobr>$</nobr></code>
and <code><nobr>$$</nobr></code> tokens. <code><nobr>$</nobr></code>
evaluates to the assembly position at the beginning of the line containing
the expression; so you can code an infinite loop using
<code><nobr>JMP $</nobr></code>. <code><nobr>$$</nobr></code> evaluates to
the beginning of the current section; so you can tell how far into the
section you are by using <code><nobr>($-$$)</nobr></code>.
<p>The arithmetic operators provided by NASM are listed here, in increasing
order of precedence.
<h4><a name="section-3.5.1">3.5.1 <code><nobr>|</nobr></code>: Bitwise OR Operator</a></h4>
<p>The <code><nobr>|</nobr></code> operator gives a bitwise OR, exactly as
performed by the <code><nobr>OR</nobr></code> machine instruction. Bitwise
OR is the lowest-priority arithmetic operator supported by NASM.
<h4><a name="section-3.5.2">3.5.2 <code><nobr>^</nobr></code>: Bitwise XOR Operator</a></h4>
<p><code><nobr>^</nobr></code> provides the bitwise XOR operation.
<h4><a name="section-3.5.3">3.5.3 <code><nobr>&amp;</nobr></code>: Bitwise AND Operator</a></h4>
<p><code><nobr>&amp;</nobr></code> provides the bitwise AND operation.
<h4><a name="section-3.5.4">3.5.4 <code><nobr>&lt;&lt;</nobr></code> and <code><nobr>&gt;&gt;</nobr></code>: Bit Shift Operators</a></h4>
<p><code><nobr>&lt;&lt;</nobr></code> gives a bit-shift to the left, just
as it does in C. So <code><nobr>5&lt;&lt;3</nobr></code> evaluates to 5
times 8, or 40. <code><nobr>&gt;&gt;</nobr></code> gives a bit-shift to the
right; in NASM, such a shift is <em>always</em> unsigned, so that the bits
shifted in from the left-hand end are filled with zero rather than a
sign-extension of the previous highest bit.
<h4><a name="section-3.5.5">3.5.5 <code><nobr>+</nobr></code> and <code><nobr>-</nobr></code>: Addition and Subtraction Operators</a></h4>
<p>The <code><nobr>+</nobr></code> and <code><nobr>-</nobr></code>
operators do perfectly ordinary addition and subtraction.
<h4><a name="section-3.5.6">3.5.6 <code><nobr>*</nobr></code>, <code><nobr>/</nobr></code>, <code><nobr>//</nobr></code>, <code><nobr>%</nobr></code> and <code><nobr>%%</nobr></code>: Multiplication and Division</a></h4>
<p><code><nobr>*</nobr></code> is the multiplication operator.
<code><nobr>/</nobr></code> and <code><nobr>//</nobr></code> are both
division operators: <code><nobr>/</nobr></code> is unsigned division and
<code><nobr>//</nobr></code> is signed division. Similarly,
<code><nobr>%</nobr></code> and <code><nobr>%%</nobr></code> provide
unsigned and signed modulo operators respectively.
<p>NASM, like ANSI C, provides no guarantees about the sensible operation
of the signed modulo operator.
<p>Since the <code><nobr>%</nobr></code> character is used extensively by
the macro preprocessor, you should ensure that both the signed and unsigned
modulo operators are followed by white space wherever they appear.
<h4><a name="section-3.5.7">3.5.7 Unary Operators: <code><nobr>+</nobr></code>, <code><nobr>-</nobr></code>, <code><nobr>~</nobr></code> and <code><nobr>SEG</nobr></code></a></h4>
<p>The highest-priority operators in NASM's expression grammar are those
which only apply to one argument. <code><nobr>-</nobr></code> negates its
operand, <code><nobr>+</nobr></code> does nothing (it's provided for
symmetry with <code><nobr>-</nobr></code>), <code><nobr>~</nobr></code>
computes the one's complement of its operand, and
<code><nobr>SEG</nobr></code> provides the segment address of its operand
(explained in more detail in <a href="#section-3.6">section 3.6</a>).
<h3><a name="section-3.6">3.6 <code><nobr>SEG</nobr></code> and <code><nobr>WRT</nobr></code></a></h3>
<p>When writing large 16-bit programs, which must be split into multiple
segments, it is often necessary to be able to refer to the segment part of
the address of a symbol. NASM supports the <code><nobr>SEG</nobr></code>
operator to perform this function.
<p>The <code><nobr>SEG</nobr></code> operator returns the
<em>preferred</em> segment base of a symbol, defined as the segment base
relative to which the offset of the symbol makes sense. So the code
<p><pre>
mov ax,seg symbol
mov es,ax
mov bx,symbol
</pre>
<p>will load <code><nobr>ES:BX</nobr></code> with a valid pointer to the
symbol <code><nobr>symbol</nobr></code>.
<p>Things can be more complex than this: since 16-bit segments and groups
may overlap, you might occasionally want to refer to some symbol using a
different segment base from the preferred one. NASM lets you do this, by
the use of the <code><nobr>WRT</nobr></code> (With Reference To) keyword.
So you can do things like
<p><pre>
mov ax,weird_seg ; weird_seg is a segment base
mov es,ax
mov bx,symbol wrt weird_seg
</pre>
<p>to load <code><nobr>ES:BX</nobr></code> with a different, but
functionally equivalent, pointer to the symbol
<code><nobr>symbol</nobr></code>.
<p>NASM supports far (inter-segment) calls and jumps by means of the syntax
<code><nobr>call segment:offset</nobr></code>, where
<code><nobr>segment</nobr></code> and <code><nobr>offset</nobr></code> both
represent immediate values. So to call a far procedure, you could code
either of
<p><pre>
call (seg procedure):procedure
call weird_seg:(procedure wrt weird_seg)
</pre>
<p>(The parentheses are included for clarity, to show the intended parsing
of the above instructions. They are not necessary in practice.)
<p>NASM supports the syntax <code><nobr>call far procedure</nobr></code> as
a synonym for the first of the above usages. <code><nobr>JMP</nobr></code>
works identically to <code><nobr>CALL</nobr></code> in these examples.
<p>To declare a far pointer to a data item in a data segment, you must code
<p><pre>
dw symbol, seg symbol
</pre>
<p>NASM supports no convenient synonym for this, though you can always
invent one using the macro processor.
<h3><a name="section-3.7">3.7 <code><nobr>STRICT</nobr></code>: Inhibiting Optimization</a></h3>
<p>When assembling with the optimizer set to level 2 or higher (see
<a href="nasmdoc2.html#section-2.1.16">section 2.1.16</a>), NASM will use
size specifiers (<code><nobr>BYTE</nobr></code>,
<code><nobr>WORD</nobr></code>, <code><nobr>DWORD</nobr></code>,
<code><nobr>QWORD</nobr></code>, or <code><nobr>TWORD</nobr></code>), but
will give them the smallest possible size. The keyword
<code><nobr>STRICT</nobr></code> can be used to inhibit optimization and
force a particular operand to be emitted in the specified size. For
example, with the optimizer on, and in <code><nobr>BITS 16</nobr></code>
mode,
<p><pre>
push dword 33
</pre>
<p>is encoded in three bytes <code><nobr>66 6A 21</nobr></code>, whereas
<p><pre>
push strict dword 33
</pre>
<p>is encoded in six bytes, with a full dword immediate operand
<code><nobr>66 68 21 00 00 00</nobr></code>.
<p>With the optimizer off, the same code (six bytes) is generated whether
the <code><nobr>STRICT</nobr></code> keyword was used or not.
<h3><a name="section-3.8">3.8 Critical Expressions</a></h3>
<p>A limitation of NASM is that it is a two-pass assembler; unlike TASM and
others, it will always do exactly two assembly passes. Therefore it is
unable to cope with source files that are complex enough to require three
or more passes.
<p>The first pass is used to determine the size of all the assembled code
and data, so that the second pass, when generating all the code, knows all
the symbol addresses the code refers to. So one thing NASM can't handle is
code whose size depends on the value of a symbol declared after the code in
question. For example,
<p><pre>
times (label-$) db 0
label: db 'Where am I?'
</pre>
<p>The argument to <code><nobr>TIMES</nobr></code> in this case could
equally legally evaluate to anything at all; NASM will reject this example
because it cannot tell the size of the <code><nobr>TIMES</nobr></code> line
when it first sees it. It will just as firmly reject the slightly
paradoxical code
<p><pre>
times (label-$+1) db 0
label: db 'NOW where am I?'
</pre>
<p>in which <em>any</em> value for the <code><nobr>TIMES</nobr></code>
argument is by definition wrong!
<p>NASM rejects these examples by means of a concept called a <em>critical
expression</em>, which is defined to be an expression whose value is
required to be computable in the first pass, and which must therefore
depend only on symbols defined before it. The argument to the
<code><nobr>TIMES</nobr></code> prefix is a critical expression; for the
same reason, the arguments to the <code><nobr>RESB</nobr></code> family of
pseudo-instructions are also critical expressions.
<p>Critical expressions can crop up in other contexts as well: consider the
following code.
<p><pre>
mov ax,symbol1
symbol1 equ symbol2
symbol2:
</pre>
<p>On the first pass, NASM cannot determine the value of
<code><nobr>symbol1</nobr></code>, because
<code><nobr>symbol1</nobr></code> is defined to be equal to
<code><nobr>symbol2</nobr></code> which NASM hasn't seen yet. On the second
pass, therefore, when it encounters the line
<code><nobr>mov ax,symbol1</nobr></code>, it is unable to generate the code
for it because it still doesn't know the value of
<code><nobr>symbol1</nobr></code>. On the next line, it would see the
<code><nobr>EQU</nobr></code> again and be able to determine the value of
<code><nobr>symbol1</nobr></code>, but by then it would be too late.
<p>NASM avoids this problem by defining the right-hand side of an
<code><nobr>EQU</nobr></code> statement to be a critical expression, so the
definition of <code><nobr>symbol1</nobr></code> would be rejected in the
first pass.
<p>There is a related issue involving forward references: consider this
code fragment.
<p><pre>
mov eax,[ebx+offset]
offset equ 10
</pre>
<p>NASM, on pass one, must calculate the size of the instruction
<code><nobr>mov eax,[ebx+offset]</nobr></code> without knowing the value of
<code><nobr>offset</nobr></code>. It has no way of knowing that
<code><nobr>offset</nobr></code> is small enough to fit into a one-byte
offset field and that it could therefore get away with generating a shorter
form of the effective-address encoding; for all it knows, in pass one,
<code><nobr>offset</nobr></code> could be a symbol in the code segment, and
it might need the full four-byte form. So it is forced to compute the size
of the instruction to accommodate a four-byte address part. In pass two,
having made this decision, it is now forced to honour it and keep the
instruction large, so the code generated in this case is not as small as it
could have been. This problem can be solved by defining
<code><nobr>offset</nobr></code> before using it, or by forcing byte size
in the effective address by coding
<code><nobr>[byte ebx+offset]</nobr></code>.
<p>Note that use of the <code><nobr>-On</nobr></code> switch (with n&gt;=2)
makes some of the above no longer true (see
<a href="nasmdoc2.html#section-2.1.16">section 2.1.16</a>).
<h3><a name="section-3.9">3.9 Local Labels</a></h3>
<p>NASM gives special treatment to symbols beginning with a period. A label
beginning with a single period is treated as a <em>local</em> label, which
means that it is associated with the previous non-local label. So, for
example:
<p><pre>
label1 ; some code
.loop
; some more code
jne .loop
ret
label2 ; some code
.loop
; some more code
jne .loop
ret
</pre>
<p>In the above code fragment, each <code><nobr>JNE</nobr></code>
instruction jumps to the line immediately before it, because the two
definitions of <code><nobr>.loop</nobr></code> are kept separate by virtue
of each being associated with the previous non-local label.
<p>This form of local label handling is borrowed from the old Amiga
assembler DevPac; however, NASM goes one step further, in allowing access
to local labels from other parts of the code. This is achieved by means of
<em>defining</em> a local label in terms of the previous non-local label:
the first definition of <code><nobr>.loop</nobr></code> above is really
defining a symbol called <code><nobr>label1.loop</nobr></code>, and the
second defines a symbol called <code><nobr>label2.loop</nobr></code>. So,
if you really needed to, you could write
<p><pre>
label3 ; some more code
; and some more
jmp label1.loop
</pre>
<p>Sometimes it is useful - in a macro, for instance - to be able to define
a label which can be referenced from anywhere but which doesn't interfere
with the normal local-label mechanism. Such a label can't be non-local
because it would interfere with subsequent definitions of, and references
to, local labels; and it can't be local because the macro that defined it
wouldn't know the label's full name. NASM therefore introduces a third type
of label, which is probably only useful in macro definitions: if a label
begins with the special prefix <code><nobr>..@</nobr></code>, then it does
nothing to the local label mechanism. So you could code
<p><pre>
label1: ; a non-local label
.local: ; this is really label1.local
..@foo: ; this is a special symbol
label2: ; another non-local label
.local: ; this is really label2.local
jmp ..@foo ; this will jump three lines up
</pre>
<p>NASM has the capacity to define other special symbols beginning with a
double period: for example, <code><nobr>..start</nobr></code> is used to
specify the entry point in the <code><nobr>obj</nobr></code> output format
(see <a href="nasmdoc6.html#section-6.2.6">section 6.2.6</a>).
<p align=center><a href="nasmdoc4.html">Next Chapter</a> |
<a href="nasmdoc2.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
</body></html>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,309 @@
<html><head><title>NASM Manual</title></head>
<body><h1 align=center>The Netwide Assembler: NASM</h1>
<p align=center><a href="nasmdoc6.html">Next Chapter</a> |
<a href="nasmdoc4.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
<h2><a name="chapter-5">Chapter 5: Assembler Directives</a></h2>
<p>NASM, though it attempts to avoid the bureaucracy of assemblers like
MASM and TASM, is nevertheless forced to support a <em>few</em> directives.
These are described in this chapter.
<p>NASM's directives come in two types: <em>user-level</em> directives and
<em>primitive</em> directives. Typically, each directive has a user-level
form and a primitive form. In almost all cases, we recommend that users use
the user-level forms of the directives, which are implemented as macros
which call the primitive forms.
<p>Primitive directives are enclosed in square brackets; user-level
directives are not.
<p>In addition to the universal directives described in this chapter, each
object file format can optionally supply extra directives in order to
control particular features of that file format. These
<em>format-specific</em> directives are documented along with the formats
that implement them, in <a href="nasmdoc6.html">chapter 6</a>.
<h3><a name="section-5.1">5.1 <code><nobr>BITS</nobr></code>: Specifying Target Processor Mode</a></h3>
<p>The <code><nobr>BITS</nobr></code> directive specifies whether NASM
should generate code designed to run on a processor operating in 16-bit
mode, or code designed to run on a processor operating in 32-bit mode. The
syntax is <code><nobr>BITS 16</nobr></code> or
<code><nobr>BITS 32</nobr></code>.
<p>In most cases, you should not need to use <code><nobr>BITS</nobr></code>
explicitly. The <code><nobr>aout</nobr></code>,
<code><nobr>coff</nobr></code>, <code><nobr>elf</nobr></code> and
<code><nobr>win32</nobr></code> object formats, which are designed for use
in 32-bit operating systems, all cause NASM to select 32-bit mode by
default. The <code><nobr>obj</nobr></code> object format allows you to
specify each segment you define as either <code><nobr>USE16</nobr></code>
or <code><nobr>USE32</nobr></code>, and NASM will set its operating mode
accordingly, so the use of the <code><nobr>BITS</nobr></code> directive is
once again unnecessary.
<p>The most likely reason for using the <code><nobr>BITS</nobr></code>
directive is to write 32-bit code in a flat binary file; this is because
the <code><nobr>bin</nobr></code> output format defaults to 16-bit mode in
anticipation of it being used most frequently to write DOS
<code><nobr>.COM</nobr></code> programs, DOS <code><nobr>.SYS</nobr></code>
device drivers and boot loader software.
<p>You do <em>not</em> need to specify <code><nobr>BITS 32</nobr></code>
merely in order to use 32-bit instructions in a 16-bit DOS program; if you
do, the assembler will generate incorrect code because it will be writing
code targeted at a 32-bit platform, to be run on a 16-bit one.
<p>When NASM is in <code><nobr>BITS 16</nobr></code> state, instructions
which use 32-bit data are prefixed with an 0x66 byte, and those referring
to 32-bit addresses have an 0x67 prefix. In
<code><nobr>BITS 32</nobr></code> state, the reverse is true: 32-bit
instructions require no prefixes, whereas instructions using 16-bit data
need an 0x66 and those working on 16-bit addresses need an 0x67.
<p>The <code><nobr>BITS</nobr></code> directive has an exactly equivalent
primitive form, <code><nobr>[BITS 16]</nobr></code> and
<code><nobr>[BITS 32]</nobr></code>. The user-level form is a macro which
has no function other than to call the primitive form.
<p>Note that the space is neccessary, <code><nobr>BITS32</nobr></code> will
<em>not</em> work!
<h4><a name="section-5.1.1">5.1.1 <code><nobr>USE16</nobr></code> &amp; <code><nobr>USE32</nobr></code>: Aliases for BITS</a></h4>
<p>The `<code><nobr>USE16</nobr></code>' and
`<code><nobr>USE32</nobr></code>' directives can be used in place of
`<code><nobr>BITS 16</nobr></code>' and
`<code><nobr>BITS 32</nobr></code>', for compatibility with other
assemblers.
<h3><a name="section-5.2">5.2 <code><nobr>SECTION</nobr></code> or <code><nobr>SEGMENT</nobr></code>: Changing and Defining Sections</a></h3>
<p>The <code><nobr>SECTION</nobr></code> directive
(<code><nobr>SEGMENT</nobr></code> is an exactly equivalent synonym)
changes which section of the output file the code you write will be
assembled into. In some object file formats, the number and names of
sections are fixed; in others, the user may make up as many as they wish.
Hence <code><nobr>SECTION</nobr></code> may sometimes give an error
message, or may define a new section, if you try to switch to a section
that does not (yet) exist.
<p>The Unix object formats, and the <code><nobr>bin</nobr></code> object
format (but see <a href="nasmdoc6.html#section-6.1.3">section 6.1.3</a>,
all support the standardised section names <code><nobr>.text</nobr></code>,
<code><nobr>.data</nobr></code> and <code><nobr>.bss</nobr></code> for the
code, data and uninitialised-data sections. The
<code><nobr>obj</nobr></code> format, by contrast, does not recognise these
section names as being special, and indeed will strip off the leading
period of any section name that has one.
<h4><a name="section-5.2.1">5.2.1 The <code><nobr>__SECT__</nobr></code> Macro</a></h4>
<p>The <code><nobr>SECTION</nobr></code> directive is unusual in that its
user-level form functions differently from its primitive form. The
primitive form, <code><nobr>[SECTION xyz]</nobr></code>, simply switches
the current target section to the one given. The user-level form,
<code><nobr>SECTION xyz</nobr></code>, however, first defines the
single-line macro <code><nobr>__SECT__</nobr></code> to be the primitive
<code><nobr>[SECTION]</nobr></code> directive which it is about to issue,
and then issues it. So the user-level directive
<p><pre>
SECTION .text
</pre>
<p>expands to the two lines
<p><pre>
%define __SECT__ [SECTION .text]
[SECTION .text]
</pre>
<p>Users may find it useful to make use of this in their own macros. For
example, the <code><nobr>writefile</nobr></code> macro defined in
<a href="nasmdoc4.html#section-4.3.3">section 4.3.3</a> can be usefully
rewritten in the following more sophisticated form:
<p><pre>
%macro writefile 2+
[section .data]
%%str: db %2
%%endstr:
__SECT__
mov dx,%%str
mov cx,%%endstr-%%str
mov bx,%1
mov ah,0x40
int 0x21
%endmacro
</pre>
<p>This form of the macro, once passed a string to output, first switches
temporarily to the data section of the file, using the primitive form of
the <code><nobr>SECTION</nobr></code> directive so as not to modify
<code><nobr>__SECT__</nobr></code>. It then declares its string in the data
section, and then invokes <code><nobr>__SECT__</nobr></code> to switch back
to <em>whichever</em> section the user was previously working in. It thus
avoids the need, in the previous version of the macro, to include a
<code><nobr>JMP</nobr></code> instruction to jump over the data, and also
does not fail if, in a complicated <code><nobr>OBJ</nobr></code> format
module, the user could potentially be assembling the code in any of several
separate code sections.
<h3><a name="section-5.3">5.3 <code><nobr>ABSOLUTE</nobr></code>: Defining Absolute Labels</a></h3>
<p>The <code><nobr>ABSOLUTE</nobr></code> directive can be thought of as an
alternative form of <code><nobr>SECTION</nobr></code>: it causes the
subsequent code to be directed at no physical section, but at the
hypothetical section starting at the given absolute address. The only
instructions you can use in this mode are the
<code><nobr>RESB</nobr></code> family.
<p><code><nobr>ABSOLUTE</nobr></code> is used as follows:
<p><pre>
absolute 0x1A
kbuf_chr resw 1
kbuf_free resw 1
kbuf resw 16
</pre>
<p>This example describes a section of the PC BIOS data area, at segment
address 0x40: the above code defines <code><nobr>kbuf_chr</nobr></code> to
be 0x1A, <code><nobr>kbuf_free</nobr></code> to be 0x1C, and
<code><nobr>kbuf</nobr></code> to be 0x1E.
<p>The user-level form of <code><nobr>ABSOLUTE</nobr></code>, like that of
<code><nobr>SECTION</nobr></code>, redefines the
<code><nobr>__SECT__</nobr></code> macro when it is invoked.
<p><code><nobr>STRUC</nobr></code> and <code><nobr>ENDSTRUC</nobr></code>
are defined as macros which use <code><nobr>ABSOLUTE</nobr></code> (and
also <code><nobr>__SECT__</nobr></code>).
<p><code><nobr>ABSOLUTE</nobr></code> doesn't have to take an absolute
constant as an argument: it can take an expression (actually, a critical
expression: see <a href="nasmdoc3.html#section-3.8">section 3.8</a>) and it
can be a value in a segment. For example, a TSR can re-use its setup code
as run-time BSS like this:
<p><pre>
org 100h ; it's a .COM program
jmp setup ; setup code comes last
; the resident part of the TSR goes here
setup:
; now write the code that installs the TSR here
absolute setup
runtimevar1 resw 1
runtimevar2 resd 20
tsr_end:
</pre>
<p>This defines some variables `on top of' the setup code, so that after
the setup has finished running, the space it took up can be re-used as data
storage for the running TSR. The symbol `tsr_end' can be used to calculate
the total size of the part of the TSR that needs to be made resident.
<h3><a name="section-5.4">5.4 <code><nobr>EXTERN</nobr></code>: Importing Symbols from Other Modules</a></h3>
<p><code><nobr>EXTERN</nobr></code> is similar to the MASM directive
<code><nobr>EXTRN</nobr></code> and the C keyword
<code><nobr>extern</nobr></code>: it is used to declare a symbol which is
not defined anywhere in the module being assembled, but is assumed to be
defined in some other module and needs to be referred to by this one. Not
every object-file format can support external variables: the
<code><nobr>bin</nobr></code> format cannot.
<p>The <code><nobr>EXTERN</nobr></code> directive takes as many arguments
as you like. Each argument is the name of a symbol:
<p><pre>
extern _printf
extern _sscanf,_fscanf
</pre>
<p>Some object-file formats provide extra features to the
<code><nobr>EXTERN</nobr></code> directive. In all cases, the extra
features are used by suffixing a colon to the symbol name followed by
object-format specific text. For example, the <code><nobr>obj</nobr></code>
format allows you to declare that the default segment base of an external
should be the group <code><nobr>dgroup</nobr></code> by means of the
directive
<p><pre>
extern _variable:wrt dgroup
</pre>
<p>The primitive form of <code><nobr>EXTERN</nobr></code> differs from the
user-level form only in that it can take only one argument at a time: the
support for multiple arguments is implemented at the preprocessor level.
<p>You can declare the same variable as <code><nobr>EXTERN</nobr></code>
more than once: NASM will quietly ignore the second and later
redeclarations. You can't declare a variable as
<code><nobr>EXTERN</nobr></code> as well as something else, though.
<h3><a name="section-5.5">5.5 <code><nobr>GLOBAL</nobr></code>: Exporting Symbols to Other Modules</a></h3>
<p><code><nobr>GLOBAL</nobr></code> is the other end of
<code><nobr>EXTERN</nobr></code>: if one module declares a symbol as
<code><nobr>EXTERN</nobr></code> and refers to it, then in order to prevent
linker errors, some other module must actually <em>define</em> the symbol
and declare it as <code><nobr>GLOBAL</nobr></code>. Some assemblers use the
name <code><nobr>PUBLIC</nobr></code> for this purpose.
<p>The <code><nobr>GLOBAL</nobr></code> directive applying to a symbol must
appear <em>before</em> the definition of the symbol.
<p><code><nobr>GLOBAL</nobr></code> uses the same syntax as
<code><nobr>EXTERN</nobr></code>, except that it must refer to symbols
which <em>are</em> defined in the same module as the
<code><nobr>GLOBAL</nobr></code> directive. For example:
<p><pre>
global _main
_main:
; some code
</pre>
<p><code><nobr>GLOBAL</nobr></code>, like <code><nobr>EXTERN</nobr></code>,
allows object formats to define private extensions by means of a colon. The
<code><nobr>elf</nobr></code> object format, for example, lets you specify
whether global data items are functions or data:
<p><pre>
global hashlookup:function, hashtable:data
</pre>
<p>Like <code><nobr>EXTERN</nobr></code>, the primitive form of
<code><nobr>GLOBAL</nobr></code> differs from the user-level form only in
that it can take only one argument at a time.
<h3><a name="section-5.6">5.6 <code><nobr>COMMON</nobr></code>: Defining Common Data Areas</a></h3>
<p>The <code><nobr>COMMON</nobr></code> directive is used to declare
<em>common variables</em>. A common variable is much like a global variable
declared in the uninitialised data section, so that
<p><pre>
common intvar 4
</pre>
<p>is similar in function to
<p><pre>
global intvar
section .bss
intvar resd 1
</pre>
<p>The difference is that if more than one module defines the same common
variable, then at link time those variables will be <em>merged</em>, and
references to <code><nobr>intvar</nobr></code> in all modules will point at
the same piece of memory.
<p>Like <code><nobr>GLOBAL</nobr></code> and
<code><nobr>EXTERN</nobr></code>, <code><nobr>COMMON</nobr></code> supports
object-format specific extensions. For example, the
<code><nobr>obj</nobr></code> format allows common variables to be NEAR or
FAR, and the <code><nobr>elf</nobr></code> format allows you to specify the
alignment requirements of a common variable:
<p><pre>
common commvar 4:near ; works in OBJ
common intarray 100:4 ; works in ELF: 4 byte aligned
</pre>
<p>Once again, like <code><nobr>EXTERN</nobr></code> and
<code><nobr>GLOBAL</nobr></code>, the primitive form of
<code><nobr>COMMON</nobr></code> differs from the user-level form only in
that it can take only one argument at a time.
<h3><a name="section-5.7">5.7 <code><nobr>CPU</nobr></code>: Defining CPU Dependencies</a></h3>
<p>The <code><nobr>CPU</nobr></code> directive restricts assembly to those
instructions which are available on the specified CPU.
<p>Options are:
<ul>
<li><code><nobr>CPU 8086</nobr></code> Assemble only 8086 instruction set
<li><code><nobr>CPU 186</nobr></code> Assemble instructions up to the 80186
instruction set
<li><code><nobr>CPU 286</nobr></code> Assemble instructions up to the 286
instruction set
<li><code><nobr>CPU 386</nobr></code> Assemble instructions up to the 386
instruction set
<li><code><nobr>CPU 486</nobr></code> 486 instruction set
<li><code><nobr>CPU 586</nobr></code> Pentium instruction set
<li><code><nobr>CPU PENTIUM</nobr></code> Same as 586
<li><code><nobr>CPU 686</nobr></code> P6 instruction set
<li><code><nobr>CPU PPRO</nobr></code> Same as 686
<li><code><nobr>CPU P2</nobr></code> Same as 686
<li><code><nobr>CPU P3</nobr></code> Pentium III (Katmai) instruction sets
<li><code><nobr>CPU KATMAI</nobr></code> Same as P3
<li><code><nobr>CPU P4</nobr></code> Pentium 4 (Willamette) instruction set
<li><code><nobr>CPU WILLAMETTE</nobr></code> Same as P4
<li><code><nobr>CPU PRESCOTT</nobr></code> Prescott instruction set
<li><code><nobr>CPU IA64</nobr></code> IA64 CPU (in x86 mode) instruction
set
</ul>
<p>All options are case insensitive. All instructions will be selected only
if they apply to the selected CPU or lower. By default, all instructions
are available.
<p align=center><a href="nasmdoc6.html">Next Chapter</a> |
<a href="nasmdoc4.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
</body></html>

View File

@@ -0,0 +1,837 @@
<html><head><title>NASM Manual</title></head>
<body><h1 align=center>The Netwide Assembler: NASM</h1>
<p align=center><a href="nasmdoc7.html">Next Chapter</a> |
<a href="nasmdoc5.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
<h2><a name="chapter-6">Chapter 6: Output Formats</a></h2>
<p>NASM is a portable assembler, designed to be able to compile on any ANSI
C-supporting platform and produce output to run on a variety of Intel x86
operating systems. For this reason, it has a large number of available
output formats, selected using the <code><nobr>-f</nobr></code> option on
the NASM command line. Each of these formats, along with its extensions to
the base NASM syntax, is detailed in this chapter.
<p>As stated in <a href="nasmdoc2.html#section-2.1.1">section 2.1.1</a>,
NASM chooses a default name for your output file based on the input file
name and the chosen output format. This will be generated by removing the
extension (<code><nobr>.asm</nobr></code>, <code><nobr>.s</nobr></code>, or
whatever you like to use) from the input file name, and substituting an
extension defined by the output format. The extensions are given with each
format below.
<h3><a name="section-6.1">6.1 <code><nobr>bin</nobr></code>: Flat-Form Binary Output</a></h3>
<p>The <code><nobr>bin</nobr></code> format does not produce object files:
it generates nothing in the output file except the code you wrote. Such
`pure binary' files are used by MS-DOS: <code><nobr>.COM</nobr></code>
executables and <code><nobr>.SYS</nobr></code> device drivers are pure
binary files. Pure binary output is also useful for operating system and
boot loader development.
<p>The <code><nobr>bin</nobr></code> format supports multiple section
names. For details of how nasm handles sections in the
<code><nobr>bin</nobr></code> format, see <a href="#section-6.1.3">section
6.1.3</a>.
<p>Using the <code><nobr>bin</nobr></code> format puts NASM by default into
16-bit mode (see <a href="nasmdoc5.html#section-5.1">section 5.1</a>). In
order to use <code><nobr>bin</nobr></code> to write 32-bit code such as an
OS kernel, you need to explicitly issue the
<code><nobr>BITS 32</nobr></code> directive.
<p><code><nobr>bin</nobr></code> has no default output file name extension:
instead, it leaves your file name as it is once the original extension has
been removed. Thus, the default is for NASM to assemble
<code><nobr>binprog.asm</nobr></code> into a binary file called
<code><nobr>binprog</nobr></code>.
<h4><a name="section-6.1.1">6.1.1 <code><nobr>ORG</nobr></code>: Binary File Program Origin</a></h4>
<p>The <code><nobr>bin</nobr></code> format provides an additional
directive to the list given in <a href="nasmdoc5.html">chapter 5</a>:
<code><nobr>ORG</nobr></code>. The function of the
<code><nobr>ORG</nobr></code> directive is to specify the origin address
which NASM will assume the program begins at when it is loaded into memory.
<p>For example, the following code will generate the longword
<code><nobr>0x00000104</nobr></code>:
<p><pre>
org 0x100
dd label
label:
</pre>
<p>Unlike the <code><nobr>ORG</nobr></code> directive provided by
MASM-compatible assemblers, which allows you to jump around in the object
file and overwrite code you have already generated, NASM's
<code><nobr>ORG</nobr></code> does exactly what the directive says:
<em>origin</em>. Its sole function is to specify one offset which is added
to all internal address references within the section; it does not permit
any of the trickery that MASM's version does. See
<a href="nasmdo10.html#section-10.1.3">section 10.1.3</a> for further
comments.
<h4><a name="section-6.1.2">6.1.2 <code><nobr>bin</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a></h4>
<p>The <code><nobr>bin</nobr></code> output format extends the
<code><nobr>SECTION</nobr></code> (or <code><nobr>SEGMENT</nobr></code>)
directive to allow you to specify the alignment requirements of segments.
This is done by appending the <code><nobr>ALIGN</nobr></code> qualifier to
the end of the section-definition line. For example,
<p><pre>
section .data align=16
</pre>
<p>switches to the section <code><nobr>.data</nobr></code> and also
specifies that it must be aligned on a 16-byte boundary.
<p>The parameter to <code><nobr>ALIGN</nobr></code> specifies how many low
bits of the section start address must be forced to zero. The alignment
value given may be any power of two.
<h4><a name="section-6.1.3">6.1.3 <code><nobr>Multisection</nobr></code> support for the BIN format.</a></h4>
<p>The <code><nobr>bin</nobr></code> format allows the use of multiple
sections, of arbitrary names, besides the "known"
<code><nobr>.text</nobr></code>, <code><nobr>.data</nobr></code>, and
<code><nobr>.bss</nobr></code> names.
<ul>
<li>Sections may be designated <code><nobr>progbits</nobr></code> or
<code><nobr>nobits</nobr></code>. Default is
<code><nobr>progbits</nobr></code> (except <code><nobr>.bss</nobr></code>,
which defaults to <code><nobr>nobits</nobr></code>, of course).
<li>Sections can be aligned at a specified boundary following the previous
section with <code><nobr>align=</nobr></code>, or at an arbitrary
byte-granular position with <code><nobr>start=</nobr></code>.
<li>Sections can be given a virtual start address, which will be used for
the calculation of all memory references within that section with
<code><nobr>vstart=</nobr></code>.
<li>Sections can be ordered using
<code><nobr>follows=</nobr></code><code><nobr>&lt;section&gt;</nobr></code>
or
<code><nobr>vfollows=</nobr></code><code><nobr>&lt;section&gt;</nobr></code>
as an alternative to specifying an explicit start address.
<li>Arguments to <code><nobr>org</nobr></code>,
<code><nobr>start</nobr></code>, <code><nobr>vstart</nobr></code>, and
<code><nobr>align=</nobr></code> are critical expressions. See
<a href="nasmdoc3.html#section-3.8">section 3.8</a>. E.g.
<code><nobr>align=(1 &lt;&lt; ALIGN_SHIFT)</nobr></code> -
<code><nobr>ALIGN_SHIFT</nobr></code> must be defined before it is used
here.
<li>Any code which comes before an explicit
<code><nobr>SECTION</nobr></code> directive is directed by default into the
<code><nobr>.text</nobr></code> section.
<li>If an <code><nobr>ORG</nobr></code> statement is not given,
<code><nobr>ORG 0</nobr></code> is used by default.
<li>The <code><nobr>.bss</nobr></code> section will be placed after the
last <code><nobr>progbits</nobr></code> section, unless
<code><nobr>start=</nobr></code>, <code><nobr>vstart=</nobr></code>,
<code><nobr>follows=</nobr></code>, or <code><nobr>vfollows=</nobr></code>
has been specified.
<li>All sections are aligned on dword boundaries, unless a different
alignment has been specified.
<li>Sections may not overlap.
<li>Nasm creates the
<code><nobr>section.&lt;secname&gt;.start</nobr></code> for each section,
which may be used in your code.
</ul>
<h4><a name="section-6.1.4">6.1.4 Map files</a></h4>
<p>Map files can be generated in <code><nobr>-f bin</nobr></code> format by
means of the <code><nobr>[map]</nobr></code> option. Map types of
<code><nobr>all</nobr></code> (default), <code><nobr>brief</nobr></code>,
<code><nobr>sections</nobr></code>, <code><nobr>segments</nobr></code>, or
<code><nobr>symbols</nobr></code> may be specified. Output may be directed
to <code><nobr>stdout</nobr></code> (default),
<code><nobr>stderr</nobr></code>, or a specified file. E.g.
<code><nobr>[map symbols myfile.map]</nobr></code>. No "user form" exists,
the square brackets must be used.
<h3><a name="section-6.2">6.2 <code><nobr>obj</nobr></code>: Microsoft OMF Object Files</a></h3>
<p>The <code><nobr>obj</nobr></code> file format (NASM calls it
<code><nobr>obj</nobr></code> rather than <code><nobr>omf</nobr></code> for
historical reasons) is the one produced by MASM and TASM, which is
typically fed to 16-bit DOS linkers to produce
<code><nobr>.EXE</nobr></code> files. It is also the format used by OS/2.
<p><code><nobr>obj</nobr></code> provides a default output file-name
extension of <code><nobr>.obj</nobr></code>.
<p><code><nobr>obj</nobr></code> is not exclusively a 16-bit format,
though: NASM has full support for the 32-bit extensions to the format. In
particular, 32-bit <code><nobr>obj</nobr></code> format files are used by
Borland's Win32 compilers, instead of using Microsoft's newer
<code><nobr>win32</nobr></code> object file format.
<p>The <code><nobr>obj</nobr></code> format does not define any special
segment names: you can call your segments anything you like. Typical names
for segments in <code><nobr>obj</nobr></code> format files are
<code><nobr>CODE</nobr></code>, <code><nobr>DATA</nobr></code> and
<code><nobr>BSS</nobr></code>.
<p>If your source file contains code before specifying an explicit
<code><nobr>SEGMENT</nobr></code> directive, then NASM will invent its own
segment called <code><nobr>__NASMDEFSEG</nobr></code> for you.
<p>When you define a segment in an <code><nobr>obj</nobr></code> file, NASM
defines the segment name as a symbol as well, so that you can access the
segment address of the segment. So, for example:
<p><pre>
segment data
dvar: dw 1234
segment code
function:
mov ax,data ; get segment address of data
mov ds,ax ; and move it into DS
inc word [dvar] ; now this reference will work
ret
</pre>
<p>The <code><nobr>obj</nobr></code> format also enables the use of the
<code><nobr>SEG</nobr></code> and <code><nobr>WRT</nobr></code> operators,
so that you can write code which does things like
<p><pre>
extern foo
mov ax,seg foo ; get preferred segment of foo
mov ds,ax
mov ax,data ; a different segment
mov es,ax
mov ax,[ds:foo] ; this accesses `foo'
mov [es:foo wrt data],bx ; so does this
</pre>
<h4><a name="section-6.2.1">6.2.1 <code><nobr>obj</nobr></code> Extensions to the <code><nobr>SEGMENT</nobr></code> Directive</a></h4>
<p>The <code><nobr>obj</nobr></code> output format extends the
<code><nobr>SEGMENT</nobr></code> (or <code><nobr>SECTION</nobr></code>)
directive to allow you to specify various properties of the segment you are
defining. This is done by appending extra qualifiers to the end of the
segment-definition line. For example,
<p><pre>
segment code private align=16
</pre>
<p>defines the segment <code><nobr>code</nobr></code>, but also declares it
to be a private segment, and requires that the portion of it described in
this code module must be aligned on a 16-byte boundary.
<p>The available qualifiers are:
<ul>
<li><code><nobr>PRIVATE</nobr></code>, <code><nobr>PUBLIC</nobr></code>,
<code><nobr>COMMON</nobr></code> and <code><nobr>STACK</nobr></code>
specify the combination characteristics of the segment.
<code><nobr>PRIVATE</nobr></code> segments do not get combined with any
others by the linker; <code><nobr>PUBLIC</nobr></code> and
<code><nobr>STACK</nobr></code> segments get concatenated together at link
time; and <code><nobr>COMMON</nobr></code> segments all get overlaid on top
of each other rather than stuck end-to-end.
<li><code><nobr>ALIGN</nobr></code> is used, as shown above, to specify how
many low bits of the segment start address must be forced to zero. The
alignment value given may be any power of two from 1 to 4096; in reality,
the only values supported are 1, 2, 4, 16, 256 and 4096, so if 8 is
specified it will be rounded up to 16, and 32, 64 and 128 will all be
rounded up to 256, and so on. Note that alignment to 4096-byte boundaries
is a PharLap extension to the format and may not be supported by all
linkers.
<li><code><nobr>CLASS</nobr></code> can be used to specify the segment
class; this feature indicates to the linker that segments of the same class
should be placed near each other in the output file. The class name can be
any word, e.g. <code><nobr>CLASS=CODE</nobr></code>.
<li><code><nobr>OVERLAY</nobr></code>, like
<code><nobr>CLASS</nobr></code>, is specified with an arbitrary word as an
argument, and provides overlay information to an overlay-capable linker.
<li>Segments can be declared as <code><nobr>USE16</nobr></code> or
<code><nobr>USE32</nobr></code>, which has the effect of recording the
choice in the object file and also ensuring that NASM's default assembly
mode when assembling in that segment is 16-bit or 32-bit respectively.
<li>When writing OS/2 object files, you should declare 32-bit segments as
<code><nobr>FLAT</nobr></code>, which causes the default segment base for
anything in the segment to be the special group
<code><nobr>FLAT</nobr></code>, and also defines the group if it is not
already defined.
<li>The <code><nobr>obj</nobr></code> file format also allows segments to
be declared as having a pre-defined absolute segment address, although no
linkers are currently known to make sensible use of this feature;
nevertheless, NASM allows you to declare a segment such as
<code><nobr>SEGMENT SCREEN ABSOLUTE=0xB800</nobr></code> if you need to.
The <code><nobr>ABSOLUTE</nobr></code> and <code><nobr>ALIGN</nobr></code>
keywords are mutually exclusive.
</ul>
<p>NASM's default segment attributes are <code><nobr>PUBLIC</nobr></code>,
<code><nobr>ALIGN=1</nobr></code>, no class, no overlay, and
<code><nobr>USE16</nobr></code>.
<h4><a name="section-6.2.2">6.2.2 <code><nobr>GROUP</nobr></code>: Defining Groups of Segments</a></h4>
<p>The <code><nobr>obj</nobr></code> format also allows segments to be
grouped, so that a single segment register can be used to refer to all the
segments in a group. NASM therefore supplies the
<code><nobr>GROUP</nobr></code> directive, whereby you can code
<p><pre>
segment data
; some data
segment bss
; some uninitialised data
group dgroup data bss
</pre>
<p>which will define a group called <code><nobr>dgroup</nobr></code> to
contain the segments <code><nobr>data</nobr></code> and
<code><nobr>bss</nobr></code>. Like <code><nobr>SEGMENT</nobr></code>,
<code><nobr>GROUP</nobr></code> causes the group name to be defined as a
symbol, so that you can refer to a variable <code><nobr>var</nobr></code>
in the <code><nobr>data</nobr></code> segment as
<code><nobr>var wrt data</nobr></code> or as
<code><nobr>var wrt dgroup</nobr></code>, depending on which segment value
is currently in your segment register.
<p>If you just refer to <code><nobr>var</nobr></code>, however, and
<code><nobr>var</nobr></code> is declared in a segment which is part of a
group, then NASM will default to giving you the offset of
<code><nobr>var</nobr></code> from the beginning of the <em>group</em>, not
the <em>segment</em>. Therefore <code><nobr>SEG var</nobr></code>, also,
will return the group base rather than the segment base.
<p>NASM will allow a segment to be part of more than one group, but will
generate a warning if you do this. Variables declared in a segment which is
part of more than one group will default to being relative to the first
group that was defined to contain the segment.
<p>A group does not have to contain any segments; you can still make
<code><nobr>WRT</nobr></code> references to a group which does not contain
the variable you are referring to. OS/2, for example, defines the special
group <code><nobr>FLAT</nobr></code> with no segments in it.
<h4><a name="section-6.2.3">6.2.3 <code><nobr>UPPERCASE</nobr></code>: Disabling Case Sensitivity in Output</a></h4>
<p>Although NASM itself is case sensitive, some OMF linkers are not;
therefore it can be useful for NASM to output single-case object files. The
<code><nobr>UPPERCASE</nobr></code> format-specific directive causes all
segment, group and symbol names that are written to the object file to be
forced to upper case just before being written. Within a source file, NASM
is still case-sensitive; but the object file can be written entirely in
upper case if desired.
<p><code><nobr>UPPERCASE</nobr></code> is used alone on a line; it requires
no parameters.
<h4><a name="section-6.2.4">6.2.4 <code><nobr>IMPORT</nobr></code>: Importing DLL Symbols</a></h4>
<p>The <code><nobr>IMPORT</nobr></code> format-specific directive defines a
symbol to be imported from a DLL, for use if you are writing a DLL's import
library in NASM. You still need to declare the symbol as
<code><nobr>EXTERN</nobr></code> as well as using the
<code><nobr>IMPORT</nobr></code> directive.
<p>The <code><nobr>IMPORT</nobr></code> directive takes two required
parameters, separated by white space, which are (respectively) the name of
the symbol you wish to import and the name of the library you wish to
import it from. For example:
<p><pre>
import WSAStartup wsock32.dll
</pre>
<p>A third optional parameter gives the name by which the symbol is known
in the library you are importing it from, in case this is not the same as
the name you wish the symbol to be known by to your code once you have
imported it. For example:
<p><pre>
import asyncsel wsock32.dll WSAAsyncSelect
</pre>
<h4><a name="section-6.2.5">6.2.5 <code><nobr>EXPORT</nobr></code>: Exporting DLL Symbols</a></h4>
<p>The <code><nobr>EXPORT</nobr></code> format-specific directive defines a
global symbol to be exported as a DLL symbol, for use if you are writing a
DLL in NASM. You still need to declare the symbol as
<code><nobr>GLOBAL</nobr></code> as well as using the
<code><nobr>EXPORT</nobr></code> directive.
<p><code><nobr>EXPORT</nobr></code> takes one required parameter, which is
the name of the symbol you wish to export, as it was defined in your source
file. An optional second parameter (separated by white space from the
first) gives the <em>external</em> name of the symbol: the name by which
you wish the symbol to be known to programs using the DLL. If this name is
the same as the internal name, you may leave the second parameter off.
<p>Further parameters can be given to define attributes of the exported
symbol. These parameters, like the second, are separated by white space. If
further parameters are given, the external name must also be specified,
even if it is the same as the internal name. The available attributes are:
<ul>
<li><code><nobr>resident</nobr></code> indicates that the exported name is
to be kept resident by the system loader. This is an optimisation for
frequently used symbols imported by name.
<li><code><nobr>nodata</nobr></code> indicates that the exported symbol is
a function which does not make use of any initialised data.
<li><code><nobr>parm=NNN</nobr></code>, where <code><nobr>NNN</nobr></code>
is an integer, sets the number of parameter words for the case in which the
symbol is a call gate between 32-bit and 16-bit segments.
<li>An attribute which is just a number indicates that the symbol should be
exported with an identifying number (ordinal), and gives the desired
number.
</ul>
<p>For example:
<p><pre>
export myfunc
export myfunc TheRealMoreFormalLookingFunctionName
export myfunc myfunc 1234 ; export by ordinal
export myfunc myfunc resident parm=23 nodata
</pre>
<h4><a name="section-6.2.6">6.2.6 <code><nobr>..start</nobr></code>: Defining the Program Entry Point</a></h4>
<p><code><nobr>OMF</nobr></code> linkers require exactly one of the object
files being linked to define the program entry point, where execution will
begin when the program is run. If the object file that defines the entry
point is assembled using NASM, you specify the entry point by declaring the
special symbol <code><nobr>..start</nobr></code> at the point where you
wish execution to begin.
<h4><a name="section-6.2.7">6.2.7 <code><nobr>obj</nobr></code> Extensions to the <code><nobr>EXTERN</nobr></code> Directive</a></h4>
<p>If you declare an external symbol with the directive
<p><pre>
extern foo
</pre>
<p>then references such as <code><nobr>mov ax,foo</nobr></code> will give
you the offset of <code><nobr>foo</nobr></code> from its preferred segment
base (as specified in whichever module <code><nobr>foo</nobr></code> is
actually defined in). So to access the contents of
<code><nobr>foo</nobr></code> you will usually need to do something like
<p><pre>
mov ax,seg foo ; get preferred segment base
mov es,ax ; move it into ES
mov ax,[es:foo] ; and use offset `foo' from it
</pre>
<p>This is a little unwieldy, particularly if you know that an external is
going to be accessible from a given segment or group, say
<code><nobr>dgroup</nobr></code>. So if <code><nobr>DS</nobr></code>
already contained <code><nobr>dgroup</nobr></code>, you could simply code
<p><pre>
mov ax,[foo wrt dgroup]
</pre>
<p>However, having to type this every time you want to access
<code><nobr>foo</nobr></code> can be a pain; so NASM allows you to declare
<code><nobr>foo</nobr></code> in the alternative form
<p><pre>
extern foo:wrt dgroup
</pre>
<p>This form causes NASM to pretend that the preferred segment base of
<code><nobr>foo</nobr></code> is in fact <code><nobr>dgroup</nobr></code>;
so the expression <code><nobr>seg foo</nobr></code> will now return
<code><nobr>dgroup</nobr></code>, and the expression
<code><nobr>foo</nobr></code> is equivalent to
<code><nobr>foo wrt dgroup</nobr></code>.
<p>This default-<code><nobr>WRT</nobr></code> mechanism can be used to make
externals appear to be relative to any group or segment in your program. It
can also be applied to common variables: see
<a href="#section-6.2.8">section 6.2.8</a>.
<h4><a name="section-6.2.8">6.2.8 <code><nobr>obj</nobr></code> Extensions to the <code><nobr>COMMON</nobr></code> Directive</a></h4>
<p>The <code><nobr>obj</nobr></code> format allows common variables to be
either near or far; NASM allows you to specify which your variables should
be by the use of the syntax
<p><pre>
common nearvar 2:near ; `nearvar' is a near common
common farvar 10:far ; and `farvar' is far
</pre>
<p>Far common variables may be greater in size than 64Kb, and so the OMF
specification says that they are declared as a number of <em>elements</em>
of a given size. So a 10-byte far common variable could be declared as ten
one-byte elements, five two-byte elements, two five-byte elements or one
ten-byte element.
<p>Some <code><nobr>OMF</nobr></code> linkers require the element size, as
well as the variable size, to match when resolving common variables
declared in more than one module. Therefore NASM must allow you to specify
the element size on your far common variables. This is done by the
following syntax:
<p><pre>
common c_5by2 10:far 5 ; two five-byte elements
common c_2by5 10:far 2 ; five two-byte elements
</pre>
<p>If no element size is specified, the default is 1. Also, the
<code><nobr>FAR</nobr></code> keyword is not required when an element size
is specified, since only far commons may have element sizes at all. So the
above declarations could equivalently be
<p><pre>
common c_5by2 10:5 ; two five-byte elements
common c_2by5 10:2 ; five two-byte elements
</pre>
<p>In addition to these extensions, the <code><nobr>COMMON</nobr></code>
directive in <code><nobr>obj</nobr></code> also supports
default-<code><nobr>WRT</nobr></code> specification like
<code><nobr>EXTERN</nobr></code> does (explained in
<a href="#section-6.2.7">section 6.2.7</a>). So you can also declare things
like
<p><pre>
common foo 10:wrt dgroup
common bar 16:far 2:wrt data
common baz 24:wrt data:6
</pre>
<h3><a name="section-6.3">6.3 <code><nobr>win32</nobr></code>: Microsoft Win32 Object Files</a></h3>
<p>The <code><nobr>win32</nobr></code> output format generates Microsoft
Win32 object files, suitable for passing to Microsoft linkers such as
Visual C++. Note that Borland Win32 compilers do not use this format, but
use <code><nobr>obj</nobr></code> instead (see
<a href="#section-6.2">section 6.2</a>).
<p><code><nobr>win32</nobr></code> provides a default output file-name
extension of <code><nobr>.obj</nobr></code>.
<p>Note that although Microsoft say that Win32 object files follow the
<code><nobr>COFF</nobr></code> (Common Object File Format) standard, the
object files produced by Microsoft Win32 compilers are not compatible with
COFF linkers such as DJGPP's, and vice versa. This is due to a difference
of opinion over the precise semantics of PC-relative relocations. To
produce COFF files suitable for DJGPP, use NASM's
<code><nobr>coff</nobr></code> output format; conversely, the
<code><nobr>coff</nobr></code> format does not produce object files that
Win32 linkers can generate correct output from.
<h4><a name="section-6.3.1">6.3.1 <code><nobr>win32</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a></h4>
<p>Like the <code><nobr>obj</nobr></code> format,
<code><nobr>win32</nobr></code> allows you to specify additional
information on the <code><nobr>SECTION</nobr></code> directive line, to
control the type and properties of sections you declare. Section types and
properties are generated automatically by NASM for the standard section
names <code><nobr>.text</nobr></code>, <code><nobr>.data</nobr></code> and
<code><nobr>.bss</nobr></code>, but may still be overridden by these
qualifiers.
<p>The available qualifiers are:
<ul>
<li><code><nobr>code</nobr></code>, or equivalently
<code><nobr>text</nobr></code>, defines the section to be a code section.
This marks the section as readable and executable, but not writable, and
also indicates to the linker that the type of the section is code.
<li><code><nobr>data</nobr></code> and <code><nobr>bss</nobr></code> define
the section to be a data section, analogously to
<code><nobr>code</nobr></code>. Data sections are marked as readable and
writable, but not executable. <code><nobr>data</nobr></code> declares an
initialised data section, whereas <code><nobr>bss</nobr></code> declares an
uninitialised data section.
<li><code><nobr>rdata</nobr></code> declares an initialised data section
that is readable but not writable. Microsoft compilers use this section to
place constants in it.
<li><code><nobr>info</nobr></code> defines the section to be an
informational section, which is not included in the executable file by the
linker, but may (for example) pass information <em>to</em> the linker. For
example, declaring an <code><nobr>info</nobr></code>-type section called
<code><nobr>.drectve</nobr></code> causes the linker to interpret the
contents of the section as command-line options.
<li><code><nobr>align=</nobr></code>, used with a trailing number as in
<code><nobr>obj</nobr></code>, gives the alignment requirements of the
section. The maximum you may specify is 64: the Win32 object file format
contains no means to request a greater section alignment than this. If
alignment is not explicitly specified, the defaults are 16-byte alignment
for code sections, 8-byte alignment for rdata sections and 4-byte alignment
for data (and BSS) sections. Informational sections get a default alignment
of 1 byte (no alignment), though the value does not matter.
</ul>
<p>The defaults assumed by NASM if you do not specify the above qualifiers
are:
<p><pre>
section .text code align=16
section .data data align=4
section .rdata rdata align=8
section .bss bss align=4
</pre>
<p>Any other section name is treated by default like
<code><nobr>.text</nobr></code>.
<h3><a name="section-6.4">6.4 <code><nobr>coff</nobr></code>: Common Object File Format</a></h3>
<p>The <code><nobr>coff</nobr></code> output type produces
<code><nobr>COFF</nobr></code> object files suitable for linking with the
DJGPP linker.
<p><code><nobr>coff</nobr></code> provides a default output file-name
extension of <code><nobr>.o</nobr></code>.
<p>The <code><nobr>coff</nobr></code> format supports the same extensions
to the <code><nobr>SECTION</nobr></code> directive as
<code><nobr>win32</nobr></code> does, except that the
<code><nobr>align</nobr></code> qualifier and the
<code><nobr>info</nobr></code> section type are not supported.
<h3><a name="section-6.5">6.5 <code><nobr>elf</nobr></code>: Executable and Linkable Format Object Files</a></h3>
<p>The <code><nobr>elf</nobr></code> output format generates
<code><nobr>ELF32</nobr></code> (Executable and Linkable Format) object
files, as used by Linux as well as Unix System V, including Solaris x86,
UnixWare and SCO Unix. <code><nobr>elf</nobr></code> provides a default
output file-name extension of <code><nobr>.o</nobr></code>.
<h4><a name="section-6.5.1">6.5.1 <code><nobr>elf</nobr></code> Extensions to the <code><nobr>SECTION</nobr></code> Directive</a></h4>
<p>Like the <code><nobr>obj</nobr></code> format,
<code><nobr>elf</nobr></code> allows you to specify additional information
on the <code><nobr>SECTION</nobr></code> directive line, to control the
type and properties of sections you declare. Section types and properties
are generated automatically by NASM for the standard section names
<code><nobr>.text</nobr></code>, <code><nobr>.data</nobr></code> and
<code><nobr>.bss</nobr></code>, but may still be overridden by these
qualifiers.
<p>The available qualifiers are:
<ul>
<li><code><nobr>alloc</nobr></code> defines the section to be one which is
loaded into memory when the program is run.
<code><nobr>noalloc</nobr></code> defines it to be one which is not, such
as an informational or comment section.
<li><code><nobr>exec</nobr></code> defines the section to be one which
should have execute permission when the program is run.
<code><nobr>noexec</nobr></code> defines it as one which should not.
<li><code><nobr>write</nobr></code> defines the section to be one which
should be writable when the program is run.
<code><nobr>nowrite</nobr></code> defines it as one which should not.
<li><code><nobr>progbits</nobr></code> defines the section to be one with
explicit contents stored in the object file: an ordinary code or data
section, for example, <code><nobr>nobits</nobr></code> defines the section
to be one with no explicit contents given, such as a BSS section.
<li><code><nobr>align=</nobr></code>, used with a trailing number as in
<code><nobr>obj</nobr></code>, gives the alignment requirements of the
section.
</ul>
<p>The defaults assumed by NASM if you do not specify the above qualifiers
are:
<p><pre>
section .text progbits alloc exec nowrite align=16
section .rodata progbits alloc noexec nowrite align=4
section .data progbits alloc noexec write align=4
section .bss nobits alloc noexec write align=4
section other progbits alloc noexec nowrite align=1
</pre>
<p>(Any section name other than <code><nobr>.text</nobr></code>,
<code><nobr>.rodata</nobr></code>, <code><nobr>.data</nobr></code> and
<code><nobr>.bss</nobr></code> is treated by default like
<code><nobr>other</nobr></code> in the above code.)
<h4><a name="section-6.5.2">6.5.2 Position-Independent Code: <code><nobr>elf</nobr></code> Special Symbols and <code><nobr>WRT</nobr></code></a></h4>
<p>The <code><nobr>ELF</nobr></code> specification contains enough features
to allow position-independent code (PIC) to be written, which makes ELF
shared libraries very flexible. However, it also means NASM has to be able
to generate a variety of strange relocation types in ELF object files, if
it is to be an assembler which can write PIC.
<p>Since <code><nobr>ELF</nobr></code> does not support segment-base
references, the <code><nobr>WRT</nobr></code> operator is not used for its
normal purpose; therefore NASM's <code><nobr>elf</nobr></code> output
format makes use of <code><nobr>WRT</nobr></code> for a different purpose,
namely the PIC-specific relocation types.
<p><code><nobr>elf</nobr></code> defines five special symbols which you can
use as the right-hand side of the <code><nobr>WRT</nobr></code> operator to
obtain PIC relocation types. They are <code><nobr>..gotpc</nobr></code>,
<code><nobr>..gotoff</nobr></code>, <code><nobr>..got</nobr></code>,
<code><nobr>..plt</nobr></code> and <code><nobr>..sym</nobr></code>. Their
functions are summarised here:
<ul>
<li>Referring to the symbol marking the global offset table base using
<code><nobr>wrt ..gotpc</nobr></code> will end up giving the distance from
the beginning of the current section to the global offset table.
(<code><nobr>_GLOBAL_OFFSET_TABLE_</nobr></code> is the standard symbol
name used to refer to the GOT.) So you would then need to add
<code><nobr>$$</nobr></code> to the result to get the real address of the
GOT.
<li>Referring to a location in one of your own sections using
<code><nobr>wrt ..gotoff</nobr></code> will give the distance from the
beginning of the GOT to the specified location, so that adding on the
address of the GOT would give the real address of the location you wanted.
<li>Referring to an external or global symbol using
<code><nobr>wrt ..got</nobr></code> causes the linker to build an entry
<em>in</em> the GOT containing the address of the symbol, and the reference
gives the distance from the beginning of the GOT to the entry; so you can
add on the address of the GOT, load from the resulting address, and end up
with the address of the symbol.
<li>Referring to a procedure name using <code><nobr>wrt ..plt</nobr></code>
causes the linker to build a procedure linkage table entry for the symbol,
and the reference gives the address of the PLT entry. You can only use this
in contexts which would generate a PC-relative relocation normally (i.e. as
the destination for <code><nobr>CALL</nobr></code> or
<code><nobr>JMP</nobr></code>), since ELF contains no relocation type to
refer to PLT entries absolutely.
<li>Referring to a symbol name using <code><nobr>wrt ..sym</nobr></code>
causes NASM to write an ordinary relocation, but instead of making the
relocation relative to the start of the section and then adding on the
offset to the symbol, it will write a relocation record aimed directly at
the symbol in question. The distinction is a necessary one due to a
peculiarity of the dynamic linker.
</ul>
<p>A fuller explanation of how to use these relocation types to write
shared libraries entirely in NASM is given in
<a href="nasmdoc8.html#section-8.2">section 8.2</a>.
<h4><a name="section-6.5.3">6.5.3 <code><nobr>elf</nobr></code> Extensions to the <code><nobr>GLOBAL</nobr></code> Directive</a></h4>
<p><code><nobr>ELF</nobr></code> object files can contain more information
about a global symbol than just its address: they can contain the size of
the symbol and its type as well. These are not merely debugger
conveniences, but are actually necessary when the program being written is
a shared library. NASM therefore supports some extensions to the
<code><nobr>GLOBAL</nobr></code> directive, allowing you to specify these
features.
<p>You can specify whether a global variable is a function or a data object
by suffixing the name with a colon and the word
<code><nobr>function</nobr></code> or <code><nobr>data</nobr></code>.
(<code><nobr>object</nobr></code> is a synonym for
<code><nobr>data</nobr></code>.) For example:
<p><pre>
global hashlookup:function, hashtable:data
</pre>
<p>exports the global symbol <code><nobr>hashlookup</nobr></code> as a
function and <code><nobr>hashtable</nobr></code> as a data object.
<p>You can also specify the size of the data associated with the symbol, as
a numeric expression (which may involve labels, and even forward
references) after the type specifier. Like this:
<p><pre>
global hashtable:data (hashtable.end - hashtable)
hashtable:
db this,that,theother ; some data here
.end:
</pre>
<p>This makes NASM automatically calculate the length of the table and
place that information into the <code><nobr>ELF</nobr></code> symbol table.
<p>Declaring the type and size of global symbols is necessary when writing
shared library code. For more information, see
<a href="nasmdoc8.html#section-8.2.4">section 8.2.4</a>.
<h4><a name="section-6.5.4">6.5.4 <code><nobr>elf</nobr></code> Extensions to the <code><nobr>COMMON</nobr></code> Directive </a></h4>
<p><code><nobr>ELF</nobr></code> also allows you to specify alignment
requirements on common variables. This is done by putting a number (which
must be a power of two) after the name and size of the common variable,
separated (as usual) by a colon. For example, an array of doublewords would
benefit from 4-byte alignment:
<p><pre>
common dwordarray 128:4
</pre>
<p>This declares the total size of the array to be 128 bytes, and requires
that it be aligned on a 4-byte boundary.
<h4><a name="section-6.5.5">6.5.5 16-bit code and ELF </a></h4>
<p>The <code><nobr>ELF32</nobr></code> specification doesn't provide
relocations for 8- and 16-bit values, but the GNU
<code><nobr>ld</nobr></code> linker adds these as an extension. NASM can
generate GNU-compatible relocations, to allow 16-bit code to be linked as
ELF using GNU <code><nobr>ld</nobr></code>. If NASM is used with the
<code><nobr>-w+gnu-elf-extensions</nobr></code> option, a warning is issued
when one of these relocations is generated.
<h3><a name="section-6.6">6.6 <code><nobr>aout</nobr></code>: Linux <code><nobr>a.out</nobr></code> Object Files</a></h3>
<p>The <code><nobr>aout</nobr></code> format generates
<code><nobr>a.out</nobr></code> object files, in the form used by early
Linux systems (current Linux systems use ELF, see
<a href="#section-6.5">section 6.5</a>.) These differ from other
<code><nobr>a.out</nobr></code> object files in that the magic number in
the first four bytes of the file is different; also, some implementations
of <code><nobr>a.out</nobr></code>, for example NetBSD's, support
position-independent code, which Linux's implementation does not.
<p><code><nobr>a.out</nobr></code> provides a default output file-name
extension of <code><nobr>.o</nobr></code>.
<p><code><nobr>a.out</nobr></code> is a very simple object format. It
supports no special directives, no special symbols, no use of
<code><nobr>SEG</nobr></code> or <code><nobr>WRT</nobr></code>, and no
extensions to any standard directives. It supports only the three standard
section names <code><nobr>.text</nobr></code>,
<code><nobr>.data</nobr></code> and <code><nobr>.bss</nobr></code>.
<h3><a name="section-6.7">6.7 <code><nobr>aoutb</nobr></code>: NetBSD/FreeBSD/OpenBSD <code><nobr>a.out</nobr></code> Object Files</a></h3>
<p>The <code><nobr>aoutb</nobr></code> format generates
<code><nobr>a.out</nobr></code> object files, in the form used by the
various free <code><nobr>BSD Unix</nobr></code> clones,
<code><nobr>NetBSD</nobr></code>, <code><nobr>FreeBSD</nobr></code> and
<code><nobr>OpenBSD</nobr></code>. For simple object files, this object
format is exactly the same as <code><nobr>aout</nobr></code> except for the
magic number in the first four bytes of the file. However, the
<code><nobr>aoutb</nobr></code> format supports position-independent code
in the same way as the <code><nobr>elf</nobr></code> format, so you can use
it to write <code><nobr>BSD</nobr></code> shared libraries.
<p><code><nobr>aoutb</nobr></code> provides a default output file-name
extension of <code><nobr>.o</nobr></code>.
<p><code><nobr>aoutb</nobr></code> supports no special directives, no
special symbols, and only the three standard section names
<code><nobr>.text</nobr></code>, <code><nobr>.data</nobr></code> and
<code><nobr>.bss</nobr></code>. However, it also supports the same use of
<code><nobr>WRT</nobr></code> as <code><nobr>elf</nobr></code> does, to
provide position-independent code relocation types. See
<a href="#section-6.5.2">section 6.5.2</a> for full documentation of this
feature.
<p><code><nobr>aoutb</nobr></code> also supports the same extensions to the
<code><nobr>GLOBAL</nobr></code> directive as <code><nobr>elf</nobr></code>
does: see <a href="#section-6.5.3">section 6.5.3</a> for documentation of
this.
<h3><a name="section-6.8">6.8 <code><nobr>as86</nobr></code>: Minix/Linux <code><nobr>as86</nobr></code> Object Files</a></h3>
<p>The Minix/Linux 16-bit assembler <code><nobr>as86</nobr></code> has its
own non-standard object file format. Although its companion linker
<code><nobr>ld86</nobr></code> produces something close to ordinary
<code><nobr>a.out</nobr></code> binaries as output, the object file format
used to communicate between <code><nobr>as86</nobr></code> and
<code><nobr>ld86</nobr></code> is not itself
<code><nobr>a.out</nobr></code>.
<p>NASM supports this format, just in case it is useful, as
<code><nobr>as86</nobr></code>. <code><nobr>as86</nobr></code> provides a
default output file-name extension of <code><nobr>.o</nobr></code>.
<p><code><nobr>as86</nobr></code> is a very simple object format (from the
NASM user's point of view). It supports no special directives, no special
symbols, no use of <code><nobr>SEG</nobr></code> or
<code><nobr>WRT</nobr></code>, and no extensions to any standard
directives. It supports only the three standard section names
<code><nobr>.text</nobr></code>, <code><nobr>.data</nobr></code> and
<code><nobr>.bss</nobr></code>.
<h3><a name="section-6.9">6.9 <code><nobr>rdf</nobr></code>: Relocatable Dynamic Object File Format</a></h3>
<p>The <code><nobr>rdf</nobr></code> output format produces
<code><nobr>RDOFF</nobr></code> object files.
<code><nobr>RDOFF</nobr></code> (Relocatable Dynamic Object File Format) is
a home-grown object-file format, designed alongside NASM itself and
reflecting in its file format the internal structure of the assembler.
<p><code><nobr>RDOFF</nobr></code> is not used by any well-known operating
systems. Those writing their own systems, however, may well wish to use
<code><nobr>RDOFF</nobr></code> as their object format, on the grounds that
it is designed primarily for simplicity and contains very little
file-header bureaucracy.
<p>The Unix NASM archive, and the DOS archive which includes sources, both
contain an <code><nobr>rdoff</nobr></code> subdirectory holding a set of
RDOFF utilities: an RDF linker, an <code><nobr>RDF</nobr></code>
static-library manager, an RDF file dump utility, and a program which will
load and execute an RDF executable under Linux.
<p><code><nobr>rdf</nobr></code> supports only the standard section names
<code><nobr>.text</nobr></code>, <code><nobr>.data</nobr></code> and
<code><nobr>.bss</nobr></code>.
<h4><a name="section-6.9.1">6.9.1 Requiring a Library: The <code><nobr>LIBRARY</nobr></code> Directive</a></h4>
<p><code><nobr>RDOFF</nobr></code> contains a mechanism for an object file
to demand a given library to be linked to the module, either at load time
or run time. This is done by the <code><nobr>LIBRARY</nobr></code>
directive, which takes one argument which is the name of the module:
<p><pre>
library mylib.rdl
</pre>
<h4><a name="section-6.9.2">6.9.2 Specifying a Module Name: The <code><nobr>MODULE</nobr></code> Directive</a></h4>
<p>Special <code><nobr>RDOFF</nobr></code> header record is used to store
the name of the module. It can be used, for example, by run-time loader to
perform dynamic linking. <code><nobr>MODULE</nobr></code> directive takes
one argument which is the name of current module:
<p><pre>
module mymodname
</pre>
<p>Note that when you statically link modules and tell linker to strip the
symbols from output file, all module names will be stripped too. To avoid
it, you should start module names with <code><nobr>$</nobr></code>, like:
<p><pre>
module $kernel.core
</pre>
<h4><a name="section-6.9.3">6.9.3 <code><nobr>rdf</nobr></code> Extensions to the <code><nobr>GLOBAL</nobr></code> directive</a></h4>
<p><code><nobr>RDOFF</nobr></code> global symbols can contain additional
information needed by the static linker. You can mark a global symbol as
exported, thus telling the linker do not strip it from target executable or
library file. Like in <code><nobr>ELF</nobr></code>, you can also specify
whether an exported symbol is a procedure (function) or data object.
<p>Suffixing the name with a colon and the word
<code><nobr>export</nobr></code> you make the symbol exported:
<p><pre>
global sys_open:export
</pre>
<p>To specify that exported symbol is a procedure (function), you add the
word <code><nobr>proc</nobr></code> or <code><nobr>function</nobr></code>
after declaration:
<p><pre>
global sys_open:export proc
</pre>
<p>Similarly, to specify exported data object, add the word
<code><nobr>data</nobr></code> or <code><nobr>object</nobr></code> to the
directive:
<p><pre>
global kernel_ticks:export data
</pre>
<h3><a name="section-6.10">6.10 <code><nobr>dbg</nobr></code>: Debugging Format</a></h3>
<p>The <code><nobr>dbg</nobr></code> output format is not built into NASM
in the default configuration. If you are building your own NASM executable
from the sources, you can define <code><nobr>OF_DBG</nobr></code> in
<code><nobr>outform.h</nobr></code> or on the compiler command line, and
obtain the <code><nobr>dbg</nobr></code> output format.
<p>The <code><nobr>dbg</nobr></code> format does not output an object file
as such; instead, it outputs a text file which contains a complete list of
all the transactions between the main body of NASM and the output-format
back end module. It is primarily intended to aid people who want to write
their own output drivers, so that they can get a clearer idea of the
various requests the main program makes of the output driver, and in what
order they happen.
<p>For simple files, one can easily use the <code><nobr>dbg</nobr></code>
format like this:
<p><pre>
nasm -f dbg filename.asm
</pre>
<p>which will generate a diagnostic file called
<code><nobr>filename.dbg</nobr></code>. However, this will not work well on
files which were designed for a different object format, because each
object format defines its own macros (usually user-level forms of
directives), and those macros will not be defined in the
<code><nobr>dbg</nobr></code> format. Therefore it can be useful to run
NASM twice, in order to do the preprocessing with the native object format
selected:
<p><pre>
nasm -e -f rdf -o rdfprog.i rdfprog.asm
nasm -a -f dbg rdfprog.i
</pre>
<p>This preprocesses <code><nobr>rdfprog.asm</nobr></code> into
<code><nobr>rdfprog.i</nobr></code>, keeping the
<code><nobr>rdf</nobr></code> object format selected in order to make sure
RDF special directives are converted into primitive form correctly. Then
the preprocessed source is fed through the <code><nobr>dbg</nobr></code>
format to generate the final diagnostic output.
<p>This workaround will still typically not work for programs intended for
<code><nobr>obj</nobr></code> format, because the
<code><nobr>obj</nobr></code> <code><nobr>SEGMENT</nobr></code> and
<code><nobr>GROUP</nobr></code> directives have side effects of defining
the segment and group names as symbols; <code><nobr>dbg</nobr></code> will
not do this, so the program will not assemble. You will have to work around
that by defining the symbols yourself (using
<code><nobr>EXTERN</nobr></code>, for example) if you really need to get a
<code><nobr>dbg</nobr></code> trace of an
<code><nobr>obj</nobr></code>-specific source file.
<p><code><nobr>dbg</nobr></code> accepts any section name and any
directives at all, and logs them all to its output file.
<p align=center><a href="nasmdoc7.html">Next Chapter</a> |
<a href="nasmdoc5.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
</body></html>

View File

@@ -0,0 +1,808 @@
<html><head><title>NASM Manual</title></head>
<body><h1 align=center>The Netwide Assembler: NASM</h1>
<p align=center><a href="nasmdoc8.html">Next Chapter</a> |
<a href="nasmdoc6.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
<h2><a name="chapter-7">Chapter 7: Writing 16-bit Code (DOS, Windows 3/3.1)</a></h2>
<p>This chapter attempts to cover some of the common issues encountered
when writing 16-bit code to run under <code><nobr>MS-DOS</nobr></code> or
<code><nobr>Windows 3.x</nobr></code>. It covers how to link programs to
produce <code><nobr>.EXE</nobr></code> or <code><nobr>.COM</nobr></code>
files, how to write <code><nobr>.SYS</nobr></code> device drivers, and how
to interface assembly language code with 16-bit C compilers and with
Borland Pascal.
<h3><a name="section-7.1">7.1 Producing <code><nobr>.EXE</nobr></code> Files</a></h3>
<p>Any large program written under DOS needs to be built as a
<code><nobr>.EXE</nobr></code> file: only <code><nobr>.EXE</nobr></code>
files have the necessary internal structure required to span more than one
64K segment. Windows programs, also, have to be built as
<code><nobr>.EXE</nobr></code> files, since Windows does not support the
<code><nobr>.COM</nobr></code> format.
<p>In general, you generate <code><nobr>.EXE</nobr></code> files by using
the <code><nobr>obj</nobr></code> output format to produce one or more
<code><nobr>.OBJ</nobr></code> files, and then linking them together using
a linker. However, NASM also supports the direct generation of simple DOS
<code><nobr>.EXE</nobr></code> files using the
<code><nobr>bin</nobr></code> output format (by using
<code><nobr>DB</nobr></code> and <code><nobr>DW</nobr></code> to construct
the <code><nobr>.EXE</nobr></code> file header), and a macro package is
supplied to do this. Thanks to Yann Guidon for contributing the code for
this.
<p>NASM may also support <code><nobr>.EXE</nobr></code> natively as another
output format in future releases.
<h4><a name="section-7.1.1">7.1.1 Using the <code><nobr>obj</nobr></code> Format To Generate <code><nobr>.EXE</nobr></code> Files</a></h4>
<p>This section describes the usual method of generating
<code><nobr>.EXE</nobr></code> files by linking
<code><nobr>.OBJ</nobr></code> files together.
<p>Most 16-bit programming language packages come with a suitable linker;
if you have none of these, there is a free linker called VAL, available in
<code><nobr>LZH</nobr></code> archive format from
<a href="ftp://x2ftp.oulu.fi/pub/msdos/programming/lang/"><code><nobr>x2ftp.oulu.fi</nobr></code></a>.
An LZH archiver can be found at
<a href="ftp://ftp.simtel.net/pub/simtelnet/msdos/arcers"><code><nobr>ftp.simtel.net</nobr></code></a>.
There is another `free' linker (though this one doesn't come with sources)
called FREELINK, available from
<a href="http://www.pcorner.com/tpc/old/3-101.html"><code><nobr>www.pcorner.com</nobr></code></a>.
A third, <code><nobr>djlink</nobr></code>, written by DJ Delorie, is
available at
<a href="http://www.delorie.com/djgpp/16bit/djlink/"><code><nobr>www.delorie.com</nobr></code></a>.
A fourth linker, <code><nobr>ALINK</nobr></code>, written by Anthony A.J.
Williams, is available at
<a href="http://alink.sourceforge.net"><code><nobr>alink.sourceforge.net</nobr></code></a>.
<p>When linking several <code><nobr>.OBJ</nobr></code> files into a
<code><nobr>.EXE</nobr></code> file, you should ensure that exactly one of
them has a start point defined (using the <code><nobr>..start</nobr></code>
special symbol defined by the <code><nobr>obj</nobr></code> format: see
<a href="nasmdoc6.html#section-6.2.6">section 6.2.6</a>). If no module
defines a start point, the linker will not know what value to give the
entry-point field in the output file header; if more than one defines a
start point, the linker will not know <em>which</em> value to use.
<p>An example of a NASM source file which can be assembled to a
<code><nobr>.OBJ</nobr></code> file and linked on its own to a
<code><nobr>.EXE</nobr></code> is given here. It demonstrates the basic
principles of defining a stack, initialising the segment registers, and
declaring a start point. This file is also provided in the
<code><nobr>test</nobr></code> subdirectory of the NASM archives, under the
name <code><nobr>objexe.asm</nobr></code>.
<p><pre>
segment code
..start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,stacktop
</pre>
<p>This initial piece of code sets up <code><nobr>DS</nobr></code> to point
to the data segment, and initialises <code><nobr>SS</nobr></code> and
<code><nobr>SP</nobr></code> to point to the top of the provided stack.
Notice that interrupts are implicitly disabled for one instruction after a
move into <code><nobr>SS</nobr></code>, precisely for this situation, so
that there's no chance of an interrupt occurring between the loads of
<code><nobr>SS</nobr></code> and <code><nobr>SP</nobr></code> and not
having a stack to execute on.
<p>Note also that the special symbol <code><nobr>..start</nobr></code> is
defined at the beginning of this code, which means that will be the entry
point into the resulting executable file.
<p><pre>
mov dx,hello
mov ah,9
int 0x21
</pre>
<p>The above is the main program: load <code><nobr>DS:DX</nobr></code> with
a pointer to the greeting message (<code><nobr>hello</nobr></code> is
implicitly relative to the segment <code><nobr>data</nobr></code>, which
was loaded into <code><nobr>DS</nobr></code> in the setup code, so the full
pointer is valid), and call the DOS print-string function.
<p><pre>
mov ax,0x4c00
int 0x21
</pre>
<p>This terminates the program using another DOS system call.
<p><pre>
segment data
hello: db 'hello, world', 13, 10, '$'
</pre>
<p>The data segment contains the string we want to display.
<p><pre>
segment stack stack
resb 64
stacktop:
</pre>
<p>The above code declares a stack segment containing 64 bytes of
uninitialised stack space, and points <code><nobr>stacktop</nobr></code> at
the top of it. The directive <code><nobr>segment stack stack</nobr></code>
defines a segment <em>called</em> <code><nobr>stack</nobr></code>, and also
of <em>type</em> <code><nobr>STACK</nobr></code>. The latter is not
necessary to the correct running of the program, but linkers are likely to
issue warnings or errors if your program has no segment of type
<code><nobr>STACK</nobr></code>.
<p>The above file, when assembled into a <code><nobr>.OBJ</nobr></code>
file, will link on its own to a valid <code><nobr>.EXE</nobr></code> file,
which when run will print `hello, world' and then exit.
<h4><a name="section-7.1.2">7.1.2 Using the <code><nobr>bin</nobr></code> Format To Generate <code><nobr>.EXE</nobr></code> Files</a></h4>
<p>The <code><nobr>.EXE</nobr></code> file format is simple enough that
it's possible to build a <code><nobr>.EXE</nobr></code> file by writing a
pure-binary program and sticking a 32-byte header on the front. This header
is simple enough that it can be generated using
<code><nobr>DB</nobr></code> and <code><nobr>DW</nobr></code> commands by
NASM itself, so that you can use the <code><nobr>bin</nobr></code> output
format to directly generate <code><nobr>.EXE</nobr></code> files.
<p>Included in the NASM archives, in the <code><nobr>misc</nobr></code>
subdirectory, is a file <code><nobr>exebin.mac</nobr></code> of macros. It
defines three macros: <code><nobr>EXE_begin</nobr></code>,
<code><nobr>EXE_stack</nobr></code> and <code><nobr>EXE_end</nobr></code>.
<p>To produce a <code><nobr>.EXE</nobr></code> file using this method, you
should start by using <code><nobr>%include</nobr></code> to load the
<code><nobr>exebin.mac</nobr></code> macro package into your source file.
You should then issue the <code><nobr>EXE_begin</nobr></code> macro call
(which takes no arguments) to generate the file header data. Then write
code as normal for the <code><nobr>bin</nobr></code> format - you can use
all three standard sections <code><nobr>.text</nobr></code>,
<code><nobr>.data</nobr></code> and <code><nobr>.bss</nobr></code>. At the
end of the file you should call the <code><nobr>EXE_end</nobr></code> macro
(again, no arguments), which defines some symbols to mark section sizes,
and these symbols are referred to in the header code generated by
<code><nobr>EXE_begin</nobr></code>.
<p>In this model, the code you end up writing starts at
<code><nobr>0x100</nobr></code>, just like a <code><nobr>.COM</nobr></code>
file - in fact, if you strip off the 32-byte header from the resulting
<code><nobr>.EXE</nobr></code> file, you will have a valid
<code><nobr>.COM</nobr></code> program. All the segment bases are the same,
so you are limited to a 64K program, again just like a
<code><nobr>.COM</nobr></code> file. Note that an
<code><nobr>ORG</nobr></code> directive is issued by the
<code><nobr>EXE_begin</nobr></code> macro, so you should not explicitly
issue one of your own.
<p>You can't directly refer to your segment base value, unfortunately,
since this would require a relocation in the header, and things would get a
lot more complicated. So you should get your segment base by copying it out
of <code><nobr>CS</nobr></code> instead.
<p>On entry to your <code><nobr>.EXE</nobr></code> file,
<code><nobr>SS:SP</nobr></code> are already set up to point to the top of a
2Kb stack. You can adjust the default stack size of 2Kb by calling the
<code><nobr>EXE_stack</nobr></code> macro. For example, to change the stack
size of your program to 64 bytes, you would call
<code><nobr>EXE_stack 64</nobr></code>.
<p>A sample program which generates a <code><nobr>.EXE</nobr></code> file
in this way is given in the <code><nobr>test</nobr></code> subdirectory of
the NASM archive, as <code><nobr>binexe.asm</nobr></code>.
<h3><a name="section-7.2">7.2 Producing <code><nobr>.COM</nobr></code> Files</a></h3>
<p>While large DOS programs must be written as
<code><nobr>.EXE</nobr></code> files, small ones are often better written
as <code><nobr>.COM</nobr></code> files. <code><nobr>.COM</nobr></code>
files are pure binary, and therefore most easily produced using the
<code><nobr>bin</nobr></code> output format.
<h4><a name="section-7.2.1">7.2.1 Using the <code><nobr>bin</nobr></code> Format To Generate <code><nobr>.COM</nobr></code> Files</a></h4>
<p><code><nobr>.COM</nobr></code> files expect to be loaded at offset
<code><nobr>100h</nobr></code> into their segment (though the segment may
change). Execution then begins at <code><nobr>100h</nobr></code>, i.e.
right at the start of the program. So to write a
<code><nobr>.COM</nobr></code> program, you would create a source file
looking like
<p><pre>
org 100h
section .text
start:
; put your code here
section .data
; put data items here
section .bss
; put uninitialised data here
</pre>
<p>The <code><nobr>bin</nobr></code> format puts the
<code><nobr>.text</nobr></code> section first in the file, so you can
declare data or BSS items before beginning to write code if you want to and
the code will still end up at the front of the file where it belongs.
<p>The BSS (uninitialised data) section does not take up space in the
<code><nobr>.COM</nobr></code> file itself: instead, addresses of BSS items
are resolved to point at space beyond the end of the file, on the grounds
that this will be free memory when the program is run. Therefore you should
not rely on your BSS being initialised to all zeros when you run.
<p>To assemble the above program, you should use a command line like
<p><pre>
nasm myprog.asm -fbin -o myprog.com
</pre>
<p>The <code><nobr>bin</nobr></code> format would produce a file called
<code><nobr>myprog</nobr></code> if no explicit output file name were
specified, so you have to override it and give the desired file name.
<h4><a name="section-7.2.2">7.2.2 Using the <code><nobr>obj</nobr></code> Format To Generate <code><nobr>.COM</nobr></code> Files</a></h4>
<p>If you are writing a <code><nobr>.COM</nobr></code> program as more than
one module, you may wish to assemble several <code><nobr>.OBJ</nobr></code>
files and link them together into a <code><nobr>.COM</nobr></code> program.
You can do this, provided you have a linker capable of outputting
<code><nobr>.COM</nobr></code> files directly (TLINK does this), or
alternatively a converter program such as <code><nobr>EXE2BIN</nobr></code>
to transform the <code><nobr>.EXE</nobr></code> file output from the linker
into a <code><nobr>.COM</nobr></code> file.
<p>If you do this, you need to take care of several things:
<ul>
<li>The first object file containing code should start its code segment
with a line like <code><nobr>RESB 100h</nobr></code>. This is to ensure
that the code begins at offset <code><nobr>100h</nobr></code> relative to
the beginning of the code segment, so that the linker or converter program
does not have to adjust address references within the file when generating
the <code><nobr>.COM</nobr></code> file. Other assemblers use an
<code><nobr>ORG</nobr></code> directive for this purpose, but
<code><nobr>ORG</nobr></code> in NASM is a format-specific directive to the
<code><nobr>bin</nobr></code> output format, and does not mean the same
thing as it does in MASM-compatible assemblers.
<li>You don't need to define a stack segment.
<li>All your segments should be in the same group, so that every time your
code or data references a symbol offset, all offsets are relative to the
same segment base. This is because, when a <code><nobr>.COM</nobr></code>
file is loaded, all the segment registers contain the same value.
</ul>
<h3><a name="section-7.3">7.3 Producing <code><nobr>.SYS</nobr></code> Files</a></h3>
<p>MS-DOS device drivers - <code><nobr>.SYS</nobr></code> files - are pure
binary files, similar to <code><nobr>.COM</nobr></code> files, except that
they start at origin zero rather than <code><nobr>100h</nobr></code>.
Therefore, if you are writing a device driver using the
<code><nobr>bin</nobr></code> format, you do not need the
<code><nobr>ORG</nobr></code> directive, since the default origin for
<code><nobr>bin</nobr></code> is zero. Similarly, if you are using
<code><nobr>obj</nobr></code>, you do not need the
<code><nobr>RESB 100h</nobr></code> at the start of your code segment.
<p><code><nobr>.SYS</nobr></code> files start with a header structure,
containing pointers to the various routines inside the driver which do the
work. This structure should be defined at the start of the code segment,
even though it is not actually code.
<p>For more information on the format of <code><nobr>.SYS</nobr></code>
files, and the data which has to go in the header structure, a list of
books is given in the Frequently Asked Questions list for the newsgroup
<a href="news:comp.os.msdos.programmer"><code><nobr>comp.os.msdos.programmer</nobr></code></a>.
<h3><a name="section-7.4">7.4 Interfacing to 16-bit C Programs</a></h3>
<p>This section covers the basics of writing assembly routines that call,
or are called from, C programs. To do this, you would typically write an
assembly module as a <code><nobr>.OBJ</nobr></code> file, and link it with
your C modules to produce a mixed-language program.
<h4><a name="section-7.4.1">7.4.1 External Symbol Names</a></h4>
<p>C compilers have the convention that the names of all global symbols
(functions or data) they define are formed by prefixing an underscore to
the name as it appears in the C program. So, for example, the function a C
programmer thinks of as <code><nobr>printf</nobr></code> appears to an
assembly language programmer as <code><nobr>_printf</nobr></code>. This
means that in your assembly programs, you can define symbols without a
leading underscore, and not have to worry about name clashes with C
symbols.
<p>If you find the underscores inconvenient, you can define macros to
replace the <code><nobr>GLOBAL</nobr></code> and
<code><nobr>EXTERN</nobr></code> directives as follows:
<p><pre>
%macro cglobal 1
global _%1
%define %1 _%1
%endmacro
%macro cextern 1
extern _%1
%define %1 _%1
%endmacro
</pre>
<p>(These forms of the macros only take one argument at a time; a
<code><nobr>%rep</nobr></code> construct could solve this.)
<p>If you then declare an external like this:
<p><pre>
cextern printf
</pre>
<p>then the macro will expand it as
<p><pre>
extern _printf
%define printf _printf
</pre>
<p>Thereafter, you can reference <code><nobr>printf</nobr></code> as if it
was a symbol, and the preprocessor will put the leading underscore on where
necessary.
<p>The <code><nobr>cglobal</nobr></code> macro works similarly. You must
use <code><nobr>cglobal</nobr></code> before defining the symbol in
question, but you would have had to do that anyway if you used
<code><nobr>GLOBAL</nobr></code>.
<p>Also see <a href="nasmdoc2.html#section-2.1.21">section 2.1.21</a>.
<h4><a name="section-7.4.2">7.4.2 Memory Models</a></h4>
<p>NASM contains no mechanism to support the various C memory models
directly; you have to keep track yourself of which one you are writing for.
This means you have to keep track of the following things:
<ul>
<li>In models using a single code segment (tiny, small and compact),
functions are near. This means that function pointers, when stored in data
segments or pushed on the stack as function arguments, are 16 bits long and
contain only an offset field (the <code><nobr>CS</nobr></code> register
never changes its value, and always gives the segment part of the full
function address), and that functions are called using ordinary near
<code><nobr>CALL</nobr></code> instructions and return using
<code><nobr>RETN</nobr></code> (which, in NASM, is synonymous with
<code><nobr>RET</nobr></code> anyway). This means both that you should
write your own routines to return with <code><nobr>RETN</nobr></code>, and
that you should call external C routines with near
<code><nobr>CALL</nobr></code> instructions.
<li>In models using more than one code segment (medium, large and huge),
functions are far. This means that function pointers are 32 bits long
(consisting of a 16-bit offset followed by a 16-bit segment), and that
functions are called using <code><nobr>CALL FAR</nobr></code> (or
<code><nobr>CALL seg:offset</nobr></code>) and return using
<code><nobr>RETF</nobr></code>. Again, you should therefore write your own
routines to return with <code><nobr>RETF</nobr></code> and use
<code><nobr>CALL FAR</nobr></code> to call external routines.
<li>In models using a single data segment (tiny, small and medium), data
pointers are 16 bits long, containing only an offset field (the
<code><nobr>DS</nobr></code> register doesn't change its value, and always
gives the segment part of the full data item address).
<li>In models using more than one data segment (compact, large and huge),
data pointers are 32 bits long, consisting of a 16-bit offset followed by a
16-bit segment. You should still be careful not to modify
<code><nobr>DS</nobr></code> in your routines without restoring it
afterwards, but <code><nobr>ES</nobr></code> is free for you to use to
access the contents of 32-bit data pointers you are passed.
<li>The huge memory model allows single data items to exceed 64K in size.
In all other memory models, you can access the whole of a data item just by
doing arithmetic on the offset field of the pointer you are given, whether
a segment field is present or not; in huge model, you have to be more
careful of your pointer arithmetic.
<li>In most memory models, there is a <em>default</em> data segment, whose
segment address is kept in <code><nobr>DS</nobr></code> throughout the
program. This data segment is typically the same segment as the stack, kept
in <code><nobr>SS</nobr></code>, so that functions' local variables (which
are stored on the stack) and global data items can both be accessed easily
without changing <code><nobr>DS</nobr></code>. Particularly large data
items are typically stored in other segments. However, some memory models
(though not the standard ones, usually) allow the assumption that
<code><nobr>SS</nobr></code> and <code><nobr>DS</nobr></code> hold the same
value to be removed. Be careful about functions' local variables in this
latter case.
</ul>
<p>In models with a single code segment, the segment is called
<code><nobr>_TEXT</nobr></code>, so your code segment must also go by this
name in order to be linked into the same place as the main code segment. In
models with a single data segment, or with a default data segment, it is
called <code><nobr>_DATA</nobr></code>.
<h4><a name="section-7.4.3">7.4.3 Function Definitions and Function Calls</a></h4>
<p>The C calling convention in 16-bit programs is as follows. In the
following description, the words <em>caller</em> and <em>callee</em> are
used to denote the function doing the calling and the function which gets
called.
<ul>
<li>The caller pushes the function's parameters on the stack, one after
another, in reverse order (right to left, so that the first argument
specified to the function is pushed last).
<li>The caller then executes a <code><nobr>CALL</nobr></code> instruction
to pass control to the callee. This <code><nobr>CALL</nobr></code> is
either near or far depending on the memory model.
<li>The callee receives control, and typically (although this is not
actually necessary, in functions which do not need to access their
parameters) starts by saving the value of <code><nobr>SP</nobr></code> in
<code><nobr>BP</nobr></code> so as to be able to use
<code><nobr>BP</nobr></code> as a base pointer to find its parameters on
the stack. However, the caller was probably doing this too, so part of the
calling convention states that <code><nobr>BP</nobr></code> must be
preserved by any C function. Hence the callee, if it is going to set up
<code><nobr>BP</nobr></code> as a <em>frame pointer</em>, must push the
previous value first.
<li>The callee may then access its parameters relative to
<code><nobr>BP</nobr></code>. The word at <code><nobr>[BP]</nobr></code>
holds the previous value of <code><nobr>BP</nobr></code> as it was pushed;
the next word, at <code><nobr>[BP+2]</nobr></code>, holds the offset part
of the return address, pushed implicitly by <code><nobr>CALL</nobr></code>.
In a small-model (near) function, the parameters start after that, at
<code><nobr>[BP+4]</nobr></code>; in a large-model (far) function, the
segment part of the return address lives at
<code><nobr>[BP+4]</nobr></code>, and the parameters begin at
<code><nobr>[BP+6]</nobr></code>. The leftmost parameter of the function,
since it was pushed last, is accessible at this offset from
<code><nobr>BP</nobr></code>; the others follow, at successively greater
offsets. Thus, in a function such as <code><nobr>printf</nobr></code> which
takes a variable number of parameters, the pushing of the parameters in
reverse order means that the function knows where to find its first
parameter, which tells it the number and type of the remaining ones.
<li>The callee may also wish to decrease <code><nobr>SP</nobr></code>
further, so as to allocate space on the stack for local variables, which
will then be accessible at negative offsets from
<code><nobr>BP</nobr></code>.
<li>The callee, if it wishes to return a value to the caller, should leave
the value in <code><nobr>AL</nobr></code>, <code><nobr>AX</nobr></code> or
<code><nobr>DX:AX</nobr></code> depending on the size of the value.
Floating-point results are sometimes (depending on the compiler) returned
in <code><nobr>ST0</nobr></code>.
<li>Once the callee has finished processing, it restores
<code><nobr>SP</nobr></code> from <code><nobr>BP</nobr></code> if it had
allocated local stack space, then pops the previous value of
<code><nobr>BP</nobr></code>, and returns via
<code><nobr>RETN</nobr></code> or <code><nobr>RETF</nobr></code> depending
on memory model.
<li>When the caller regains control from the callee, the function
parameters are still on the stack, so it typically adds an immediate
constant to <code><nobr>SP</nobr></code> to remove them (instead of
executing a number of slow <code><nobr>POP</nobr></code> instructions).
Thus, if a function is accidentally called with the wrong number of
parameters due to a prototype mismatch, the stack will still be returned to
a sensible state since the caller, which <em>knows</em> how many parameters
it pushed, does the removing.
</ul>
<p>It is instructive to compare this calling convention with that for
Pascal programs (described in <a href="#section-7.5.1">section 7.5.1</a>).
Pascal has a simpler convention, since no functions have variable numbers
of parameters. Therefore the callee knows how many parameters it should
have been passed, and is able to deallocate them from the stack itself by
passing an immediate argument to the <code><nobr>RET</nobr></code> or
<code><nobr>RETF</nobr></code> instruction, so the caller does not have to
do it. Also, the parameters are pushed in left-to-right order, not
right-to-left, which means that a compiler can give better guarantees about
sequence points without performance suffering.
<p>Thus, you would define a function in C style in the following way. The
following example is for small model:
<p><pre>
global _myfunc
_myfunc:
push bp
mov bp,sp
sub sp,0x40 ; 64 bytes of local stack space
mov bx,[bp+4] ; first parameter to function
; some more code
mov sp,bp ; undo "sub sp,0x40" above
pop bp
ret
</pre>
<p>For a large-model function, you would replace
<code><nobr>RET</nobr></code> by <code><nobr>RETF</nobr></code>, and look
for the first parameter at <code><nobr>[BP+6]</nobr></code> instead of
<code><nobr>[BP+4]</nobr></code>. Of course, if one of the parameters is a
pointer, then the offsets of <em>subsequent</em> parameters will change
depending on the memory model as well: far pointers take up four bytes on
the stack when passed as a parameter, whereas near pointers take up two.
<p>At the other end of the process, to call a C function from your assembly
code, you would do something like this:
<p><pre>
extern _printf
; and then, further down...
push word [myint] ; one of my integer variables
push word mystring ; pointer into my data segment
call _printf
add sp,byte 4 ; `byte' saves space
; then those data items...
segment _DATA
myint dw 1234
mystring db 'This number -&gt; %d &lt;- should be 1234',10,0
</pre>
<p>This piece of code is the small-model assembly equivalent of the C code
<p><pre>
int myint = 1234;
printf("This number -&gt; %d &lt;- should be 1234\n", myint);
</pre>
<p>In large model, the function-call code might look more like this. In
this example, it is assumed that <code><nobr>DS</nobr></code> already holds
the segment base of the segment <code><nobr>_DATA</nobr></code>. If not,
you would have to initialise it first.
<p><pre>
push word [myint]
push word seg mystring ; Now push the segment, and...
push word mystring ; ... offset of "mystring"
call far _printf
add sp,byte 6
</pre>
<p>The integer value still takes up one word on the stack, since large
model does not affect the size of the <code><nobr>int</nobr></code> data
type. The first argument (pushed last) to <code><nobr>printf</nobr></code>,
however, is a data pointer, and therefore has to contain a segment and
offset part. The segment should be stored second in memory, and therefore
must be pushed first. (Of course, <code><nobr>PUSH DS</nobr></code> would
have been a shorter instruction than
<code><nobr>PUSH WORD SEG mystring</nobr></code>, if
<code><nobr>DS</nobr></code> was set up as the above example assumed.) Then
the actual call becomes a far call, since functions expect far calls in
large model; and <code><nobr>SP</nobr></code> has to be increased by 6
rather than 4 afterwards to make up for the extra word of parameters.
<h4><a name="section-7.4.4">7.4.4 Accessing Data Items</a></h4>
<p>To get at the contents of C variables, or to declare variables which C
can access, you need only declare the names as
<code><nobr>GLOBAL</nobr></code> or <code><nobr>EXTERN</nobr></code>.
(Again, the names require leading underscores, as stated in
<a href="#section-7.4.1">section 7.4.1</a>.) Thus, a C variable declared as
<code><nobr>int i</nobr></code> can be accessed from assembler as
<p><pre>
extern _i
mov ax,[_i]
</pre>
<p>And to declare your own integer variable which C programs can access as
<code><nobr>extern int j</nobr></code>, you do this (making sure you are
assembling in the <code><nobr>_DATA</nobr></code> segment, if necessary):
<p><pre>
global _j
_j dw 0
</pre>
<p>To access a C array, you need to know the size of the components of the
array. For example, <code><nobr>int</nobr></code> variables are two bytes
long, so if a C program declares an array as
<code><nobr>int a[10]</nobr></code>, you can access
<code><nobr>a[3]</nobr></code> by coding
<code><nobr>mov ax,[_a+6]</nobr></code>. (The byte offset 6 is obtained by
multiplying the desired array index, 3, by the size of the array element,
2.) The sizes of the C base types in 16-bit compilers are: 1 for
<code><nobr>char</nobr></code>, 2 for <code><nobr>short</nobr></code> and
<code><nobr>int</nobr></code>, 4 for <code><nobr>long</nobr></code> and
<code><nobr>float</nobr></code>, and 8 for
<code><nobr>double</nobr></code>.
<p>To access a C data structure, you need to know the offset from the base
of the structure to the field you are interested in. You can either do this
by converting the C structure definition into a NASM structure definition
(using <code><nobr>STRUC</nobr></code>), or by calculating the one offset
and using just that.
<p>To do either of these, you should read your C compiler's manual to find
out how it organises data structures. NASM gives no special alignment to
structure members in its own <code><nobr>STRUC</nobr></code> macro, so you
have to specify alignment yourself if the C compiler generates it.
Typically, you might find that a structure like
<p><pre>
struct {
char c;
int i;
} foo;
</pre>
<p>might be four bytes long rather than three, since the
<code><nobr>int</nobr></code> field would be aligned to a two-byte
boundary. However, this sort of feature tends to be a configurable option
in the C compiler, either using command-line options or
<code><nobr>#pragma</nobr></code> lines, so you have to find out how your
own compiler does it.
<h4><a name="section-7.4.5">7.4.5 <code><nobr>c16.mac</nobr></code>: Helper Macros for the 16-bit C Interface</a></h4>
<p>Included in the NASM archives, in the <code><nobr>misc</nobr></code>
directory, is a file <code><nobr>c16.mac</nobr></code> of macros. It
defines three macros: <code><nobr>proc</nobr></code>,
<code><nobr>arg</nobr></code> and <code><nobr>endproc</nobr></code>. These
are intended to be used for C-style procedure definitions, and they
automate a lot of the work involved in keeping track of the calling
convention.
<p>(An alternative, TASM compatible form of <code><nobr>arg</nobr></code>
is also now built into NASM's preprocessor. See
<a href="nasmdoc4.html#section-4.9">section 4.9</a> for details.)
<p>An example of an assembly function using the macro set is given here:
<p><pre>
proc _nearproc
%$i arg
%$j arg
mov ax,[bp + %$i]
mov bx,[bp + %$j]
add ax,[bx]
endproc
</pre>
<p>This defines <code><nobr>_nearproc</nobr></code> to be a procedure
taking two arguments, the first (<code><nobr>i</nobr></code>) an integer
and the second (<code><nobr>j</nobr></code>) a pointer to an integer. It
returns <code><nobr>i + *j</nobr></code>.
<p>Note that the <code><nobr>arg</nobr></code> macro has an
<code><nobr>EQU</nobr></code> as the first line of its expansion, and since
the label before the macro call gets prepended to the first line of the
expanded macro, the <code><nobr>EQU</nobr></code> works, defining
<code><nobr>%$i</nobr></code> to be an offset from
<code><nobr>BP</nobr></code>. A context-local variable is used, local to
the context pushed by the <code><nobr>proc</nobr></code> macro and popped
by the <code><nobr>endproc</nobr></code> macro, so that the same argument
name can be used in later procedures. Of course, you don't <em>have</em> to
do that.
<p>The macro set produces code for near functions (tiny, small and
compact-model code) by default. You can have it generate far functions
(medium, large and huge-model code) by means of coding
<code><nobr>%define FARCODE</nobr></code>. This changes the kind of return
instruction generated by <code><nobr>endproc</nobr></code>, and also
changes the starting point for the argument offsets. The macro set contains
no intrinsic dependency on whether data pointers are far or not.
<p><code><nobr>arg</nobr></code> can take an optional parameter, giving the
size of the argument. If no size is given, 2 is assumed, since it is likely
that many function parameters will be of type
<code><nobr>int</nobr></code>.
<p>The large-model equivalent of the above function would look like this:
<p><pre>
%define FARCODE
proc _farproc
%$i arg
%$j arg 4
mov ax,[bp + %$i]
mov bx,[bp + %$j]
mov es,[bp + %$j + 2]
add ax,[bx]
endproc
</pre>
<p>This makes use of the argument to the <code><nobr>arg</nobr></code>
macro to define a parameter of size 4, because <code><nobr>j</nobr></code>
is now a far pointer. When we load from <code><nobr>j</nobr></code>, we
must load a segment and an offset.
<h3><a name="section-7.5">7.5 Interfacing to Borland Pascal Programs</a></h3>
<p>Interfacing to Borland Pascal programs is similar in concept to
interfacing to 16-bit C programs. The differences are:
<ul>
<li>The leading underscore required for interfacing to C programs is not
required for Pascal.
<li>The memory model is always large: functions are far, data pointers are
far, and no data item can be more than 64K long. (Actually, some functions
are near, but only those functions that are local to a Pascal unit and
never called from outside it. All assembly functions that Pascal calls, and
all Pascal functions that assembly routines are able to call, are far.)
However, all static data declared in a Pascal program goes into the default
data segment, which is the one whose segment address will be in
<code><nobr>DS</nobr></code> when control is passed to your assembly code.
The only things that do not live in the default data segment are local
variables (they live in the stack segment) and dynamically allocated
variables. All data <em>pointers</em>, however, are far.
<li>The function calling convention is different - described below.
<li>Some data types, such as strings, are stored differently.
<li>There are restrictions on the segment names you are allowed to use -
Borland Pascal will ignore code or data declared in a segment it doesn't
like the name of. The restrictions are described below.
</ul>
<h4><a name="section-7.5.1">7.5.1 The Pascal Calling Convention</a></h4>
<p>The 16-bit Pascal calling convention is as follows. In the following
description, the words <em>caller</em> and <em>callee</em> are used to
denote the function doing the calling and the function which gets called.
<ul>
<li>The caller pushes the function's parameters on the stack, one after
another, in normal order (left to right, so that the first argument
specified to the function is pushed first).
<li>The caller then executes a far <code><nobr>CALL</nobr></code>
instruction to pass control to the callee.
<li>The callee receives control, and typically (although this is not
actually necessary, in functions which do not need to access their
parameters) starts by saving the value of <code><nobr>SP</nobr></code> in
<code><nobr>BP</nobr></code> so as to be able to use
<code><nobr>BP</nobr></code> as a base pointer to find its parameters on
the stack. However, the caller was probably doing this too, so part of the
calling convention states that <code><nobr>BP</nobr></code> must be
preserved by any function. Hence the callee, if it is going to set up
<code><nobr>BP</nobr></code> as a frame pointer, must push the previous
value first.
<li>The callee may then access its parameters relative to
<code><nobr>BP</nobr></code>. The word at <code><nobr>[BP]</nobr></code>
holds the previous value of <code><nobr>BP</nobr></code> as it was pushed.
The next word, at <code><nobr>[BP+2]</nobr></code>, holds the offset part
of the return address, and the next one at <code><nobr>[BP+4]</nobr></code>
the segment part. The parameters begin at <code><nobr>[BP+6]</nobr></code>.
The rightmost parameter of the function, since it was pushed last, is
accessible at this offset from <code><nobr>BP</nobr></code>; the others
follow, at successively greater offsets.
<li>The callee may also wish to decrease <code><nobr>SP</nobr></code>
further, so as to allocate space on the stack for local variables, which
will then be accessible at negative offsets from
<code><nobr>BP</nobr></code>.
<li>The callee, if it wishes to return a value to the caller, should leave
the value in <code><nobr>AL</nobr></code>, <code><nobr>AX</nobr></code> or
<code><nobr>DX:AX</nobr></code> depending on the size of the value.
Floating-point results are returned in <code><nobr>ST0</nobr></code>.
Results of type <code><nobr>Real</nobr></code> (Borland's own custom
floating-point data type, not handled directly by the FPU) are returned in
<code><nobr>DX:BX:AX</nobr></code>. To return a result of type
<code><nobr>String</nobr></code>, the caller pushes a pointer to a
temporary string before pushing the parameters, and the callee places the
returned string value at that location. The pointer is not a parameter, and
should not be removed from the stack by the <code><nobr>RETF</nobr></code>
instruction.
<li>Once the callee has finished processing, it restores
<code><nobr>SP</nobr></code> from <code><nobr>BP</nobr></code> if it had
allocated local stack space, then pops the previous value of
<code><nobr>BP</nobr></code>, and returns via
<code><nobr>RETF</nobr></code>. It uses the form of
<code><nobr>RETF</nobr></code> with an immediate parameter, giving the
number of bytes taken up by the parameters on the stack. This causes the
parameters to be removed from the stack as a side effect of the return
instruction.
<li>When the caller regains control from the callee, the function
parameters have already been removed from the stack, so it needs to do
nothing further.
</ul>
<p>Thus, you would define a function in Pascal style, taking two
<code><nobr>Integer</nobr></code>-type parameters, in the following way:
<p><pre>
global myfunc
myfunc: push bp
mov bp,sp
sub sp,0x40 ; 64 bytes of local stack space
mov bx,[bp+8] ; first parameter to function
mov bx,[bp+6] ; second parameter to function
; some more code
mov sp,bp ; undo "sub sp,0x40" above
pop bp
retf 4 ; total size of params is 4
</pre>
<p>At the other end of the process, to call a Pascal function from your
assembly code, you would do something like this:
<p><pre>
extern SomeFunc
; and then, further down...
push word seg mystring ; Now push the segment, and...
push word mystring ; ... offset of "mystring"
push word [myint] ; one of my variables
call far SomeFunc
</pre>
<p>This is equivalent to the Pascal code
<p><pre>
procedure SomeFunc(String: PChar; Int: Integer);
SomeFunc(@mystring, myint);
</pre>
<h4><a name="section-7.5.2">7.5.2 Borland Pascal Segment Name Restrictions</a></h4>
<p>Since Borland Pascal's internal unit file format is completely different
from <code><nobr>OBJ</nobr></code>, it only makes a very sketchy job of
actually reading and understanding the various information contained in a
real <code><nobr>OBJ</nobr></code> file when it links that in. Therefore an
object file intended to be linked to a Pascal program must obey a number of
restrictions:
<ul>
<li>Procedures and functions must be in a segment whose name is either
<code><nobr>CODE</nobr></code>, <code><nobr>CSEG</nobr></code>, or
something ending in <code><nobr>_TEXT</nobr></code>.
<li>Initialised data must be in a segment whose name is either
<code><nobr>CONST</nobr></code> or something ending in
<code><nobr>_DATA</nobr></code>.
<li>Uninitialised data must be in a segment whose name is either
<code><nobr>DATA</nobr></code>, <code><nobr>DSEG</nobr></code>, or
something ending in <code><nobr>_BSS</nobr></code>.
<li>Any other segments in the object file are completely ignored.
<code><nobr>GROUP</nobr></code> directives and segment attributes are also
ignored.
</ul>
<h4><a name="section-7.5.3">7.5.3 Using <code><nobr>c16.mac</nobr></code> With Pascal Programs</a></h4>
<p>The <code><nobr>c16.mac</nobr></code> macro package, described in
<a href="#section-7.4.5">section 7.4.5</a>, can also be used to simplify
writing functions to be called from Pascal programs, if you code
<code><nobr>%define PASCAL</nobr></code>. This definition ensures that
functions are far (it implies <code><nobr>FARCODE</nobr></code>), and also
causes procedure return instructions to be generated with an operand.
<p>Defining <code><nobr>PASCAL</nobr></code> does not change the code which
calculates the argument offsets; you must declare your function's arguments
in reverse order. For example:
<p><pre>
%define PASCAL
proc _pascalproc
%$j arg 4
%$i arg
mov ax,[bp + %$i]
mov bx,[bp + %$j]
mov es,[bp + %$j + 2]
add ax,[bx]
endproc
</pre>
<p>This defines the same routine, conceptually, as the example in
<a href="#section-7.4.5">section 7.4.5</a>: it defines a function taking
two arguments, an integer and a pointer to an integer, which returns the
sum of the integer and the contents of the pointer. The only difference
between this code and the large-model C version is that
<code><nobr>PASCAL</nobr></code> is defined instead of
<code><nobr>FARCODE</nobr></code>, and that the arguments are declared in
reverse order.
<p align=center><a href="nasmdoc8.html">Next Chapter</a> |
<a href="nasmdoc6.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
</body></html>

View File

@@ -0,0 +1,482 @@
<html><head><title>NASM Manual</title></head>
<body><h1 align=center>The Netwide Assembler: NASM</h1>
<p align=center><a href="nasmdoc9.html">Next Chapter</a> |
<a href="nasmdoc7.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
<h2><a name="chapter-8">Chapter 8: Writing 32-bit Code (Unix, Win32, DJGPP)</a></h2>
<p>This chapter attempts to cover some of the common issues involved when
writing 32-bit code, to run under Win32 or Unix, or to be linked with C
code generated by a Unix-style C compiler such as DJGPP. It covers how to
write assembly code to interface with 32-bit C routines, and how to write
position-independent code for shared libraries.
<p>Almost all 32-bit code, and in particular all code running under
<code><nobr>Win32</nobr></code>, <code><nobr>DJGPP</nobr></code> or any of
the PC Unix variants, runs in <em>flat</em> memory model. This means that
the segment registers and paging have already been set up to give you the
same 32-bit 4Gb address space no matter what segment you work relative to,
and that you should ignore all segment registers completely. When writing
flat-model application code, you never need to use a segment override or
modify any segment register, and the code-section addresses you pass to
<code><nobr>CALL</nobr></code> and <code><nobr>JMP</nobr></code> live in
the same address space as the data-section addresses you access your
variables by and the stack-section addresses you access local variables and
procedure parameters by. Every address is 32 bits long and contains only an
offset part.
<h3><a name="section-8.1">8.1 Interfacing to 32-bit C Programs</a></h3>
<p>A lot of the discussion in <a href="nasmdoc7.html#section-7.4">section
7.4</a>, about interfacing to 16-bit C programs, still applies when working
in 32 bits. The absence of memory models or segmentation worries simplifies
things a lot.
<h4><a name="section-8.1.1">8.1.1 External Symbol Names</a></h4>
<p>Most 32-bit C compilers share the convention used by 16-bit compilers,
that the names of all global symbols (functions or data) they define are
formed by prefixing an underscore to the name as it appears in the C
program. However, not all of them do: the <code><nobr>ELF</nobr></code>
specification states that C symbols do <em>not</em> have a leading
underscore on their assembly-language names.
<p>The older Linux <code><nobr>a.out</nobr></code> C compiler, all
<code><nobr>Win32</nobr></code> compilers, <code><nobr>DJGPP</nobr></code>,
and <code><nobr>NetBSD</nobr></code> and <code><nobr>FreeBSD</nobr></code>,
all use the leading underscore; for these compilers, the macros
<code><nobr>cextern</nobr></code> and <code><nobr>cglobal</nobr></code>, as
given in <a href="nasmdoc7.html#section-7.4.1">section 7.4.1</a>, will
still work. For <code><nobr>ELF</nobr></code>, though, the leading
underscore should not be used.
<p>See also <a href="nasmdoc2.html#section-2.1.21">section 2.1.21</a>.
<h4><a name="section-8.1.2">8.1.2 Function Definitions and Function Calls</a></h4>
<p>The C calling conventionThe C calling convention in 32-bit programs is
as follows. In the following description, the words <em>caller</em> and
<em>callee</em> are used to denote the function doing the calling and the
function which gets called.
<ul>
<li>The caller pushes the function's parameters on the stack, one after
another, in reverse order (right to left, so that the first argument
specified to the function is pushed last).
<li>The caller then executes a near <code><nobr>CALL</nobr></code>
instruction to pass control to the callee.
<li>The callee receives control, and typically (although this is not
actually necessary, in functions which do not need to access their
parameters) starts by saving the value of <code><nobr>ESP</nobr></code> in
<code><nobr>EBP</nobr></code> so as to be able to use
<code><nobr>EBP</nobr></code> as a base pointer to find its parameters on
the stack. However, the caller was probably doing this too, so part of the
calling convention states that <code><nobr>EBP</nobr></code> must be
preserved by any C function. Hence the callee, if it is going to set up
<code><nobr>EBP</nobr></code> as a frame pointer, must push the previous
value first.
<li>The callee may then access its parameters relative to
<code><nobr>EBP</nobr></code>. The doubleword at
<code><nobr>[EBP]</nobr></code> holds the previous value of
<code><nobr>EBP</nobr></code> as it was pushed; the next doubleword, at
<code><nobr>[EBP+4]</nobr></code>, holds the return address, pushed
implicitly by <code><nobr>CALL</nobr></code>. The parameters start after
that, at <code><nobr>[EBP+8]</nobr></code>. The leftmost parameter of the
function, since it was pushed last, is accessible at this offset from
<code><nobr>EBP</nobr></code>; the others follow, at successively greater
offsets. Thus, in a function such as <code><nobr>printf</nobr></code> which
takes a variable number of parameters, the pushing of the parameters in
reverse order means that the function knows where to find its first
parameter, which tells it the number and type of the remaining ones.
<li>The callee may also wish to decrease <code><nobr>ESP</nobr></code>
further, so as to allocate space on the stack for local variables, which
will then be accessible at negative offsets from
<code><nobr>EBP</nobr></code>.
<li>The callee, if it wishes to return a value to the caller, should leave
the value in <code><nobr>AL</nobr></code>, <code><nobr>AX</nobr></code> or
<code><nobr>EAX</nobr></code> depending on the size of the value.
Floating-point results are typically returned in
<code><nobr>ST0</nobr></code>.
<li>Once the callee has finished processing, it restores
<code><nobr>ESP</nobr></code> from <code><nobr>EBP</nobr></code> if it had
allocated local stack space, then pops the previous value of
<code><nobr>EBP</nobr></code>, and returns via
<code><nobr>RET</nobr></code> (equivalently,
<code><nobr>RETN</nobr></code>).
<li>When the caller regains control from the callee, the function
parameters are still on the stack, so it typically adds an immediate
constant to <code><nobr>ESP</nobr></code> to remove them (instead of
executing a number of slow <code><nobr>POP</nobr></code> instructions).
Thus, if a function is accidentally called with the wrong number of
parameters due to a prototype mismatch, the stack will still be returned to
a sensible state since the caller, which <em>knows</em> how many parameters
it pushed, does the removing.
</ul>
<p>There is an alternative calling convention used by Win32 programs for
Windows API calls, and also for functions called <em>by</em> the Windows
API such as window procedures: they follow what Microsoft calls the
<code><nobr>__stdcall</nobr></code> convention. This is slightly closer to
the Pascal convention, in that the callee clears the stack by passing a
parameter to the <code><nobr>RET</nobr></code> instruction. However, the
parameters are still pushed in right-to-left order.
<p>Thus, you would define a function in C style in the following way:
<p><pre>
global _myfunc
_myfunc:
push ebp
mov ebp,esp
sub esp,0x40 ; 64 bytes of local stack space
mov ebx,[ebp+8] ; first parameter to function
; some more code
leave ; mov esp,ebp / pop ebp
ret
</pre>
<p>At the other end of the process, to call a C function from your assembly
code, you would do something like this:
<p><pre>
extern _printf
; and then, further down...
push dword [myint] ; one of my integer variables
push dword mystring ; pointer into my data segment
call _printf
add esp,byte 8 ; `byte' saves space
; then those data items...
segment _DATA
myint dd 1234
mystring db 'This number -&gt; %d &lt;- should be 1234',10,0
</pre>
<p>This piece of code is the assembly equivalent of the C code
<p><pre>
int myint = 1234;
printf("This number -&gt; %d &lt;- should be 1234\n", myint);
</pre>
<h4><a name="section-8.1.3">8.1.3 Accessing Data Items</a></h4>
<p>To get at the contents of C variables, or to declare variables which C
can access, you need only declare the names as
<code><nobr>GLOBAL</nobr></code> or <code><nobr>EXTERN</nobr></code>.
(Again, the names require leading underscores, as stated in
<a href="#section-8.1.1">section 8.1.1</a>.) Thus, a C variable declared as
<code><nobr>int i</nobr></code> can be accessed from assembler as
<p><pre>
extern _i
mov eax,[_i]
</pre>
<p>And to declare your own integer variable which C programs can access as
<code><nobr>extern int j</nobr></code>, you do this (making sure you are
assembling in the <code><nobr>_DATA</nobr></code> segment, if necessary):
<p><pre>
global _j
_j dd 0
</pre>
<p>To access a C array, you need to know the size of the components of the
array. For example, <code><nobr>int</nobr></code> variables are four bytes
long, so if a C program declares an array as
<code><nobr>int a[10]</nobr></code>, you can access
<code><nobr>a[3]</nobr></code> by coding
<code><nobr>mov ax,[_a+12]</nobr></code>. (The byte offset 12 is obtained
by multiplying the desired array index, 3, by the size of the array
element, 4.) The sizes of the C base types in 32-bit compilers are: 1 for
<code><nobr>char</nobr></code>, 2 for <code><nobr>short</nobr></code>, 4
for <code><nobr>int</nobr></code>, <code><nobr>long</nobr></code> and
<code><nobr>float</nobr></code>, and 8 for
<code><nobr>double</nobr></code>. Pointers, being 32-bit addresses, are
also 4 bytes long.
<p>To access a C data structure, you need to know the offset from the base
of the structure to the field you are interested in. You can either do this
by converting the C structure definition into a NASM structure definition
(using <code><nobr>STRUC</nobr></code>), or by calculating the one offset
and using just that.
<p>To do either of these, you should read your C compiler's manual to find
out how it organises data structures. NASM gives no special alignment to
structure members in its own <code><nobr>STRUC</nobr></code> macro, so you
have to specify alignment yourself if the C compiler generates it.
Typically, you might find that a structure like
<p><pre>
struct {
char c;
int i;
} foo;
</pre>
<p>might be eight bytes long rather than five, since the
<code><nobr>int</nobr></code> field would be aligned to a four-byte
boundary. However, this sort of feature is sometimes a configurable option
in the C compiler, either using command-line options or
<code><nobr>#pragma</nobr></code> lines, so you have to find out how your
own compiler does it.
<h4><a name="section-8.1.4">8.1.4 <code><nobr>c32.mac</nobr></code>: Helper Macros for the 32-bit C Interface</a></h4>
<p>Included in the NASM archives, in the <code><nobr>misc</nobr></code>
directory, is a file <code><nobr>c32.mac</nobr></code> of macros. It
defines three macros: <code><nobr>proc</nobr></code>,
<code><nobr>arg</nobr></code> and <code><nobr>endproc</nobr></code>. These
are intended to be used for C-style procedure definitions, and they
automate a lot of the work involved in keeping track of the calling
convention.
<p>An example of an assembly function using the macro set is given here:
<p><pre>
proc _proc32
%$i arg
%$j arg
mov eax,[ebp + %$i]
mov ebx,[ebp + %$j]
add eax,[ebx]
endproc
</pre>
<p>This defines <code><nobr>_proc32</nobr></code> to be a procedure taking
two arguments, the first (<code><nobr>i</nobr></code>) an integer and the
second (<code><nobr>j</nobr></code>) a pointer to an integer. It returns
<code><nobr>i + *j</nobr></code>.
<p>Note that the <code><nobr>arg</nobr></code> macro has an
<code><nobr>EQU</nobr></code> as the first line of its expansion, and since
the label before the macro call gets prepended to the first line of the
expanded macro, the <code><nobr>EQU</nobr></code> works, defining
<code><nobr>%$i</nobr></code> to be an offset from
<code><nobr>BP</nobr></code>. A context-local variable is used, local to
the context pushed by the <code><nobr>proc</nobr></code> macro and popped
by the <code><nobr>endproc</nobr></code> macro, so that the same argument
name can be used in later procedures. Of course, you don't <em>have</em> to
do that.
<p><code><nobr>arg</nobr></code> can take an optional parameter, giving the
size of the argument. If no size is given, 4 is assumed, since it is likely
that many function parameters will be of type <code><nobr>int</nobr></code>
or pointers.
<h3><a name="section-8.2">8.2 Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF Shared Libraries</a></h3>
<p><code><nobr>ELF</nobr></code> replaced the older
<code><nobr>a.out</nobr></code> object file format under Linux because it
contains support for position-independent code (PIC), which makes writing
shared libraries much easier. NASM supports the
<code><nobr>ELF</nobr></code> position-independent code features, so you
can write Linux <code><nobr>ELF</nobr></code> shared libraries in NASM.
<p>NetBSD, and its close cousins FreeBSD and OpenBSD, take a different
approach by hacking PIC support into the <code><nobr>a.out</nobr></code>
format. NASM supports this as the <code><nobr>aoutb</nobr></code> output
format, so you can write BSD shared libraries in NASM too.
<p>The operating system loads a PIC shared library by memory-mapping the
library file at an arbitrarily chosen point in the address space of the
running process. The contents of the library's code section must therefore
not depend on where it is loaded in memory.
<p>Therefore, you cannot get at your variables by writing code like this:
<p><pre>
mov eax,[myvar] ; WRONG
</pre>
<p>Instead, the linker provides an area of memory called the <em>global
offset table</em>, or GOT; the GOT is situated at a constant distance from
your library's code, so if you can find out where your library is loaded
(which is typically done using a <code><nobr>CALL</nobr></code> and
<code><nobr>POP</nobr></code> combination), you can obtain the address of
the GOT, and you can then load the addresses of your variables out of
linker-generated entries in the GOT.
<p>The <em>data</em> section of a PIC shared library does not have these
restrictions: since the data section is writable, it has to be copied into
memory anyway rather than just paged in from the library file, so as long
as it's being copied it can be relocated too. So you can put ordinary types
of relocation in the data section without too much worry (but see
<a href="#section-8.2.4">section 8.2.4</a> for a caveat).
<h4><a name="section-8.2.1">8.2.1 Obtaining the Address of the GOT</a></h4>
<p>Each code module in your shared library should define the GOT as an
external symbol:
<p><pre>
extern _GLOBAL_OFFSET_TABLE_ ; in ELF
extern __GLOBAL_OFFSET_TABLE_ ; in BSD a.out
</pre>
<p>At the beginning of any function in your shared library which plans to
access your data or BSS sections, you must first calculate the address of
the GOT. This is typically done by writing the function in this form:
<p><pre>
func: push ebp
mov ebp,esp
push ebx
call .get_GOT
.get_GOT:
pop ebx
add ebx,_GLOBAL_OFFSET_TABLE_+$$-.get_GOT wrt ..gotpc
; the function body comes here
mov ebx,[ebp-4]
mov esp,ebp
pop ebp
ret
</pre>
<p>(For BSD, again, the symbol
<code><nobr>_GLOBAL_OFFSET_TABLE</nobr></code> requires a second leading
underscore.)
<p>The first two lines of this function are simply the standard C prologue
to set up a stack frame, and the last three lines are standard C function
epilogue. The third line, and the fourth to last line, save and restore the
<code><nobr>EBX</nobr></code> register, because PIC shared libraries use
this register to store the address of the GOT.
<p>The interesting bit is the <code><nobr>CALL</nobr></code> instruction
and the following two lines. The <code><nobr>CALL</nobr></code> and
<code><nobr>POP</nobr></code> combination obtains the address of the label
<code><nobr>.get_GOT</nobr></code>, without having to know in advance where
the program was loaded (since the <code><nobr>CALL</nobr></code>
instruction is encoded relative to the current position). The
<code><nobr>ADD</nobr></code> instruction makes use of one of the special
PIC relocation types: GOTPC relocation. With the
<code><nobr>WRT ..gotpc</nobr></code> qualifier specified, the symbol
referenced (here <code><nobr>_GLOBAL_OFFSET_TABLE_</nobr></code>, the
special symbol assigned to the GOT) is given as an offset from the
beginning of the section. (Actually, <code><nobr>ELF</nobr></code> encodes
it as the offset from the operand field of the
<code><nobr>ADD</nobr></code> instruction, but NASM simplifies this
deliberately, so you do things the same way for both
<code><nobr>ELF</nobr></code> and <code><nobr>BSD</nobr></code>.) So the
instruction then <em>adds</em> the beginning of the section, to get the
real address of the GOT, and subtracts the value of
<code><nobr>.get_GOT</nobr></code> which it knows is in
<code><nobr>EBX</nobr></code>. Therefore, by the time that instruction has
finished, <code><nobr>EBX</nobr></code> contains the address of the GOT.
<p>If you didn't follow that, don't worry: it's never necessary to obtain
the address of the GOT by any other means, so you can put those three
instructions into a macro and safely ignore them:
<p><pre>
%macro get_GOT 0
call %%getgot
%%getgot:
pop ebx
add ebx,_GLOBAL_OFFSET_TABLE_+$$-%%getgot wrt ..gotpc
%endmacro
</pre>
<h4><a name="section-8.2.2">8.2.2 Finding Your Local Data Items</a></h4>
<p>Having got the GOT, you can then use it to obtain the addresses of your
data items. Most variables will reside in the sections you have declared;
they can be accessed using the <code><nobr>..gotoff</nobr></code> special
<code><nobr>WRT</nobr></code> type. The way this works is like this:
<p><pre>
lea eax,[ebx+myvar wrt ..gotoff]
</pre>
<p>The expression <code><nobr>myvar wrt ..gotoff</nobr></code> is
calculated, when the shared library is linked, to be the offset to the
local variable <code><nobr>myvar</nobr></code> from the beginning of the
GOT. Therefore, adding it to <code><nobr>EBX</nobr></code> as above will
place the real address of <code><nobr>myvar</nobr></code> in
<code><nobr>EAX</nobr></code>.
<p>If you declare variables as <code><nobr>GLOBAL</nobr></code> without
specifying a size for them, they are shared between code modules in the
library, but do not get exported from the library to the program that
loaded it. They will still be in your ordinary data and BSS sections, so
you can access them in the same way as local variables, using the above
<code><nobr>..gotoff</nobr></code> mechanism.
<p>Note that due to a peculiarity of the way BSD
<code><nobr>a.out</nobr></code> format handles this relocation type, there
must be at least one non-local symbol in the same section as the address
you're trying to access.
<h4><a name="section-8.2.3">8.2.3 Finding External and Common Data Items</a></h4>
<p>If your library needs to get at an external variable (external to the
<em>library</em>, not just to one of the modules within it), you must use
the <code><nobr>..got</nobr></code> type to get at it. The
<code><nobr>..got</nobr></code> type, instead of giving you the offset from
the GOT base to the variable, gives you the offset from the GOT base to a
GOT <em>entry</em> containing the address of the variable. The linker will
set up this GOT entry when it builds the library, and the dynamic linker
will place the correct address in it at load time. So to obtain the address
of an external variable <code><nobr>extvar</nobr></code> in
<code><nobr>EAX</nobr></code>, you would code
<p><pre>
mov eax,[ebx+extvar wrt ..got]
</pre>
<p>This loads the address of <code><nobr>extvar</nobr></code> out of an
entry in the GOT. The linker, when it builds the shared library, collects
together every relocation of type <code><nobr>..got</nobr></code>, and
builds the GOT so as to ensure it has every necessary entry present.
<p>Common variables must also be accessed in this way.
<h4><a name="section-8.2.4">8.2.4 Exporting Symbols to the Library User</a></h4>
<p>If you want to export symbols to the user of the library, you have to
declare whether they are functions or data, and if they are data, you have
to give the size of the data item. This is because the dynamic linker has
to build procedure linkage table entries for any exported functions, and
also moves exported data items away from the library's data section in
which they were declared.
<p>So to export a function to users of the library, you must use
<p><pre>
global func:function ; declare it as a function
func: push ebp
; etc.
</pre>
<p>And to export a data item such as an array, you would have to code
<p><pre>
global array:data array.end-array ; give the size too
array: resd 128
.end:
</pre>
<p>Be careful: If you export a variable to the library user, by declaring
it as <code><nobr>GLOBAL</nobr></code> and supplying a size, the variable
will end up living in the data section of the main program, rather than in
your library's data section, where you declared it. So you will have to
access your own global variable with the <code><nobr>..got</nobr></code>
mechanism rather than <code><nobr>..gotoff</nobr></code>, as if it were
external (which, effectively, it has become).
<p>Equally, if you need to store the address of an exported global in one
of your data sections, you can't do it by means of the standard sort of
code:
<p><pre>
dataptr: dd global_data_item ; WRONG
</pre>
<p>NASM will interpret this code as an ordinary relocation, in which
<code><nobr>global_data_item</nobr></code> is merely an offset from the
beginning of the <code><nobr>.data</nobr></code> section (or whatever); so
this reference will end up pointing at your data section instead of at the
exported global which resides elsewhere.
<p>Instead of the above code, then, you must write
<p><pre>
dataptr: dd global_data_item wrt ..sym
</pre>
<p>which makes use of the special <code><nobr>WRT</nobr></code> type
<code><nobr>..sym</nobr></code> to instruct NASM to search the symbol table
for a particular symbol at that address, rather than just relocating by
section base.
<p>Either method will work for functions: referring to one of your
functions by means of
<p><pre>
funcptr: dd my_function
</pre>
<p>will give the user the address of the code you wrote, whereas
<p><pre>
funcptr: dd my_function wrt .sym
</pre>
<p>will give the address of the procedure linkage table for the function,
which is where the calling program will <em>believe</em> the function
lives. Either address is a valid way to call the function.
<h4><a name="section-8.2.5">8.2.5 Calling Procedures Outside the Library</a></h4>
<p>Calling procedures outside your shared library has to be done by means
of a <em>procedure linkage table</em>, or PLT. The PLT is placed at a known
offset from where the library is loaded, so the library code can make calls
to the PLT in a position-independent way. Within the PLT there is code to
jump to offsets contained in the GOT, so function calls to other shared
libraries or to routines in the main program can be transparently passed
off to their real destinations.
<p>To call an external routine, you must use another special PIC relocation
type, <code><nobr>WRT ..plt</nobr></code>. This is much easier than the
GOT-based ones: you simply replace calls such as
<code><nobr>CALL printf</nobr></code> with the PLT-relative version
<code><nobr>CALL printf WRT ..plt</nobr></code>.
<h4><a name="section-8.2.6">8.2.6 Generating the Library File</a></h4>
<p>Having written some code modules and assembled them to
<code><nobr>.o</nobr></code> files, you then generate your shared library
with a command such as
<p><pre>
ld -shared -o library.so module1.o module2.o # for ELF
ld -Bshareable -o library.so module1.o module2.o # for BSD
</pre>
<p>For ELF, if your shared library is going to reside in system directories
such as <code><nobr>/usr/lib</nobr></code> or
<code><nobr>/lib</nobr></code>, it is usually worth using the
<code><nobr>-soname</nobr></code> flag to the linker, to store the final
library file name, with a version number, into the library:
<p><pre>
ld -shared -soname library.so.1 -o library.so.1.2 *.o
</pre>
<p>You would then copy <code><nobr>library.so.1.2</nobr></code> into the
library directory, and create <code><nobr>library.so.1</nobr></code> as a
symbolic link to it.
<p align=center><a href="nasmdoc9.html">Next Chapter</a> |
<a href="nasmdoc7.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
</body></html>

View File

@@ -0,0 +1,175 @@
<html><head><title>NASM Manual</title></head>
<body><h1 align=center>The Netwide Assembler: NASM</h1>
<p align=center><a href="nasmdo10.html">Next Chapter</a> |
<a href="nasmdoc8.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
<h2><a name="chapter-9">Chapter 9: Mixing 16 and 32 Bit Code</a></h2>
<p>This chapter tries to cover some of the issues, largely related to
unusual forms of addressing and jump instructions, encountered when writing
operating system code such as protected-mode initialisation routines, which
require code that operates in mixed segment sizes, such as code in a 16-bit
segment trying to modify data in a 32-bit one, or jumps between
different-size segments.
<h3><a name="section-9.1">9.1 Mixed-Size Jumps</a></h3>
<p>The most common form of mixed-size instruction is the one used when
writing a 32-bit OS: having done your setup in 16-bit mode, such as loading
the kernel, you then have to boot it by switching into protected mode and
jumping to the 32-bit kernel start address. In a fully 32-bit OS, this
tends to be the <em>only</em> mixed-size instruction you need, since
everything before it can be done in pure 16-bit code, and everything after
it can be pure 32-bit.
<p>This jump must specify a 48-bit far address, since the target segment is
a 32-bit one. However, it must be assembled in a 16-bit segment, so just
coding, for example,
<p><pre>
jmp 0x1234:0x56789ABC ; wrong!
</pre>
<p>will not work, since the offset part of the address will be truncated to
<code><nobr>0x9ABC</nobr></code> and the jump will be an ordinary 16-bit
far one.
<p>The Linux kernel setup code gets round the inability of
<code><nobr>as86</nobr></code> to generate the required instruction by
coding it manually, using <code><nobr>DB</nobr></code> instructions. NASM
can go one better than that, by actually generating the right instruction
itself. Here's how to do it right:
<p><pre>
jmp dword 0x1234:0x56789ABC ; right
</pre>
<p>The <code><nobr>DWORD</nobr></code> prefix (strictly speaking, it should
come <em>after</em> the colon, since it is declaring the <em>offset</em>
field to be a doubleword; but NASM will accept either form, since both are
unambiguous) forces the offset part to be treated as far, in the assumption
that you are deliberately writing a jump from a 16-bit segment to a 32-bit
one.
<p>You can do the reverse operation, jumping from a 32-bit segment to a
16-bit one, by means of the <code><nobr>WORD</nobr></code> prefix:
<p><pre>
jmp word 0x8765:0x4321 ; 32 to 16 bit
</pre>
<p>If the <code><nobr>WORD</nobr></code> prefix is specified in 16-bit
mode, or the <code><nobr>DWORD</nobr></code> prefix in 32-bit mode, they
will be ignored, since each is explicitly forcing NASM into a mode it was
in anyway.
<h3><a name="section-9.2">9.2 Addressing Between Different-Size Segments</a></h3>
<p>If your OS is mixed 16 and 32-bit, or if you are writing a DOS extender,
you are likely to have to deal with some 16-bit segments and some 32-bit
ones. At some point, you will probably end up writing code in a 16-bit
segment which has to access data in a 32-bit segment, or vice versa.
<p>If the data you are trying to access in a 32-bit segment lies within the
first 64K of the segment, you may be able to get away with using an
ordinary 16-bit addressing operation for the purpose; but sooner or later,
you will want to do 32-bit addressing from 16-bit mode.
<p>The easiest way to do this is to make sure you use a register for the
address, since any effective address containing a 32-bit register is forced
to be a 32-bit address. So you can do
<p><pre>
mov eax,offset_into_32_bit_segment_specified_by_fs
mov dword [fs:eax],0x11223344
</pre>
<p>This is fine, but slightly cumbersome (since it wastes an instruction
and a register) if you already know the precise offset you are aiming at.
The x86 architecture does allow 32-bit effective addresses to specify
nothing but a 4-byte offset, so why shouldn't NASM be able to generate the
best instruction for the purpose?
<p>It can. As in <a href="#section-9.1">section 9.1</a>, you need only
prefix the address with the <code><nobr>DWORD</nobr></code> keyword, and it
will be forced to be a 32-bit address:
<p><pre>
mov dword [fs:dword my_offset],0x11223344
</pre>
<p>Also as in <a href="#section-9.1">section 9.1</a>, NASM is not fussy
about whether the <code><nobr>DWORD</nobr></code> prefix comes before or
after the segment override, so arguably a nicer-looking way to code the
above instruction is
<p><pre>
mov dword [dword fs:my_offset],0x11223344
</pre>
<p>Don't confuse the <code><nobr>DWORD</nobr></code> prefix
<em>outside</em> the square brackets, which controls the size of the data
stored at the address, with the one <code><nobr>inside</nobr></code> the
square brackets which controls the length of the address itself. The two
can quite easily be different:
<p><pre>
mov word [dword 0x12345678],0x9ABC
</pre>
<p>This moves 16 bits of data to an address specified by a 32-bit offset.
<p>You can also specify <code><nobr>WORD</nobr></code> or
<code><nobr>DWORD</nobr></code> prefixes along with the
<code><nobr>FAR</nobr></code> prefix to indirect far jumps or calls. For
example:
<p><pre>
call dword far [fs:word 0x4321]
</pre>
<p>This instruction contains an address specified by a 16-bit offset; it
loads a 48-bit far pointer from that (16-bit segment and 32-bit offset),
and calls that address.
<h3><a name="section-9.3">9.3 Other Mixed-Size Instructions</a></h3>
<p>The other way you might want to access data might be using the string
instructions (<code><nobr>LODSx</nobr></code>,
<code><nobr>STOSx</nobr></code> and so on) or the
<code><nobr>XLATB</nobr></code> instruction. These instructions, since they
take no parameters, might seem to have no easy way to make them perform
32-bit addressing when assembled in a 16-bit segment.
<p>This is the purpose of NASM's <code><nobr>a16</nobr></code> and
<code><nobr>a32</nobr></code> prefixes. If you are coding
<code><nobr>LODSB</nobr></code> in a 16-bit segment but it is supposed to
be accessing a string in a 32-bit segment, you should load the desired
address into <code><nobr>ESI</nobr></code> and then code
<p><pre>
a32 lodsb
</pre>
<p>The prefix forces the addressing size to 32 bits, meaning that
<code><nobr>LODSB</nobr></code> loads from
<code><nobr>[DS:ESI]</nobr></code> instead of
<code><nobr>[DS:SI]</nobr></code>. To access a string in a 16-bit segment
when coding in a 32-bit one, the corresponding
<code><nobr>a16</nobr></code> prefix can be used.
<p>The <code><nobr>a16</nobr></code> and <code><nobr>a32</nobr></code>
prefixes can be applied to any instruction in NASM's instruction table, but
most of them can generate all the useful forms without them. The prefixes
are necessary only for instructions with implicit addressing:
<code><nobr>CMPSx</nobr></code>
(<a href="nasmdocb.html#section-B.4.27">section B.4.27</a>),
<code><nobr>SCASx</nobr></code>
(<a href="nasmdocb.html#section-B.4.286">section B.4.286</a>),
<code><nobr>LODSx</nobr></code>
(<a href="nasmdocb.html#section-B.4.141">section B.4.141</a>),
<code><nobr>STOSx</nobr></code>
(<a href="nasmdocb.html#section-B.4.303">section B.4.303</a>),
<code><nobr>MOVSx</nobr></code>
(<a href="nasmdocb.html#section-B.4.178">section B.4.178</a>),
<code><nobr>INSx</nobr></code>
(<a href="nasmdocb.html#section-B.4.121">section B.4.121</a>),
<code><nobr>OUTSx</nobr></code>
(<a href="nasmdocb.html#section-B.4.195">section B.4.195</a>), and
<code><nobr>XLATB</nobr></code>
(<a href="nasmdocb.html#section-B.4.334">section B.4.334</a>). Also, the
various push and pop instructions (<code><nobr>PUSHA</nobr></code> and
<code><nobr>POPF</nobr></code> as well as the more usual
<code><nobr>PUSH</nobr></code> and <code><nobr>POP</nobr></code>) can
accept <code><nobr>a16</nobr></code> or <code><nobr>a32</nobr></code>
prefixes to force a particular one of <code><nobr>SP</nobr></code> or
<code><nobr>ESP</nobr></code> to be used as a stack pointer, in case the
stack segment in use is a different size from the code segment.
<p><code><nobr>PUSH</nobr></code> and <code><nobr>POP</nobr></code>, when
applied to segment registers in 32-bit mode, also have the slightly odd
behaviour that they push and pop 4 bytes at a time, of which the top two
are ignored and the bottom two give the value of the segment register being
manipulated. To force the 16-bit behaviour of segment-register push and pop
instructions, you can use the operand-size prefix
<code><nobr>o16</nobr></code>:
<p><pre>
o16 push ss
o16 push ds
</pre>
<p>This code saves a doubleword of stack space by fitting two segment
registers into the space which would normally be consumed by pushing one.
<p>(You can also use the <code><nobr>o32</nobr></code> prefix to force the
32-bit behaviour when in 16-bit mode, but this seems less useful.)
<p align=center><a href="nasmdo10.html">Next Chapter</a> |
<a href="nasmdoc8.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
</body></html>

View File

@@ -0,0 +1,177 @@
<html><head><title>NASM Manual</title></head>
<body><h1 align=center>The Netwide Assembler: NASM</h1>
<p align=center><a href="nasmdocb.html">Next Chapter</a> |
<a href="nasmdo10.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
<h2><a name="appendix-A">Appendix A: Ndisasm</a></h2>
<p>The Netwide Disassembler, NDISASM
<h3><a name="section-A.1">A.1 Introduction</a></h3>
<p>The Netwide Disassembler is a small companion program to the Netwide
Assembler, NASM. It seemed a shame to have an x86 assembler, complete with
a full instruction table, and not make as much use of it as possible, so
here's a disassembler which shares the instruction table (and some other
bits of code) with NASM.
<p>The Netwide Disassembler does nothing except to produce disassemblies of
<em>binary</em> source files. NDISASM does not have any understanding of
object file formats, like <code><nobr>objdump</nobr></code>, and it will
not understand <code><nobr>DOS .EXE</nobr></code> files like
<code><nobr>debug</nobr></code> will. It just disassembles.
<h3><a name="section-A.2">A.2 Getting Started: Installation</a></h3>
<p>See <a href="nasmdoc1.html#section-1.3">section 1.3</a> for installation
instructions. NDISASM, like NASM, has a <code><nobr>man page</nobr></code>
which you may want to put somewhere useful, if you are on a Unix system.
<h3><a name="section-A.3">A.3 Running NDISASM</a></h3>
<p>To disassemble a file, you will typically use a command of the form
<p><pre>
ndisasm [-b16 | -b32] filename
</pre>
<p>NDISASM can disassemble 16-bit code or 32-bit code equally easily,
provided of course that you remember to specify which it is to work with.
If no <code><nobr>-b</nobr></code> switch is present, NDISASM works in
16-bit mode by default. The <code><nobr>-u</nobr></code> switch (for USE32)
also invokes 32-bit mode.
<p>Two more command line options are <code><nobr>-r</nobr></code> which
reports the version number of NDISASM you are running, and
<code><nobr>-h</nobr></code> which gives a short summary of command line
options.
<h4><a name="section-A.3.1">A.3.1 COM Files: Specifying an Origin</a></h4>
<p>To disassemble a <code><nobr>DOS .COM</nobr></code> file correctly, a
disassembler must assume that the first instruction in the file is loaded
at address <code><nobr>0x100</nobr></code>, rather than at zero. NDISASM,
which assumes by default that any file you give it is loaded at zero, will
therefore need to be informed of this.
<p>The <code><nobr>-o</nobr></code> option allows you to declare a
different origin for the file you are disassembling. Its argument may be
expressed in any of the NASM numeric formats: decimal by default, if it
begins with `<code><nobr>$</nobr></code>' or `<code><nobr>0x</nobr></code>'
or ends in `<code><nobr>H</nobr></code>' it's
<code><nobr>hex</nobr></code>, if it ends in `<code><nobr>Q</nobr></code>'
it's <code><nobr>octal</nobr></code>, and if it ends in
`<code><nobr>B</nobr></code>' it's <code><nobr>binary</nobr></code>.
<p>Hence, to disassemble a <code><nobr>.COM</nobr></code> file:
<p><pre>
ndisasm -o100h filename.com
</pre>
<p>will do the trick.
<h4><a name="section-A.3.2">A.3.2 Code Following Data: Synchronisation</a></h4>
<p>Suppose you are disassembling a file which contains some data which
isn't machine code, and <em>then</em> contains some machine code. NDISASM
will faithfully plough through the data section, producing machine
instructions wherever it can (although most of them will look bizarre, and
some may have unusual prefixes, e.g.
`<code><nobr>FS OR AX,0x240A</nobr></code>'), and generating `DB'
instructions ever so often if it's totally stumped. Then it will reach the
code section.
<p>Supposing NDISASM has just finished generating a strange machine
instruction from part of the data section, and its file position is now one
byte <em>before</em> the beginning of the code section. It's entirely
possible that another spurious instruction will get generated, starting
with the final byte of the data section, and then the correct first
instruction in the code section will not be seen because the starting point
skipped over it. This isn't really ideal.
<p>To avoid this, you can specify a
`<code><nobr>synchronisation</nobr></code>' point, or indeed as many
synchronisation points as you like (although NDISASM can only handle 8192
sync points internally). The definition of a sync point is this: NDISASM
guarantees to hit sync points exactly during disassembly. If it is thinking
about generating an instruction which would cause it to jump over a sync
point, it will discard that instruction and output a
`<code><nobr>db</nobr></code>' instead. So it <em>will</em> start
disassembly exactly from the sync point, and so you <em>will</em> see all
the instructions in your code section.
<p>Sync points are specified using the <code><nobr>-s</nobr></code> option:
they are measured in terms of the program origin, not the file position. So
if you want to synchronise after 32 bytes of a
<code><nobr>.COM</nobr></code> file, you would have to do
<p><pre>
ndisasm -o100h -s120h file.com
</pre>
<p>rather than
<p><pre>
ndisasm -o100h -s20h file.com
</pre>
<p>As stated above, you can specify multiple sync markers if you need to,
just by repeating the <code><nobr>-s</nobr></code> option.
<h4><a name="section-A.3.3">A.3.3 Mixed Code and Data: Automatic (Intelligent) Synchronisation </a></h4>
<p>Suppose you are disassembling the boot sector of a
<code><nobr>DOS</nobr></code> floppy (maybe it has a virus, and you need to
understand the virus so that you know what kinds of damage it might have
done you). Typically, this will contain a <code><nobr>JMP</nobr></code>
instruction, then some data, then the rest of the code. So there is a very
good chance of NDISASM being <em>misaligned</em> when the data ends and the
code begins. Hence a sync point is needed.
<p>On the other hand, why should you have to specify the sync point
manually? What you'd do in order to find where the sync point would be,
surely, would be to read the <code><nobr>JMP</nobr></code> instruction, and
then to use its target address as a sync point. So can NDISASM do that for
you?
<p>The answer, of course, is yes: using either of the synonymous switches
<code><nobr>-a</nobr></code> (for automatic sync) or
<code><nobr>-i</nobr></code> (for intelligent sync) will enable
<code><nobr>auto-sync</nobr></code> mode. Auto-sync mode automatically
generates a sync point for any forward-referring PC-relative jump or call
instruction that NDISASM encounters. (Since NDISASM is one-pass, if it
encounters a PC-relative jump whose target has already been processed,
there isn't much it can do about it...)
<p>Only PC-relative jumps are processed, since an absolute jump is either
through a register (in which case NDISASM doesn't know what the register
contains) or involves a segment address (in which case the target code
isn't in the same segment that NDISASM is working in, and so the sync point
can't be placed anywhere useful).
<p>For some kinds of file, this mechanism will automatically put sync
points in all the right places, and save you from having to place any sync
points manually. However, it should be stressed that auto-sync mode is
<em>not</em> guaranteed to catch all the sync points, and you may still
have to place some manually.
<p>Auto-sync mode doesn't prevent you from declaring manual sync points: it
just adds automatically generated ones to the ones you provide. It's
perfectly feasible to specify <code><nobr>-i</nobr></code> <em>and</em>
some <code><nobr>-s</nobr></code> options.
<p>Another caveat with auto-sync mode is that if, by some unpleasant fluke,
something in your data section should disassemble to a PC-relative call or
jump instruction, NDISASM may obediently place a sync point in a totally
random place, for example in the middle of one of the instructions in your
code section. So you may end up with a wrong disassembly even if you use
auto-sync. Again, there isn't much I can do about this. If you have
problems, you'll have to use manual sync points, or use the
<code><nobr>-k</nobr></code> option (documented below) to suppress
disassembly of the data area.
<h4><a name="section-A.3.4">A.3.4 Other Options</a></h4>
<p>The <code><nobr>-e</nobr></code> option skips a header on the file, by
ignoring the first N bytes. This means that the header is <em>not</em>
counted towards the disassembly offset: if you give
<code><nobr>-e10 -o10</nobr></code>, disassembly will start at byte 10 in
the file, and this will be given offset 10, not 20.
<p>The <code><nobr>-k</nobr></code> option is provided with two
comma-separated numeric arguments, the first of which is an assembly offset
and the second is a number of bytes to skip. This <em>will</em> count the
skipped bytes towards the assembly offset: its use is to suppress
disassembly of a data section which wouldn't contain anything you wanted to
see anyway.
<h3><a name="section-A.4">A.4 Bugs and Improvements</a></h3>
<p>There are no known bugs. However, any you find, with patches if
possible, should be sent to
<a href="mailto:jules@dsf.org.uk"><code><nobr>jules@dsf.org.uk</nobr></code></a>
or
<a href="mailto:anakin@pobox.com"><code><nobr>anakin@pobox.com</nobr></code></a>,
or to the developer's site at
<a href="https://sourceforge.net/projects/nasm/"><code><nobr>https://sourceforge.net/projects/nasm/</nobr></code></a>
and we'll try to fix them. Feel free to send contributions and new features
as well.
<p>Future plans include awareness of which processors certain instructions
will run on, and marking of instructions that are too advanced for some
processor (or are <code><nobr>FPU</nobr></code> instructions, or are
undocumented opcodes, or are privileged protected-mode instructions, or
whatever).
<p>That's All Folks!
<p>I hope NDISASM is of some use to somebody. Including me. :-)
<p>I don't recommend taking NDISASM apart to see how an efficient
disassembler works, because as far as I know, it isn't an efficient one
anyway. You have been warned.
<p align=center><a href="nasmdocb.html">Next Chapter</a> |
<a href="nasmdo10.html">Previous Chapter</a> |
<a href="nasmdoc0.html">Contents</a> |
<a href="nasmdoci.html">Index</a>
</body></html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff