NASM - The Netwide Assembler
NASM - The Netwide Assembler
version 2.05.01
3
2.1.21 The −a Option: Don’t Preprocess At All . . . . . . . . . . . . . . . . . . . . . . . . . . . .20
2.1.22 The −O Option: Specifying Multipass Optimization . . . . . . . . . . . . . . . . . . . . . .20
2.1.23 The −t option: Enable TASM Compatibility Mode . . . . . . . . . . . . . . . . . . . . . .21
2.1.24 The −w Option: Enable or Disable Assembly Warnings . . . . . . . . . . . . . . . . . . . .21
2.1.25 The −v Option: Display Version Info . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22
2.1.26 The −y Option: Display Available Debug Info Formats . . . . . . . . . . . . . . . . . . . .22
2.1.27 The −−prefix and −−postfix Options. . . . . . . . . . . . . . . . . . . . . . . . . . .22
2.1.28 The NASMENV Environment Variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22
2.2 Quick Start for MASM Users . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22
2.2.1 NASM Is Case−Sensitive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23
2.2.2 NASM Requires Square Brackets For Memory References . . . . . . . . . . . . . . . . . . .23
2.2.3 NASM Doesn’t Store Variable Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23
2.2.4 NASM Doesn’t ASSUME . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23
2.2.5 NASM Doesn’t Support Memory Models . . . . . . . . . . . . . . . . . . . . . . . . . . . .24
2.2.6 Floating−Point Differences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24
2.2.7 Other Differences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .24
Chapter 3: The NASM Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
3.1 Layout of a NASM Source Line . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
3.2 Pseudo−Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .26
3.2.1 DB and Friends: Declaring Initialized Data . . . . . . . . . . . . . . . . . . . . . . . . . . .26
3.2.2 RESB and Friends: Declaring Uninitialized Data . . . . . . . . . . . . . . . . . . . . . . . .26
3.2.3 INCBIN: Including External Binary Files . . . . . . . . . . . . . . . . . . . . . . . . . . . .26
3.2.4 EQU: Defining Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27
3.2.5 TIMES: Repeating Instructions or Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27
3.3 Effective Addresses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27
3.4 Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28
3.4.1 Numeric Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .28
3.4.2 Character Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29
3.4.3 Character Constants. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .29
3.4.4 String Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30
3.4.5 Unicode Strings. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30
3.4.6 Floating−Point Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .30
3.4.7 Packed BCD Constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31
3.5 Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32
3.5.1 |: Bitwise OR Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32
4
3.5.2 ^: Bitwise XOR Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32
3.5.3 &: Bitwise AND Operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32
3.5.4 << and >>: Bit Shift Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32
3.5.5 + and −: Addition and Subtraction Operators . . . . . . . . . . . . . . . . . . . . . . . . . .32
3.5.6 *, /, //, % and %%: Multiplication and Division. . . . . . . . . . . . . . . . . . . . . . . . .32
3.5.7 Unary Operators: +, −, ~, ! and SEG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32
3.6 SEG and WRT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .32
3.7 STRICT: Inhibiting Optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33
3.8 Critical Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .33
3.9 Local Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .34
Chapter 4: The NASM Preprocessor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .36
4.1 Single−Line Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .36
4.1.1 The Normal Way: %define . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .36
4.1.2 Resolving %define: %xdefine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .37
4.1.3 Concatenating Single Line Macro Tokens: %+ . . . . . . . . . . . . . . . . . . . . . . . . . .38
4.1.4 The Macro Name Itself: %? and %?? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .38
4.1.5 Undefining Single−Line Macros: %undef . . . . . . . . . . . . . . . . . . . . . . . . . . .39
4.1.6 Preprocessor Variables: %assign . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
4.1.7 Defining Strings: %defstr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
4.2 String Manipulation in Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .39
4.2.1 Concatenating Strings: %strcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40
4.2.2 String Length: %strlen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40
4.2.3 Extracting Substrings: %substr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40
4.3 Multi−Line Macros: %macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .40
4.3.1 Overloading Multi−Line Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .41
4.3.2 Macro−Local Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42
4.3.3 Greedy Macro Parameters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42
4.3.4 Default Macro Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .43
4.3.5 %0: Macro Parameter Counter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44
4.3.6 %rotate: Rotating Macro Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . .44
4.3.7 Concatenating Macro Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45
4.3.8 Condition Codes as Macro Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . .46
4.3.9 Disabling Listing Expansion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .46
4.3.10 Undefining Multi−Line Macros: %unmacro. . . . . . . . . . . . . . . . . . . . . . . . . .46
4.4 Conditional Assembly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47
5
4.4.1 %ifdef: Testing Single−Line Macro Existence. . . . . . . . . . . . . . . . . . . . . . . . .47
4.4.2 %ifmacro: Testing Multi−Line Macro Existence . . . . . . . . . . . . . . . . . . . . . . .47
4.4.3 %ifctx: Testing the Context Stack. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .48
4.4.4 %if: Testing Arbitrary Numeric Expressions . . . . . . . . . . . . . . . . . . . . . . . . . .48
4.4.5 %ifidn and %ifidni: Testing Exact Text Identity . . . . . . . . . . . . . . . . . . . . . .48
4.4.6 %ifid, %ifnum, %ifstr: Testing Token Types . . . . . . . . . . . . . . . . . . . . . . .49
4.4.7 %iftoken: Test for a Single Token . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50
4.4.8 %ifempty: Test for Empty Expansion . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50
4.5 Preprocessor Loops: %rep. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .50
4.6 Source Files and Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51
4.6.1 %include: Including Other Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51
4.6.2 %pathsearch: Search the Include Path . . . . . . . . . . . . . . . . . . . . . . . . . . . .51
4.6.3 %depend: Add Dependent Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .51
4.6.4 %use: Include Standard Macro Package . . . . . . . . . . . . . . . . . . . . . . . . . . . .52
4.7 The Context Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52
4.7.1 %push and %pop: Creating and Removing Contexts . . . . . . . . . . . . . . . . . . . . . .52
4.7.2 Context−Local Labels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .52
4.7.3 Context−Local Single−Line Macros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53
4.7.4 %repl: Renaming a Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .53
4.7.5 Example Use of the Context Stack: Block IFs . . . . . . . . . . . . . . . . . . . . . . . . . .53
4.8 Stack Relative Preprocessor Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55
4.8.1 %arg Directive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55
4.8.2 %stacksize Directive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .55
4.8.3 %local Directive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .56
4.9 Reporting User−Defined Errors: %error, %warning, %fatal . . . . . . . . . . . . . . . . . .56
4.10 Other Preprocessor Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .57
4.10.1 %line Directive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .57
4.10.2 %!<env>: Read an environment variable. . . . . . . . . . . . . . . . . . . . . . . . . . . .58
4.11 Standard Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .58
4.11.1 NASM Version Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .58
4.11.2 __NASM_VERSION_ID__: NASM Version ID . . . . . . . . . . . . . . . . . . . . . . . .58
4.11.3 __NASM_VER__: NASM Version string . . . . . . . . . . . . . . . . . . . . . . . . . . .58
4.11.4 __FILE__ and __LINE__: File Name and Line Number. . . . . . . . . . . . . . . . . . .59
4.11.5 __BITS__: Current BITS Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .59
4.11.6 __OUTPUT_FORMAT__: Current Output Format . . . . . . . . . . . . . . . . . . . . . . .59
6
4.11.7 Assembly Date and Time Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .59
4.11.8 __USE_package__: Package Include Test. . . . . . . . . . . . . . . . . . . . . . . . . . .60
4.11.9 __PASS__: Assembly Pass . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .60
4.11.10 STRUC and ENDSTRUC: Declaring Structure Data Types . . . . . . . . . . . . . . . . . . .60
4.11.11 ISTRUC, AT and IEND: Declaring Instances of Structures . . . . . . . . . . . . . . . . . .61
4.11.12 ALIGN and ALIGNB: Data Alignment . . . . . . . . . . . . . . . . . . . . . . . . . . . .62
Chapter 5: Standard Macro Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63
5.1 altreg: Alternate Register Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63
5.2 smartalign: Smart ALIGN Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .63
Chapter 6: Assembler Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64
6.1 BITS: Specifying Target Processor Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .64
6.1.1 USE16 & USE32: Aliases for BITS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .65
6.2 DEFAULT: Change the assembler defaults . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .65
6.3 SECTION or SEGMENT: Changing and Defining Sections . . . . . . . . . . . . . . . . . . . . . .65
6.3.1 The __SECT__ Macro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .65
6.4 ABSOLUTE: Defining Absolute Labels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .66
6.5 EXTERN: Importing Symbols from Other Modules . . . . . . . . . . . . . . . . . . . . . . . . . .67
6.6 GLOBAL: Exporting Symbols to Other Modules . . . . . . . . . . . . . . . . . . . . . . . . . . .67
6.7 COMMON: Defining Common Data Areas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .67
6.8 CPU: Defining CPU Dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .68
6.9 FLOAT: Handling of floating−point constants . . . . . . . . . . . . . . . . . . . . . . . . . . . .68
Chapter 7: Output Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70
7.1 bin: Flat−Form Binary Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70
7.1.1 ORG: Binary File Program Origin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .70
7.1.2 bin Extensions to the SECTION Directive . . . . . . . . . . . . . . . . . . . . . . . . . . .70
7.1.3 Multisection support for the BIN format.. . . . . . . . . . . . . . . . . . . . . . . . . .71
7.1.4 Map files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71
7.2 obj: Microsoft OMF Object Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .71
7.2.1 obj Extensions to the SEGMENT Directive . . . . . . . . . . . . . . . . . . . . . . . . . . .72
7.2.2 GROUP: Defining Groups of Segments . . . . . . . . . . . . . . . . . . . . . . . . . . . . .73
7.2.3 UPPERCASE: Disabling Case Sensitivity in Output . . . . . . . . . . . . . . . . . . . . . . .73
7.2.4 IMPORT: Importing DLL Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .74
7.2.5 EXPORT: Exporting DLL Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .74
7.2.6 ..start: Defining the Program Entry Point . . . . . . . . . . . . . . . . . . . . . . . . . .74
7.2.7 obj Extensions to the EXTERN Directive . . . . . . . . . . . . . . . . . . . . . . . . . . . .74
7
7.2.8 obj Extensions to the COMMON Directive . . . . . . . . . . . . . . . . . . . . . . . . . . . .75
7.3 win32: Microsoft Win32 Object Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .76
7.3.1 win32 Extensions to the SECTION Directive . . . . . . . . . . . . . . . . . . . . . . . . .76
7.3.2 win32: Safe Structured Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . .76
7.4 win64: Microsoft Win64 Object Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .78
7.4.1 win64: Writing Position−Independent Code . . . . . . . . . . . . . . . . . . . . . . . . . .78
7.4.2 win64: Structured Exception Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79
7.5 coff: Common Object File Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .81
7.6 macho: Mach Object File Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82
7.7 elf, elf32, and elf64: Executable and Linkable Format Object Files . . . . . . . . . . . .82
7.7.1 ELF specific directive osabi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .82
7.7.2 elf Extensions to the SECTION Directive . . . . . . . . . . . . . . . . . . . . . . . . . . .82
7.7.3 Position−Independent Code: elf Special Symbols and WRT . . . . . . . . . . . . . . . . . .83
7.7.4 elf Extensions to the GLOBAL Directive . . . . . . . . . . . . . . . . . . . . . . . . . . . .83
7.7.5 elf Extensions to the COMMON Directive . . . . . . . . . . . . . . . . . . . . . . . . . . .84
7.7.6 16−bit code and ELF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84
7.7.7 Debug formats and ELF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84
7.8 aout: Linux a.out Object Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .84
7.9 aoutb: NetBSD/FreeBSD/OpenBSD a.out Object Files. . . . . . . . . . . . . . . . . . . . . .84
7.10 as86: Minix/Linux as86 Object Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .85
7.11 rdf: Relocatable Dynamic Object File Format . . . . . . . . . . . . . . . . . . . . . . . . . . .85
7.11.1 Requiring a Library: The LIBRARY Directive . . . . . . . . . . . . . . . . . . . . . . . . .85
7.11.2 Specifying a Module Name: The MODULE Directive . . . . . . . . . . . . . . . . . . . . . .85
7.11.3 rdf Extensions to the GLOBAL directive . . . . . . . . . . . . . . . . . . . . . . . . . . .86
7.11.4 rdf Extensions to the EXTERN directive . . . . . . . . . . . . . . . . . . . . . . . . . . .86
7.12 dbg: Debugging Format . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .86
Chapter 8: Writing 16−bit Code (DOS, Windows 3/3.1). . . . . . . . . . . . . . . . . . . . . . . . . . .88
8.1 Producing .EXE Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .88
8.1.1 Using the obj Format To Generate .EXE Files . . . . . . . . . . . . . . . . . . . . . . . . .88
8.1.2 Using the bin Format To Generate .EXE Files . . . . . . . . . . . . . . . . . . . . . . . . .89
8.2 Producing .COM Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .90
8.2.1 Using the bin Format To Generate .COM Files . . . . . . . . . . . . . . . . . . . . . . . . .90
8.2.2 Using the obj Format To Generate .COM Files . . . . . . . . . . . . . . . . . . . . . . . . .90
8.3 Producing .SYS Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91
8.4 Interfacing to 16−bit C Programs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91
8
8.4.1 External Symbol Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .91
8.4.2 Memory Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .92
8.4.3 Function Definitions and Function Calls. . . . . . . . . . . . . . . . . . . . . . . . . . . . .93
8.4.4 Accessing Data Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .95
8.4.5 c16.mac: Helper Macros for the 16−bit C Interface . . . . . . . . . . . . . . . . . . . . . .95
8.5 Interfacing to Borland Pascal Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .96
8.5.1 The Pascal Calling Convention . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .97
8.5.2 Borland Pascal Segment Name Restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . .98
8.5.3 Using c16.mac With Pascal Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . .98
Chapter 9: Writing 32−bit Code (Unix, Win32, DJGPP). . . . . . . . . . . . . . . . . . . . . . . . . . 100
9.1 Interfacing to 32−bit C Programs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
9.1.1 External Symbol Names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
9.1.2 Function Definitions and Function Calls. . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
9.1.3 Accessing Data Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
9.1.4 c32.mac: Helper Macros for the 32−bit C Interface . . . . . . . . . . . . . . . . . . . . . 102
9.2 Writing NetBSD/FreeBSD/OpenBSD and Linux/ELF Shared Libraries. . . . . . . . . . . . . . . 103
9.2.1 Obtaining the Address of the GOT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
9.2.2 Finding Your Local Data Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
9.2.3 Finding External and Common Data Items . . . . . . . . . . . . . . . . . . . . . . . . . . 104
9.2.4 Exporting Symbols to the Library User . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
9.2.5 Calling Procedures Outside the Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
9.2.6 Generating the Library File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Chapter 10: Mixing 16 and 32 Bit Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
10.1 Mixed−Size Jumps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
10.2 Addressing Between Different−Size Segments . . . . . . . . . . . . . . . . . . . . . . . . . . 107
10.3 Other Mixed−Size Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Chapter 11: Writing 64−bit Code (Unix, Win64) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
11.1 Register Names in 64−bit Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
11.2 Immediates and Displacements in 64−bit Mode . . . . . . . . . . . . . . . . . . . . . . . . . . 110
11.3 Interfacing to 64−bit C Programs (Unix) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
11.4 Interfacing to 64−bit C Programs (Win64) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Chapter 12: Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
12.1 Common Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
12.1.1 NASM Generates Inefficient Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
12.1.2 My Jumps are Out of Range . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
9
12.1.3 ORG Doesn’t Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
12.1.4 TIMES Doesn’t Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
12.2 Bugs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Appendix A: Ndisasm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
A.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
A.2 Getting Started: Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
A.3 Running NDISASM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
A.3.1 COM Files: Specifying an Origin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
A.3.2 Code Following Data: Synchronisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
A.3.3 Mixed Code and Data: Automatic (Intelligent) Synchronisation . . . . . . . . . . . . . . . 117
A.3.4 Other Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
A.4 Bugs and Improvements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Appendix B: Instruction List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
B.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
B.1.1 Special instructions... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
B.1.2 Conventional instructions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
B.1.3 Katmai Streaming SIMD instructions (SSE –– a.k.a. KNI, XMM, MMX2) . . . . . . . . . . 144
B.1.4 Introduced in Deschutes but necessary for SSE support . . . . . . . . . . . . . . . . . . . . 146
B.1.5 XSAVE group (AVX and extended state) . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
B.1.6 Generic memory operations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
B.1.7 New MMX instructions introduced in Katmai. . . . . . . . . . . . . . . . . . . . . . . . . 146
B.1.8 AMD Enhanced 3DNow! (Athlon) instructions . . . . . . . . . . . . . . . . . . . . . . . . 146
B.1.9 Willamette SSE2 Cacheability Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . 147
B.1.10 Willamette MMX instructions (SSE2 SIMD Integer Instructions) . . . . . . . . . . . . . . 147
B.1.11 Willamette Streaming SIMD instructions (SSE2) . . . . . . . . . . . . . . . . . . . . . . 149
B.1.12 Prescott New Instructions (SSE3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
B.1.13 VMX Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
B.1.14 Extended Page Tables VMX instructions . . . . . . . . . . . . . . . . . . . . . . . . . . 151
B.1.15 Tejas New Instructions (SSSE3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
B.1.16 AMD SSE4A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
B.1.17 New instructions in Barcelona . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
B.1.18 Penryn New Instructions (SSE4.1). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
B.1.19 Nehalem New Instructions (SSE4.2). . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
B.1.20 AMD SSE5 instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
B.1.21 Intel SMX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
10
B.1.22 Geode (Cyrix) 3DNow! additions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
B.1.23 Intel new instructions in ??? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
B.1.24 Intel AES instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
B.1.25 Intel AVX AES instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
B.1.26 Intel AVX instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
B.1.27 Intel Carry−Less Multiplication instructions (CLMUL) . . . . . . . . . . . . . . . . . . . 179
B.1.28 Intel Fused Multiply−Add instructions (FMA) . . . . . . . . . . . . . . . . . . . . . . . . 179
B.1.29 VIA (Centaur) security instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
B.1.30 Systematic names for the hinting nop instructions . . . . . . . . . . . . . . . . . . . . . . 181
Appendix C: NASM Version History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
C.1 NASM 2 Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
C.1.1 Version 2.05.01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
C.1.2 Version 2.05 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
C.1.3 Version 2.04 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
C.1.4 Version 2.03.01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
C.1.5 Version 2.03 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
C.1.6 Version 2.02 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
C.1.7 Version 2.01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
C.1.8 Version 2.00 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
C.2 NASM 0.98 Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
C.2.1 Version 0.98.39 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
C.2.2 Version 0.98.38 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
C.2.3 Version 0.98.37 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
C.2.4 Version 0.98.36 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
C.2.5 Version 0.98.35 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
C.2.6 Version 0.98.34 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
C.2.7 Version 0.98.33 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
C.2.8 Version 0.98.32 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
C.2.9 Version 0.98.31 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
C.2.10 Version 0.98.30 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
C.2.11 Version 0.98.28 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
C.2.12 Version 0.98.26 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
C.2.13 Version 0.98.25alt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
C.2.14 Version 0.98.25 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
C.2.15 Version 0.98.24p1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
11
C.2.16 Version 0.98.24 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
C.2.17 Version 0.98.23 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
C.2.18 Version 0.98.22 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
C.2.19 Version 0.98.21 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
C.2.20 Version 0.98.20 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
C.2.21 Version 0.98.19 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
C.2.22 Version 0.98.18 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
C.2.23 Version 0.98.17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
C.2.24 Version 0.98.16 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
C.2.25 Version 0.98.15 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
C.2.26 Version 0.98.14 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
C.2.27 Version 0.98.13 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
C.2.28 Version 0.98.12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
C.2.29 Version 0.98.11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
C.2.30 Version 0.98.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
C.2.31 Version 0.98.09 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
C.2.32 Version 0.98.08 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
C.2.33 Version 0.98.09b with John Coffman patches released 28−Oct−2001 . . . . . . . . . . . . 193
C.2.34 Version 0.98.07 released 01/28/01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
C.2.35 Version 0.98.06f released 01/18/01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
C.2.36 Version 0.98.06e released 01/09/01 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
C.2.37 Version 0.98p1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
C.2.38 Version 0.98bf (bug−fixed) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
C.2.39 Version 0.98.03 with John Coffman’s changes released 27−Jul−2000 . . . . . . . . . . . . 194
C.2.40 Version 0.98.03 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
C.2.41 Version 0.98 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
C.2.42 Version 0.98p9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
C.2.43 Version 0.98p8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
C.2.44 Version 0.98p7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
C.2.45 Version 0.98p6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
C.2.46 Version 0.98p3.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
C.2.47 Version 0.98p3.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
C.2.48 Version 0.98p3.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
C.2.49 Version 0.98p3.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
C.2.50 Version 0.98p3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
12
C.2.51 Version 0.98p3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
C.2.52 Version 0.98p3−hpa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
C.2.53 Version 0.98 pre−release 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
C.2.54 Version 0.98 pre−release 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
C.2.55 Version 0.98 pre−release 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
C.3 NASM 0.9 Series . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
C.3.1 Version 0.97 released December 1997 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
C.3.2 Version 0.96 released November 1997 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
C.3.3 Version 0.95 released July 1997 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
C.3.4 Version 0.94 released April 1997 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
C.3.5 Version 0.93 released January 1997. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
C.3.6 Version 0.92 released January 1997. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
C.3.7 Version 0.91 released November 1996 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
C.3.8 Version 0.90 released October 1996 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
13
Chapter 1: Introduction
14
New releases of NASM are uploaded to the official sites http://nasm.sourceforge.net and to
ftp.kernel.org and ibiblio.org.
Announcements are posted to comp.lang.asm.x86, alt.lang.asm and
comp.os.linux.announce
If you want information about NASM beta releases, and the current development status, please subscribe to
the nasm−devel email list by registering at http://sourceforge.net/projects/nasm.
1.3 Installation
1.3.1 Installing NASM under MS−DOS or Windows
Once you’ve obtained the appropriate archive for NASM, nasm−XXX−dos.zip or
nasm−XXX−win32.zip (where XXX denotes the version number of NASM contained in the archive),
unpack it into its own directory (for example c:\nasm).
The archive will contain a set of executable files: the NASM executable file nasm.exe, the NDISASM
executable file ndisasm.exe, and possibly additional utilities to handle the RDOFF file format.
The only file NASM needs to run is its own executable, so copy nasm.exe to a directory on your PATH, or
alternatively edit autoexec.bat to add the nasm directory to your PATH (to do that under Windows XP,
go to Start > Control Panel > System > Advanced > Environment Variables; these instructions may work
under other versions of Windows as well.)
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 PATH), so you can delete it if you need to save space; however, you may want to keep the
documentation or test programs.
If you’ve downloaded the DOS source archive, nasm−XXX.zip, the nasm 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. See the file INSTALL in the source archive.
Note that a number of files are generated from other files by Perl scripts. 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 www.cpan.org.
1.3.2 Installing NASM under Unix
Once you’ve obtained the Unix source archive for NASM, nasm−XXX.tar.gz (where XXX denotes the
version number of NASM contained in the archive), unpack it into a directory such as /usr/local/src.
The archive, when unpacked, will create its own subdirectory nasm−XXX.
NASM is an auto−configuring package: once you’ve unpacked it, cd to the directory it’s been unpacked into
and type ./configure. This shell script will find the best C compiler to use for building NASM and set up
Makefiles accordingly.
Once NASM has auto−configured, you can type make to build the nasm and ndisasm binaries, and then
make install to install them in /usr/local/bin and install the man pages nasm.1 and
ndisasm.1 in /usr/local/man/man1. Alternatively, you can give options such as −−prefix to the
configure script (see the file INSTALL for more details), or install the programs yourself.
NASM also comes with a set of utilities for handling the RDOFF custom object−file format, which are in the
rdoff subdirectory of the NASM archive. You can build these with make rdf and install them with
make rdf_install, if you want them.
15
Chapter 2: Running NASM
16
For situations in which this behaviour is unacceptable, NASM provides the −o command−line option, which
allows you to specify your desired output file name. You invoke −o by following it with the name you wish
for the output file, either with or without an intervening space. For example:
nasm −f bin program.asm −o program.com
nasm −f bin driver.asm −odriver.sys
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 section 2.1.22.
2.1.2 The −f Option: Specifying the Output File Format
If you do not supply the −f option to NASM, it will choose an output file format for you itself. In the
distribution versions of NASM, the default is always bin; if you’ve compiled your own copy of NASM, you
can redefine OF_DEFAULT at compile time and choose what you want the default to be.
Like −o, the intervening space between −f and the output file format is optional; so −f elf and −felf are
both valid.
A complete list of the available output file formats can be given by issuing the command nasm −hf.
2.1.3 The −l Option: Generating a Listing File
If you supply the −l 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 section 4.3.9) on the right. For example:
nasm −f elf myfile.asm −l myfile.lst
If a list file is selected, you may turn off listing for a section of your source with [list −], and turn it back
on with [list +], (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.
2.1.4 The −M Option: Generate Makefile Dependencies
This option can be used to generate makefile dependencies on stdout. This can be redirected to a file for
further processing. For example:
nasm −M myfile.asm > myfile.dep
2.1.5 The −MG Option: Generate Makefile Dependencies
This option can be used to generate makefile dependencies on stdout. This differs from the −M option in that if
a nonexisting file is encountered, it is assumed to be a generated file and is added to the dependency list
without a prefix.
2.1.6 The −MF Option: Set Makefile Dependency File
This option can be used with the −M or −MG options to send the output to a file, rather than to stdout. For
example:
nasm −M −MF myfile.dep myfile.asm
2.1.7 The −MD Option: Assemble and Generate Dependencies
The −MD option acts as the combination of the −M and −MF options (i.e. a filename has to be specified.)
However, unlike the −M or −MG options, −MD does not inhibit the normal operation of the assembler. Use this
to automatically generate updated dependencies with every assembly session. For example:
nasm −f elf −o myfile.o −MD myfile.dep myfile.asm
17
2.1.8 The −MT Option: Dependency Target Name
The −MT option can be used to override the default name of the dependency target. This is normally the same
as the output filename, specified by the −o option.
2.1.9 The −MQ Option: Dependency Target Name (Quoted)
The −MQ option acts as the −MT option, except it tries to quote characters that have special meaning in
Makefile syntax. This is not foolproof, as not all characters with special meaning are quotable in Make.
2.1.10 The −MP Option: Emit phony targets
When used with any of the dependency generation options, the −MP option causes NASM to emit a phony
target without dependencies for each header file. This prevents Make from complaining if a header file has
been removed.
2.1.11 The −F Option: Selecting a Debug Information Format
This option is used to select the format of the debug information emitted into the output file, to be used by a
debugger (or will be). Prior to version 2.03.01, the use of this switch did not enable output of the selected
debug info format. Use −g, see section 2.1.12, to enable output. Versions 2.03.01 and later automatically
enable −g if −F is specified.
A complete list of the available debug file formats for an output format can be seen by issuing the command
nasm −f <format> −y. Not all output formats currently support debugging output. See section 2.1.26.
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 section 7.12.
2.1.12 The −g Option: Enabling Debug Information.
This option can be used to generate debugging information in the specified format. See section 2.1.11. Using
−g without −F 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, −g is silently ignored.
2.1.13 The −X Option: Selecting an Error Reporting Format
This option can be used to select an error reporting format for any error messages that might be produced by
NASM.
Currently, two error reporting formats may be selected. They are the −Xvc option and the −Xgnu option. The
GNU format is the default and looks like this:
filename.asm:65: error: specific error message
where filename.asm is the name of the source file in which the error was detected, 65 is the source file
line number on which the error was detected, error is the severity of the error (this could be warning),
and specific error message is a more detailed text message which should help pinpoint the exact
problem.
The other format, specified by −Xvc is the style used by Microsoft Visual C++ and some other programs. It
looks like this:
filename.asm(65) : error: specific error message
where the only difference is that the line number is in parentheses instead of being delimited by colons.
See also the Visual C++ output format, section 7.3.
18
2.1.14 The −Z Option: Send Errors to a File
Under MS−DOS 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 stderr, this can make it hard to
capture the errors if (for example) you want to load them into an editor.
NASM therefore provides the −Z 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
nasm −Z myfile.err −f obj myfile.asm
In earlier versions of NASM, this option was called −E, but it was changed since −E is an option
conventionally used for preprocessing only, with disastrous results. See section 2.1.20.
2.1.15 The −s Option: Send Errors to stdout
The −s option redirects error messages to stdout rather than stderr, so it can be redirected under
MS−DOS. To assemble the file myfile.asm and pipe its output to the more program, you can type:
nasm −s −f obj myfile.asm | more
See also the −Z option, section 2.1.14.
2.1.16 The −i Option: Include File Search Directories
When NASM sees the %include or %pathsearch directive in a source file (see section 4.6.1, section
4.6.2 or section 3.2.3), 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 −i option. Therefore you can include files from a
macro library, for example, by typing
nasm −ic:\macrolib\ −f obj myfile.asm
(As usual, a space between −i and the path name is allowed, and optional).
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 −i 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.
(You can use this to your advantage, if you’re really perverse, by noting that the option −ifoo will cause
%include "bar.i" to search for the file foobar.i...)
If you want to define a standard include search path, similar to /usr/include on Unix systems, you
should place one or more −i directives in the NASMENV environment variable (see section 2.1.28).
For Makefile compatibility with many C compilers, this option can also be specified as −I.
2.1.17 The −p Option: Pre−Include a File
NASM allows you to specify files to be pre−included into your source file, by the use of the −p option. So
running
nasm myfile.asm −p myinc.inc
is equivalent to running nasm myfile.asm and placing the directive %include "myinc.inc" at the
start of the file.
For consistency with the −I, −D and −U options, this option can also be specified as −P.
2.1.18 The −d Option: Pre−Define a Macro
Just as the −p option gives an alternative to placing %include directives at the start of a source file, the −d
option gives an alternative to placing a %define directive. You could code
19
nasm myfile.asm −dFOO=100
as an alternative to placing the directive
%define FOO 100
at the start of the file. You can miss off the macro value, as well: the option −dFOO is equivalent to coding
%define FOO. This form of the directive may be useful for selecting assembly−time options which are then
tested using %ifdef, for example −dDEBUG.
For Makefile compatibility with many C compilers, this option can also be specified as −D.
2.1.19 The −u Option: Undefine a Macro
The −u option undefines a macro that would otherwise have been pre−defined, either automatically or by a
−p or −d option specified earlier on the command lines.
For example, the following command line:
nasm myfile.asm −dFOO=100 −uFOO
would result in FOO not being a predefined macro in the program. This is useful to override options specified
at a different point in a Makefile.
For Makefile compatibility with many C compilers, this option can also be specified as −U.
2.1.20 The −E Option: Preprocess Only
NASM allows the preprocessor to be run on its own, up to a point. Using the −E 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
−o option is also used).
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
%assign tablesize ($−tablestart)
will cause an error in preprocess−only mode.
For compatiblity with older version of NASM, this option can also be written −e. −E in older versions of
NASM was the equivalent of the current −Z option, section 2.1.14.
2.1.21 The −a Option: Don’t Preprocess At All
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
−a option, requiring no argument, instructs NASM to replace its powerful preprocessor with a stub
preprocessor which does nothing.
2.1.22 The −O Option: Specifying Multipass Optimization
NASM defaults to not optimizing operands which can fit into a signed byte. This means that if you want the
shortest possible object code, you have to enable optimization.
Using the −O option, you can tell NASM to carry out different levels of optimization. The syntax is:
• −O0: No optimization. All operands take their long forms, if a short form is not specified, except
conditional jumps. This is intended to match NASM 0.98 behavior.
• −O1: Minimal optimization. As above, but immediate operands which will fit in a signed byte are
optimized, unless the long form is specified. Conditional jumps default to the long form unless otherwise
specified.
20
• −Ox (where x is the actual letter x): Multipass optimization. Minimize branch offsets and signed
immediate bytes, overriding size specification unless the strict keyword has been used (see section
3.7). For compatability with earlier releases, the letter x may also be any number greater than one. This
number has no effect on the actual number of passes.
The −Ox mode is recommended for most uses.
Note that this is a capital O, and is different from a small o, which is used to specify the output file name. See
section 2.1.1.
2.1.23 The −t option: Enable TASM Compatibility Mode
NASM includes a limited form of compatibility with Borland’s TASM. When NASM’s −t option is used, the
following changes are made:
• local labels may be prefixed with @@ instead of .
• 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. mov eax,[DWORD val] is valid syntax in TASM compatibility mode. Note that you lose
the ability to override the default address type for the instruction.
• unprefixed forms of some directives supported (arg, elif, else, endif, if, ifdef, ifdifi,
ifndef, include, local)
2.1.24 The −w Option: Enable or Disable Assembly Warnings
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.
Some conditions are even less severe than that: they are only sometimes worth mentioning to the user.
Therefore NASM supports the −w command−line option, which enables or disables certain classes of
assembly warning. Such warning classes are described by a name, for example orphan−labels; you can
enable warnings of this class by the command−line option −w+orphan−labels and disable it by
−w−orphan−labels.
The suppressible warning classes are:
• error decides if warnings should be treated as errors. It is disabled by default.
• macro−params covers warnings about multi−line macros being invoked with the wrong number of
parameters. This warning class is enabled by default; see section 4.3.1 for an example of why you might
want to disable it.
• macro−selfref warns if a macro references itself. This warning class is disabled by default.
• macro−defaults warns when a macro has more default parameters than optional parameters. This
warning class is enabled by default; see section 4.3.4 for why you might want to disable it.
• orphan−labels covers warnings about source lines which contain no instruction but define a label
without a trailing colon. NASM warns about this somewhat obscure condition by default; see section 3.1
for more information.
• number−overflow covers warnings about numeric constants which don’t fit in 64 bits. This warning
class is enabled by default.
• gnu−elf−extensions warns if 8−bit or 16−bit relocations are used in −f elf format. The GNU
extensions allow this. This warning class is disabled by default.
• float−overflow warns about floating point overflow. Enabled by default.
21
• float−denorm warns about floating point denormals. Disabled by default.
• float−underflow warns about floating point underflow. Disabled by default.
• float−toolong warns about too many digits in floating−point numbers. Enabled by default.
• user controls %warning directives (see section 4.9). Enabled by default.
In addition, you can set warning classes across sections. Warning classes may be enabled with
[warning +warning−name], disabled with [warning −warning−name] or reset to their original
value with [warning *warning−name]. No "user form" (without the brackets) exists.
2.1.25 The −v Option: Display Version Info
Typing NASM −v will display the version of NASM which you are using, and the date on which it was
compiled.
You will need the version number if you report a bug.
2.1.26 The −y Option: Display Available Debug Info Formats
Typing nasm −f <option> −y will display a list of the available debug info formats for the given output
format. The default format is indicated by an asterisk. For example:
nasm −f elf −y
valid debug formats for ’elf32’ output format are
(’*’ denotes default):
* stabs ELF32 (i386) stabs debug format for Linux
dwarf elf32 (i386) dwarf debug format for Linux
2.1.27 The −−prefix and −−postfix Options.
The −−prefix and −−postfix options prepend or append (respectively) the given argument to all
global or extern variables. E.g. −−prefix _ will prepend the underscore to all global and external
variables, as C sometimes (but not always) likes it.
2.1.28 The NASMENV Environment Variable
If you define an environment variable called NASMENV, 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 −i options in the NASMENV variable.
The value of the variable is split up at white space, so that the value −s −ic:\nasmlib will be treated as
two separate options. However, that means that the value −dNAME="my name" 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 −dNAME="my and name".
To get round this, NASM provides a feature whereby, if you begin the NASMENV 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 NASMENV variable to the value !−s!−ic:\nasmlib is equivalent to setting it to
−s −ic:\nasmlib, but !−dNAME="my name" will work.
This environment variable was previously called NASM. This was changed with version 0.98.31.
22
2.2.1 NASM Is Case−Sensitive
One simple difference is that NASM is case−sensitive. It makes a difference whether you call your label foo,
Foo or FOO. If you’re assembling to DOS or OS/2 .OBJ files, you can invoke the UPPERCASE directive
(documented in section 7.2) to ensure that all symbols exported to other code modules are forced to be upper
case; but even then, within a single module, NASM will distinguish between labels differing only in case.
2.2.2 NASM Requires Square Brackets For Memory References
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,
foo equ 1
bar dw 2
then the two lines of code
mov ax,foo
mov ax,bar
generate completely different opcodes, despite having identical−looking syntaxes.
NASM avoids this undesirable situation by having a much simpler syntax for memory references. The rule is
simply that any access to the contents of a memory location requires square brackets around the address, and
any access to the address of a variable doesn’t. So an instruction of the form mov ax,foo will always refer
to a compile−time constant, whether it’s an EQU or the address of a variable; and to access the contents of the
variable bar, you must code mov ax,[bar].
This also means that NASM has no need for MASM’s OFFSET keyword, since the MASM code
mov ax,offset bar means exactly the same thing as NASM’s mov ax,bar. If you’re trying to get
large amounts of MASM code to assemble sensibly under NASM, you can always code
%idefine offset to make the preprocessor treat the OFFSET keyword as a no−op.
This issue is even more confusing in a86, where declaring a label with a trailing colon defines it to be a
‘label’ as opposed to a ‘variable’ and causes a86 to adopt NASM−style semantics; so in a86, mov ax,var
has different behaviour depending on whether var was declared as var: dw 0 (a label) or var dw 0 (a
word−size variable). NASM is very simple by comparison: everything is a label.
NASM, in the interests of simplicity, also does not support the hybrid syntaxes supported by MASM and its
clones, such as mov ax,table[bx], where a memory reference is denoted by one portion outside square
brackets and another portion inside. The correct syntax for the above is mov ax,[table+bx]. Likewise,
mov ax,es:[di] is wrong and mov ax,[es:di] is right.
2.2.3 NASM Doesn’t Store Variable Types
NASM, by design, chooses not to remember the types of variables you declare. Whereas MASM will
remember, on seeing var dw 0, that you declared var as a word−size variable, and will then be able to fill
in the ambiguity in the size of the instruction mov var,2, NASM will deliberately remember nothing about
the symbol var except where it begins, and so you must explicitly code mov word [var],2.
For this reason, NASM doesn’t support the LODS, MOVS, STOS, SCAS, CMPS, INS, or OUTS instructions,
but only supports the forms such as LODSB, MOVSW, and SCASD, which explicitly specify the size of the
components of the strings being manipulated.
2.2.4 NASM Doesn’t ASSUME
As part of NASM’s drive for simplicity, it also does not support the ASSUME directive. NASM will not keep
track of what values you choose to put in your segment registers, and will never automatically generate a
segment override prefix.
23
2.2.5 NASM Doesn’t Support Memory Models
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 RET instruction (RETN or RETF; NASM accepts RET itself as an
alternate form for RETN); in addition, the programmer is responsible for coding CALL FAR instructions
where necessary when calling external functions, and must also keep track of which external variable
definitions are far and which are near.
2.2.6 Floating−Point Differences
NASM uses different names to refer to floating−point registers from MASM: where MASM would call them
ST(0), ST(1) and so on, and a86 would call them simply 0, 1 and so on, NASM chooses to call them
st0, st1 etc.
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.
2.2.7 Other Differences
For historical reasons, NASM uses the keyword TWORD where MASM and compatible assemblers use
TBYTE.
NASM does not declare uninitialized storage in the same way as MASM: where a MASM programmer might
use stack db 64 dup (?), NASM requires stack resb 64, intended to be read as ‘reserve 64
bytes’. For a limited amount of compatibility, since NASM treats ? as a valid character in symbol names, you
can code ? equ 0 and then writing dw ? will at least do something vaguely useful. DUP is still not a
supported syntax, however.
In addition to all of this, macros and directives work completely differently to MASM. See chapter 4 and
chapter 6 for further details.
24
Chapter 3: The NASM Language
25
fadd st1 ; this sets st0 := st0 + st1
fadd st0,st1 ; so does this
3.2 Pseudo−Instructions
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 DB,
DW, DD, DQ, DT, DO and DY; their uninitialized counterparts RESB, RESW, RESD, RESQ, REST, RESO and
RESY; the INCBIN command, the EQU command, and the TIMES prefix.
3.2.1 DB and Friends: Declaring Initialized Data
DB, DW, DD, DQ, DT, DO and DY are used, much as in MASM, to declare initialized data in the output file.
They can be invoked in a wide range of ways:
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 0x123456789abcdef0 ; eight byte constant
dq 1.234567e20 ; double−precision float
dt 1.234567e20 ; extended−precision float
DT, DO and DY do not accept numeric constants as operands.
3.2.2 RESB and Friends: Declaring Uninitialized Data
RESB, RESW, RESD, RESQ, REST, RESO and RESY are designed to be used in the BSS section of a module:
they declare uninitialized storage space. Each takes a single operand, which is the number of bytes, words,
doublewords or whatever to reserve. As stated in section 2.2.7, NASM does not support the MASM/TASM
syntax of reserving uninitialized space by writing DW ? or similar things: this is what it does instead. The
operand to a RESB–type pseudo−instruction is a critical expression: see section 3.8.
For example:
buffer: resb 64 ; reserve 64 bytes
wordvar: resw 1 ; reserve a word
realarray resq 10 ; array of ten reals
ymmval: resy 1 ; one YMM register
3.2.3 INCBIN: Including External Binary Files
INCBIN 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:
26
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
INCBIN is both a directive and a standard macro; the standard macro version searches for the file in the
include file search path and adds the file to the dependency lists. This macro can be overridden if desired.
3.2.4 EQU: Defining Constants
EQU defines a symbol to a given constant value: when EQU is used, the source line must contain a label. The
action of EQU 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,
message db ’hello, world’
msglen equ $−message
defines msglen to be the constant 12. msglen may not then be redefined later. This is not a preprocessor
definition either: the value of msglen is evaluated once, using the value of $ (see section 3.5 for an
explanation of $) at the point of definition, rather than being evaluated wherever it is referenced and using the
value of $ at the point of reference.
3.2.5 TIMES: Repeating Instructions or Data
The TIMES prefix causes the instruction to be assembled multiple times. This is partly present as NASM’s
equivalent of the DUP syntax supported by MASM–compatible assemblers, in that you can code
zerobuf: times 64 db 0
or similar things; but TIMES is more versatile than that. The argument to TIMES is not just a numeric
constant, but a numeric expression, so you can do things like
buffer: db ’hello, world’
times 64−$+buffer db ’ ’
which will store exactly enough spaces to make the total length of buffer up to 64. Finally, TIMES can be
applied to ordinary instructions, so you can code trivial unrolled loops in it:
times 100 movsb
Note that there is no effective difference between times 100 resb 1 and resb 100, except that the
latter will be assembled about 100 times faster due to the internal structure of the assembler.
The operand to TIMES is a critical expression (section 3.8).
Note also that TIMES can’t be applied to macros: the reason for this is that TIMES is processed after the
macro phase, which allows the argument to TIMES to contain expressions such as 64−$+buffer as above.
To repeat more than one line of code, or a complex macro, use the preprocessor %rep directive.
27
Anything not conforming to this simple system is not a valid memory reference in NASM, for example
es:wordvar[bx].
More complicated effective addresses, such as those involving more than one register, work in exactly the
same way:
mov eax,[ebx*2+ecx+offset]
mov ax,[bp+di+8]
NASM is capable of doing algebra on these effective addresses, so that things which don’t necessarily look
legal are perfectly all right:
mov eax,[ebx*5] ; assembles as [ebx*4+ebx]
mov eax,[label1*2−label2] ; ie [label1+(label1−label2)]
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
[eax*2+0] and [eax+eax], and NASM will generally generate the latter on the grounds that the former
requires four bytes to store a zero offset.
NASM has a hinting mechanism which will cause [eax+ebx] and [ebx+eax] to generate different
opcodes; this is occasionally useful because [esi+ebp] and [ebp+esi] have different default segment
registers.
However, you can force NASM to generate an effective address in a particular form by the use of the
keywords BYTE, WORD, DWORD and NOSPLIT. If you need [eax+3] to be assembled using a double−word
offset field instead of the one byte NASM will normally generate, you can code [dword eax+3].
Similarly, you can force NASM to use a byte offset for a small value which it hasn’t seen on the first pass (see
section 3.8 for an example of such a code fragment) by using [byte eax+offset]. As special cases,
[byte eax] will code [eax+0] with a byte offset of zero, and [dword eax] will code it with a
double−word offset of zero. The normal form, [eax], will be coded with no offset field.
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
(section 10.2). 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.
Similarly, NASM will split [eax*2] into [eax+eax] because that allows the offset field to be absent and
space to be saved; in fact, it will also split [eax*2+offset] into [eax+eax+offset]. You can combat
this behaviour by the use of the NOSPLIT keyword: [nosplit eax*2] will force [eax*2+0] to be
generated literally.
In 64−bit mode, NASM will by default generate absolute addresses. The REL keyword makes it produce
RIP–relative addresses. Since this is frequently the normally desired behaviour, see the DEFAULT directive
(section 6.2). The keyword ABS overrides REL.
3.4 Constants
NASM understands four different types of constant: numeric, character, string and floating−point.
3.4.1 Numeric Constants
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 H, Q or O, and B for hex, octal and binary, or you can prefix 0x for hex in
the style of C, or you can prefix $ for hex in the style of Borland Pascal. Note, though, that the $ prefix does
double duty as a prefix on identifiers (see section 3.1), so a hex number prefixed with a $ sign must have a
digit after the $ rather than a letter.
Numeric constants can have underscores (_) interspersed to break up long strings.
28
Some examples:
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
mov ax,1001_0011b ; same binary constant
3.4.2 Character Strings
A character string consists of up to eight characters enclosed in either single quotes (’...’), double quotes
("...") or backquotes (‘...‘). Single or double quotes are equivalent to NASM (except of course that
surrounding the constant with single quotes allows double quotes to appear within it and vice versa); the
contents of those are represented verbatim. Strings enclosed in backquotes support C−style \–escapes for
special characters.
The following escape sequences are recognized by backquoted strings:
\’ single quote (’)
\" double quote (")
\‘ backquote (‘)
\\ backslash (\)
\? question mark (?)
\a BEL (ASCII 7)
\b BS (ASCII 8)
\t TAB (ASCII 9)
\n LF (ASCII 10)
\v VT (ASCII 11)
\f FF (ASCII 12)
\r CR (ASCII 13)
\e ESC (ASCII 27)
\377 Up to 3 octal digits − literal byte
\xFF Up to 2 hexadecimal digits − literal byte
\u1234 4 hexadecimal digits − Unicode character
\U12345678 8 hexadecimal digits − Unicode character
All other escape sequences are reserved. Note that \0, meaning a NUL character (ASCII 0), is a special case
of the octal escape sequence.
Unicode characters specified with \u or \U are converted to UTF−8. For example, the following lines are all
equivalent:
db ‘\u263a‘ ; UTF−8 smiley face
db ‘\xe2\x98\xba‘ ; UTF−8 smiley face
db 0E2h, 098h, 0BAh ; UTF−8 smiley face
3.4.3 Character Constants
A character constant consists of a string up to eight bytes long, used in an expression context. It is treated as if
it was an integer.
A character constant with more than one byte will be arranged with little−endian order in mind: if you code
mov eax,’abcd’
29
then the constant generated is not 0x61626364, but 0x64636261, so that if you were then to store the
value into memory, it would read abcd rather than dcba. This is also the sense of character constants
understood by the Pentium’s CPUID instruction.
3.4.4 String Constants
String constants are character strings used in the context of some pseudo−instructions, namely the DB family
and INCBIN (where it represents a filename.) They are also used in certain preprocessor directives.
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:
db ’hello’ ; string constant
db ’h’,’e’,’l’,’l’,’o’ ; equivalent character constants
And the following are also equivalent:
dd ’ninechars’ ; doubleword string constant
dd ’nine’,’char’,’s’ ; becomes three doublewords
db ’ninechars’,0,0,0 ; and really looks like this
Note that when used in a string−supporting context, quoted strings are treated as a string constants even if
they are short enough to be a character constant, because otherwise db ’ab’ would have the same effect as
db ’a’, which would be silly. Similarly, three−character or four−character constants are treated as strings
when they are operands to DW, and so forth.
3.4.5 Unicode Strings
The special operators __utf16__ and __utf32__ allows definition of Unicode strings. They take a string
in UTF−8 format and converts it to (littleendian) UTF−16 or UTF−32, respectively.
For example:
%define u(x) __utf16__(x)
%define w(x) __utf32__(x)
30
dd 1.222_222_222 ; underscores are permitted
dd 0x1p+2 ; 1.0x2^2 = 4.0
dq 0x1p+32 ; 1.0x2^32 = 4 294 967 296.0
dq 1.e10 ; 10 000 000 000.0
dq 1.e+10 ; synonymous with 1.e10
dq 1.e−10 ; 0.000 000 000 1
dt 3.141592653589793238462 ; pi
do 1.e+4000 ; IEEE 754r quad precision
The 8−bit "quarter−precision" floating−point format is sign:exponent:mantissa = 1:4:3 with an exponent bias
of 7. This appears to be the most frequently used 8−bit floating−point format, although it is not covered by
any formal standard. This is sometimes called a "minifloat."
The special operators are used to produce floating−point numbers in other contexts. They produce the binary
representation of a specific floating−point number as an integer, and can use anywhere integer constants are
used in an expression. __float80m__ and __float80e__ produce the 64−bit mantissa and 16−bit
exponent of an 80−bit floating−point number, and __float128l__ and __float128h__ produce the
lower and upper 64−bit halves of a 128−bit floating−point number, respectively.
For example:
mov rax,__float64__(3.141592653589793238462)
... would assign the binary representation of pi as a 64−bit floating point number into RAX. This is exactly
equivalent to:
mov rax,0x400921fb54442d18
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.
The special tokens __Infinity__, __QNaN__ (or __NaN__) and __SNaN__ can be used to generate
infinities, quiet NaNs, and signalling NaNs, respectively. These are normally used as macros:
%define Inf __Infinity__
%define NaN __QNaN__
31
3.5 Expressions
Expressions in NASM are similar in syntax to those in C. Expressions are evaluated as 64−bit integers which
are then adjusted to the appropriate size.
NASM supports two special tokens in expressions, allowing calculations to involve the current assembly
position: the $ and $$ tokens. $ evaluates to the assembly position at the beginning of the line containing the
expression; so you can code an infinite loop using JMP $. $$ evaluates to the beginning of the current
section; so you can tell how far into the section you are by using ($−$$).
The arithmetic operators provided by NASM are listed here, in increasing order of precedence.
3.5.1 |: Bitwise OR Operator
The | operator gives a bitwise OR, exactly as performed by the OR machine instruction. Bitwise OR is the
lowest−priority arithmetic operator supported by NASM.
3.5.2 ^: Bitwise XOR Operator
^ provides the bitwise XOR operation.
3.5.3 &: Bitwise AND Operator
& provides the bitwise AND operation.
3.5.4 << and >>: Bit Shift Operators
<< gives a bit−shift to the left, just as it does in C. So 5<<3 evaluates to 5 times 8, or 40. >> gives a bit−shift
to the right; in NASM, such a shift is always 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.
3.5.5 + and −: Addition and Subtraction Operators
The + and − operators do perfectly ordinary addition and subtraction.
3.5.6 *, /, //, % and %%: Multiplication and Division
* is the multiplication operator. / and // are both division operators: / is unsigned division and // is signed
division. Similarly, % and %% provide unsigned and signed modulo operators respectively.
NASM, like ANSI C, provides no guarantees about the sensible operation of the signed modulo operator.
Since the % 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.
3.5.7 Unary Operators: +, −, ~, ! and SEG
The highest−priority operators in NASM’s expression grammar are those which only apply to one argument.
− negates its operand, + does nothing (it’s provided for symmetry with −), ~ computes the one’s complement
of its operand, ! is the logical negation operator, and SEG provides the segment address of its operand
(explained in more detail in section 3.6).
32
mov ax,seg symbol
mov es,ax
mov bx,symbol
will load ES:BX with a valid pointer to the symbol symbol.
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 WRT (With Reference To) keyword. So you can do things like
mov ax,weird_seg ; weird_seg is a segment base
mov es,ax
mov bx,symbol wrt weird_seg
to load ES:BX with a different, but functionally equivalent, pointer to the symbol symbol.
NASM supports far (inter−segment) calls and jumps by means of the syntax call segment:offset,
where segment and offset both represent immediate values. So to call a far procedure, you could code
either of
call (seg procedure):procedure
call weird_seg:(procedure wrt weird_seg)
(The parentheses are included for clarity, to show the intended parsing of the above instructions. They are not
necessary in practice.)
NASM supports the syntax call far procedure as a synonym for the first of the above usages. JMP
works identically to CALL in these examples.
To declare a far pointer to a data item in a data segment, you must code
dw symbol, seg symbol
NASM supports no convenient synonym for this, though you can always invent one using the macro
processor.
33
times (label−$) db 0
label: db ’Where am I?’
The argument to TIMES in this case could equally legally evaluate to anything at all; NASM will reject this
example because it cannot tell the size of the TIMES line when it first sees it. It will just as firmly reject the
slightly paradoxical code
times (label−$+1) db 0
label: db ’NOW where am I?’
in which any value for the TIMES argument is by definition wrong!
NASM rejects these examples by means of a concept called a critical expression, 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 TIMES prefix is a critical expression.
.loop
; some more code
jne .loop
ret
.loop
; some more code
jne .loop
ret
In the above code fragment, each JNE instruction jumps to the line immediately before it, because the two
definitions of .loop are kept separate by virtue of each being associated with the previous non−local label.
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
defining a local label in terms of the previous non−local label: the first definition of .loop above is really
defining a symbol called label1.loop, and the second defines a symbol called label2.loop. So, if you
really needed to, you could write
label3 ; some more code
; and some more
jmp label1.loop
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 ..@,
then it does nothing to the local label mechanism. So you could code
34
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
35
Chapter 4: The NASM Preprocessor
NASM contains a powerful macro processor, which supports conditional assembly, multi−level file inclusion,
two forms of macro (single−line and multi−line), and a ‘context stack’ mechanism for extra macro power.
Preprocessor directives all begin with a % sign.
The preprocessor collapses all lines which end with a backslash (\) character into a single line. Thus:
%define THIS_VERY_LONG_MACRO_NAME_IS_DEFINED_TO \
THIS_VALUE
will work like a single−line macro without the backslash−newline sequence.
mov ax,a(8)
will evaluate in the expected way to mov ax,1+2*8, even though the macro b wasn’t defined at the time of
definition of a.
Macros defined with %define are case sensitive: after %define foo bar, only foo will expand to bar:
Foo or FOO will not. By using %idefine instead of %define (the ‘i’ stands for ‘insensitive’) you can
define all the case variants of a macro at once, so that %idefine foo bar would cause foo, Foo, FOO,
fOO and so on all to expand to bar.
There is a mechanism which detects when a macro call has occurred as a result of a previous expansion of the
same macro, to guard against circular references and infinite loops. If this happens, the preprocessor will only
expand the first occurrence of the macro. Hence, if you code
%define a(x) 1+a(x)
mov ax,a(3)
the macro a(3) will expand once, becoming 1+a(3), and will then expand no further. This behaviour can
be useful: see section 9.1 for an example of its use.
36
You can overload single−line macros: if you write
%define foo(x) 1+x
%define foo(x,y) 1+x*y
the preprocessor will be able to handle both types of macro call, by counting the parameters you pass; so
foo(3) will become 1+3 whereas foo(ebx,2) will become 1+ebx*2. However, if you define
%define foo bar
then no other definition of foo will be accepted: a macro with no parameters prohibits the definition of the
same name as a macro with parameters, and vice versa.
This doesn’t prevent single−line macros being redefined: you can perfectly well define a macro with
%define foo bar
and then re−define it later in the same source file with
%define foo baz
Then everywhere the macro foo is invoked, it will be expanded according to the most recent definition. This
is particularly useful when defining single−line macros with %assign (see section 4.1.6).
You can pre−define single−line macros using the ‘−d’ option on the NASM command line: see section 2.1.18.
4.1.2 Resolving %define: %xdefine
To have a reference to an embedded single−line macro resolved at the time that the embedding macro is
defined, as opposed to when the embedding macro is expanded, you need a different mechanism to the one
offered by %define. The solution is to use %xdefine, or it’s case−insensitive counterpart %ixdefine.
Suppose you have the following code:
%define isTrue 1
%define isFalse isTrue
%define isTrue 0
val1: db isFalse
%define isTrue 1
val2: db isFalse
In this case, val1 is equal to 0, and val2 is equal to 1. This is because, when a single−line macro is defined
using %define, it is expanded only when it is called. As isFalse expands to isTrue, the expansion will
be the current value of isTrue. The first time it is called that is 0, and the second time it is 1.
If you wanted isFalse to expand to the value assigned to the embedded macro isTrue at the time that
isFalse was defined, you need to change the above code to use %xdefine.
%xdefine isTrue 1
%xdefine isFalse isTrue
%xdefine isTrue 0
val1: db isFalse
%xdefine isTrue 1
val2: db isFalse
37
Now, each time that isFalse is called, it expands to 1, as that is what the embedded macro isTrue
expanded to at the time that isFalse was defined.
4.1.3 Concatenating Single Line Macro Tokens: %+
Individual tokens in single line macros can be concatenated, to produce longer tokens for later processing.
This can be useful if there are several similar macros that perform similar functions.
Please note that a space is required after %+, in order to disambiguate it from the syntax %+1 used in multiline
macros.
As an example, consider the following:
%define BDASTART 400h ; Start of BIOS data area
struc tBIOSDA ; its structure
.COM1addr RESW 1
.COM2addr RESW 1
; ..and so on
endstruc
Now, if we need to access the elements of tBIOSDA in different places, we can end up with:
mov ax,BDASTART + tBIOSDA.COM1addr
mov bx,BDASTART + tBIOSDA.COM2addr
This will become pretty ugly (and tedious) if used in many places, and can be reduced in size significantly by
using the following macro:
; Macro to access BIOS variables by their names (from tBDA):
%define BDA(x) BDASTART + tBIOSDA. %+ x
Now the above code can be written as:
mov ax,BDA(COM1addr)
mov bx,BDA(COM2addr)
Using this feature, we can simplify references to a lot of macros (and, in turn, reduce typing errors).
4.1.4 The Macro Name Itself: %? and %??
The special symbols %? and %?? can be used to reference the macro name itself inside a macro expansion,
this is supported for both single−and multi−line macros. %? refers to the macro name as invoked, whereas
%?? refers to the macro name as declared. The two are always the same for case−sensitive macros, but for
case−insensitive macros, they can differ.
For example:
%idefine Foo mov %?,%??
foo
FOO
will expand to:
mov foo,Foo
mov FOO,Foo
The sequence:
%idefine keyword $%?
38
can be used to make a keyword "disappear", for example in case a new instruction has been used as a label in
older code. For example:
%idefine pause $%? ; Hide the PAUSE instruction
4.1.5 Undefining Single−Line Macros: %undef
Single−line macros can be removed with the %undef directive. For example, the following sequence:
%define foo bar
%undef foo
39
4.2.1 Concatenating Strings: %strcat
The %strcat operator concatenates quoted strings and assign them to a single−line macro. In doing so, it
may change the type of quotes and possibly use \–escapes inside ‘–quoted strings in order to make sure the
string is still a valid quoted string.
For example:
%strcat alpha "Alpha: ", ’12" screen’
... would assign the value ’Alpha: 12" screen’ to alpha. Similarly:
%strcat beta ’"’, "’"
... would assign the value ‘"’‘ to beta.
The use of commas to separate strings is permitted but optional.
4.2.2 String Length: %strlen
The %strlen operator assigns the length of a string to a macro. For example:
%strlen charcnt ’my string’
In this example, charcnt would receive the value 9, just as if an %assign had been used. In this example,
’my string’ was a literal string but it could also have been a single−line macro that expands to a string, as
in the following example:
%define sometext ’my string’
%strlen charcnt sometext
As in the first case, this would result in charcnt being assigned the value of 9.
4.2.3 Extracting Substrings: %substr
Individual letters or substrings in strings can be extracted using the %substr operator. An example of its use
is probably more useful than the description:
%substr mychar ’xyzw’ 1 ; equivalent to %define mychar ’x’
%substr mychar ’xyzw’ 2 ; equivalent to %define mychar ’y’
%substr mychar ’xyzw’ 3 ; equivalent to %define mychar ’z’
%substr mychar ’xyzw’ 2,2 ; equivalent to %define mychar ’yz’
%substr mychar ’xyzw’ 2,−1 ; equivalent to %define mychar ’yzw’
%substr mychar ’xyzw’ 2,−2 ; equivalent to %define mychar ’yz’
As with %strlen (see section 4.2.2), the first parameter is the single−line macro to be created and the
second is the string. The third parameter specifies the first character to be selected, and the optional fourth
parameter preceeded by comma) is the length. Note that the first index is 1, not 0 and the last index is equal to
the value that %strlen would assign given the same string. Index values out of range result in an empty
string. A negative length means "until N−1 characters before the end of string", i.e. −1 means until end of
string, −2 until one character before, etc.
push ebp
mov ebp,esp
40
sub esp,%1
%endmacro
This defines a C−like function prologue as a macro: so you would invoke the macro with a call such as
myfunc: prologue 12
which would expand to the three lines of code
myfunc: push ebp
mov ebp,esp
sub esp,12
The number 1 after the macro name in the %macro line defines the number of parameters the macro
prologue expects to receive. The use of %1 inside the macro definition refers to the first parameter to the
macro call. With a macro taking more than one parameter, subsequent parameters would be referred to as %2,
%3 and so on.
Multi−line macros, like single−line macros, are case−sensitive, unless you define them using the alternative
directive %imacro.
If you need to pass a comma as part of a parameter to a multi−line macro, you can do that by enclosing the
entire parameter in braces. So you could code things like
%macro silly 2
%2: db %1
%endmacro
push ebp
mov ebp,esp
%endmacro
to define an alternative form of the function prologue which allocates no local stack space.
Sometimes, however, you might want to ‘overload’ a machine instruction; for example, you might want to
define
%macro push 2
push %1
push %2
%endmacro
41
so that you could code
push ebx ; this line is not a macro call
push eax,ecx ; but this one is
Ordinarily, NASM will give a warning for the first of the above two lines, since push is now defined to be a
macro, and is being invoked with a number of parameters for which no definition has been given. The correct
code will still be generated, but the assembler will give a warning. This warning can be disabled by the use of
the −w−macro−params command−line option (see section 2.1.24).
4.3.2 Macro−Local Labels
NASM allows you to define labels within a multi−line macro definition in such a way as to make them local
to the macro call: so calling the same macro multiple times will use a different label each time. You do this by
prefixing %% to the label name. So you can invent an instruction which executes a RET if the Z flag is set by
doing this:
%macro retz 0
jnz %%skip
ret
%%skip:
%endmacro
You can call this macro as many times as you want, and every time you call it NASM will make up a different
‘real’ name to substitute for the label %%skip. The names NASM invents are of the form [email protected],
where the number 2345 changes with every macro call. The ..@ prefix prevents macro−local labels from
interfering with the local label mechanism, as described in section 3.9. You should avoid defining your own
labels in this form (the ..@ prefix, then a number, then another period) in case they interfere with
macro−local labels.
4.3.3 Greedy Macro Parameters
Occasionally it is useful to define a macro which lumps its entire command line into one parameter definition,
possibly after extracting one or two smaller parameters from the front. An example might be a macro to write
a text string to a file in MS−DOS, where you might want to be able to write
writefile [filehandle],"hello, world",13,10
NASM allows you to define the last parameter of a macro to be greedy, meaning that if you invoke the macro
with more parameters than it expects, all the spare parameters get lumped into the last defined one along with
the separating commas. So if you code:
%macro writefile 2+
jmp %%endstr
%%str: db %2
%%endstr:
mov dx,%%str
mov cx,%%endstr−%%str
mov bx,%1
mov ah,0x40
int 0x21
%endmacro
42
then the example call to writefile above will work as expected: the text before the first comma,
[filehandle], is used as the first macro parameter and expanded when %1 is referred to, and all the
subsequent text is lumped into %2 and placed after the db.
The greedy nature of the macro is indicated to NASM by the use of the + sign after the parameter count on the
%macro line.
If you define a greedy macro, you are effectively telling NASM how it should expand the macro given any
number of parameters from the actual number specified up to infinity; in this case, for example, NASM now
knows what to do when it sees a call to writefile with 2, 3, 4 or more parameters. NASM will take this
into account when overloading macros, and will not allow you to define another form of writefile taking
4 parameters (for example).
Of course, the above macro could have been implemented as a non−greedy macro, in which case the call to it
would have had to look like
writefile [filehandle], {"hello, world",13,10}
NASM provides both mechanisms for putting commas in macro parameters, and you choose which one you
prefer for each macro definition.
See section 6.3.1 for a better way to write the above macro.
4.3.4 Default Macro Parameters
NASM also allows you to define a multi−line macro with a range of allowable parameter counts. If you do
this, you can specify defaults for omitted parameters. So, for example:
%macro die 0−1 "Painful program death has occurred."
writefile 2,%1
mov ax,0x4c01
int 0x21
%endmacro
This macro (which makes use of the writefile macro defined in section 4.3.3) can be called with an
explicit error message, which it will display on the error output stream before exiting, or it can be called with
no parameters, in which case it will use the default error message supplied in the macro definition.
In general, you supply a minimum and maximum number of parameters for a macro of this type; the
minimum number of parameters are then required in the macro call, and then you provide defaults for the
optional ones. So if a macro definition began with the line
%macro foobar 1−3 eax,[ebx+2]
then it could be called with between one and three parameters, and %1 would always be taken from the macro
call. %2, if not specified by the macro call, would default to eax, and %3 if not specified would default to
[ebx+2].
You can provide extra information to a macro by providing too many default parameters:
%macro quux 1 something
This will trigger a warning by default; see section 2.1.24 for more information. When quux is invoked, it
receives not one but two parameters. something can be referred to as %2. The difference between passing
something this way and writing something in the macro body is that with this way something is
evaluated when the macro is defined, not when it is expanded.
43
You may omit parameter defaults from the macro definition, in which case the parameter default is taken to be
blank. This can be useful for macros which can take a variable number of parameters, since the %0 token (see
section 4.3.5) allows you to determine how many parameters were really passed to the macro call.
This defaulting mechanism can be combined with the greedy−parameter mechanism; so the die macro above
could be made more powerful, and more useful, by changing the first line of the definition to
%macro die 0−1+ "Painful program death has occurred.",13,10
The maximum parameter count can be infinite, denoted by *. In this case, of course, it is impossible to
provide a full set of default parameters. Examples of this usage are shown in section 4.3.6.
4.3.5 %0: Macro Parameter Counter
The parameter reference %0 will return a numeric constant giving the number of parameters received, that is,
if %0 is n then %n is the last parameter. %0 is mostly useful for macros that can take a variable number of
parameters. It can be used as an argument to %rep (see section 4.5) in order to iterate through all the
parameters of a macro. Examples are given in section 4.3.6.
4.3.6 %rotate: Rotating Macro Parameters
Unix shell programmers will be familiar with the shift shell command, which allows the arguments passed
to a shell script (referenced as $1, $2 and so on) to be moved left by one place, so that the argument
previously referenced as $2 becomes available as $1, and the argument previously referenced as $1 is no
longer available at all.
NASM provides a similar mechanism, in the form of %rotate. As its name suggests, it differs from the
Unix shift in that no parameters are lost: parameters rotated off the left end of the argument list reappear on
the right, and vice versa.
%rotate is invoked with a single numeric argument (which may be an expression). The macro parameters
are rotated to the left by that many places. If the argument to %rotate is negative, the macro parameters are
rotated to the right.
So a pair of macros to save and restore a set of registers might work as follows:
%macro multipush 1−*
%rep %0
push %1
%rotate 1
%endrep
%endmacro
This macro invokes the PUSH instruction on each of its arguments in turn, from left to right. It begins by
pushing its first argument, %1, then invokes %rotate to move all the arguments one place to the left, so that
the original second argument is now available as %1. Repeating this procedure as many times as there were
arguments (achieved by supplying %0 as the argument to %rep) causes each argument in turn to be pushed.
Note also the use of * as the maximum parameter count, indicating that there is no upper limit on the number
of parameters you may supply to the multipush macro.
It would be convenient, when using this macro, to have a POP equivalent, which didn’t require the arguments
to be given in reverse order. Ideally, you would write the multipush macro call, then cut−and−paste the
line to where the pop needed to be done, and change the name of the called macro to multipop, and the
macro would take care of popping the registers in the opposite order from the one in which they were pushed.
This can be done by the following definition:
44
%macro multipop 1−*
%rep %0
%rotate −1
pop %1
%endrep
%endmacro
This macro begins by rotating its arguments one place to the right, so that the original last argument appears
as %1. This is then popped, and the arguments are rotated right again, so the second−to−last argument
becomes %1. Thus the arguments are iterated through in reverse order.
4.3.7 Concatenating Macro Parameters
NASM can concatenate macro parameters on to other text surrounding them. This allows you to declare a
family of symbols, for example, in a macro definition. If, for example, you wanted to generate a table of key
codes along with offsets into the table, you could code something like
%macro keytab_entry 2
%endmacro
keytab:
keytab_entry F1,128+1
keytab_entry F2,128+2
keytab_entry Return,13
which would expand to
keytab:
keyposF1 equ $−keytab
db 128+1
keyposF2 equ $−keytab
db 128+2
keyposReturn equ $−keytab
db 13
You can just as easily concatenate text on to the other end of a macro parameter, by writing %1foo.
If you need to append a digit to a macro parameter, for example defining labels foo1 and foo2 when passed
the parameter foo, you can’t code %11 because that would be taken as the eleventh macro parameter.
Instead, you must code %{1}1, which will separate the first 1 (giving the number of the macro parameter)
from the second (literal text to be concatenated to the parameter).
This concatenation can also be applied to other preprocessor in−line objects, such as macro−local labels
(section 4.3.2) and context−local labels (section 4.7.2). In all cases, ambiguities in syntax can be resolved by
enclosing everything after the % sign and before the literal text in braces: so %{%foo}bar concatenates the
text bar to the end of the real name of the macro−local label %%foo. (This is unnecessary, since the form
NASM uses for the real names of macro−local labels means that the two usages %{%foo}bar and
%%foobar would both expand to the same thing anyway; nevertheless, the capability is there.)
See also the %+ operator, section 4.1.3.
45
4.3.8 Condition Codes as Macro Parameters
NASM can give special treatment to a macro parameter which contains a condition code. For a start, you can
refer to the macro parameter %1 by means of the alternative syntax %+1, which informs NASM that this
macro parameter is supposed to contain a condition code, and will cause the preprocessor to report an error
message if the macro is called with a parameter which is not a valid condition code.
Far more usefully, though, you can refer to the macro parameter by means of %−1, which NASM will expand
as the inverse condition code. So the retz macro defined in section 4.3.2 can be replaced by a general
conditional−return macro like this:
%macro retc 1
j%−1 %%skip
ret
%%skip:
%endmacro
This macro can now be invoked using calls like retc ne, which will cause the conditional−jump instruction
in the macro expansion to come out as JE, or retc po which will make the jump a JPE.
The %+1 macro−parameter reference is quite happy to interpret the arguments CXZ and ECXZ as valid
condition codes; however, %−1 will report an error if passed either of these, because no inverse condition
code exists.
4.3.9 Disabling Listing Expansion
When NASM is generating a listing file from your program, it will generally expand multi−line macros by
means of writing the macro call and then listing each line of the expansion. This allows you to see which
instructions in the macro expansion are generating what code; however, for some macros this clutters the
listing up unnecessarily.
NASM therefore provides the .nolist qualifier, which you can include in a macro definition to inhibit the
expansion of the macro in the listing file. The .nolist qualifier comes directly after the number of
parameters, like this:
%macro foo 1.nolist
Or like this:
%macro bar 1−5+.nolist a,b,c,d,e,f,g,h
4.3.10 Undefining Multi−Line Macros: %unmacro
Multi−line macros can be removed with the %unmacro directive. Unlike the %undef directive, however,
%unmacro takes an argument specification, and will only remove exact matches with that argument
specification.
For example:
%macro foo 1−3
; Do something
%endmacro
%unmacro foo 1−3
removes the previously defined macro foo, but
%unmacro bar 1−3
; Do something
46
%endmacro
%unmacro bar 1
does not remove the macro bar, since the argument specification does not match exactly.
47
%else
%endmacro
%endif
This will create the macro "MyMacro 1−3" if no macro already exists which would conflict with it, and emits
a warning if there would be a definition conflict.
You can test for the macro not existing by using the %ifnmacro instead of %ifmacro. Additional tests can
be performed in %elif blocks by using %elifmacro and %elifnmacro.
4.4.3 %ifctx: Testing the Context Stack
The conditional−assembly construct %ifctx will cause the subsequent code to be assembled if and only if
the top context on the preprocessor’s context stack has the same name as one of the arguments. As with
%ifdef, the inverse and %elif forms %ifnctx, %elifctx and %elifnctx are also supported.
For more details of the context stack, see section 4.7. For a sample use of %ifctx, see section 4.7.5.
4.4.4 %if: Testing Arbitrary Numeric Expressions
The conditional−assembly construct %if expr will cause the subsequent code to be assembled if and only if
the value of the numeric expression expr is non−zero. An example of the use of this feature is in deciding
when to break out of a %rep preprocessor loop: see section 4.5 for a detailed example.
The expression given to %if, and its counterpart %elif, is a critical expression (see section 3.8).
%if extends the normal NASM expression syntax, by providing a set of relational operators which are not
normally available in expressions. The operators =, <, >, <=, >= and <> test equality, less−than, greater−than,
less−or−equal, greater−or−equal and not−equal respectively. The C−like forms == and != are supported as
alternative forms of = and <>. In addition, low−priority logical operators &&, ^^ and || are provided,
supplying logical AND, logical XOR and logical OR. These work like the C logical operators (although C has
no logical XOR), in that they always return either 0 or 1, and treat any non−zero input as 1 (so that ^^, for
example, returns 1 if exactly one of its inputs is zero, and 0 otherwise). The relational operators also return 1
for true and 0 for false.
Like other %if constructs, %if has a counterpart %elif, and negative forms %ifn and %elifn.
4.4.5 %ifidn and %ifidni: Testing Exact Text Identity
The construct %ifidn text1,text2 will cause the subsequent code to be assembled if and only if
text1 and text2, after expanding single−line macros, are identical pieces of text. Differences in white
space are not counted.
%ifidni is similar to %ifidn, but is case−insensitive.
For example, the following macro pushes a register or number on the stack, and allows you to treat IP as a
real register:
%macro pushparam 1
%ifidni %1,ip
call %%label
%%label:
48
%else
push %1
%endif
%endmacro
Like other %if constructs, %ifidn has a counterpart %elifidn, and negative forms %ifnidn and
%elifnidn. Similarly, %ifidni has counterparts %elifidni, %ifnidni and %elifnidni.
4.4.6 %ifid, %ifnum, %ifstr: Testing Token Types
Some macros will want to perform different tasks depending on whether they are passed a number, a string, or
an identifier. For example, a string output macro might want to be able to cope with being passed either a
string constant or a pointer to an existing string.
The conditional assembly construct %ifid, taking one parameter (which may be blank), assembles the
subsequent code if and only if the first token in the parameter exists and is an identifier. %ifnum works
similarly, but tests for the token being a numeric constant; %ifstr tests for it being a string.
For example, the writefile macro defined in section 4.3.3 can be extended to take advantage of %ifstr
in the following fashion:
%macro writefile 2−3+
%ifstr %2
jmp %%endstr
%if %0 = 3
%%str: db %2,%3
%else
%%str: db %2
%endif
%%endstr: mov dx,%%str
mov cx,%%endstr−%%str
%else
mov dx,%2
mov cx,%3
%endif
mov bx,%1
mov ah,0x40
int 0x21
%endmacro
Then the writefile macro can cope with being called in either of the following two ways:
writefile [file], strpointer, length
writefile [file], "hello", 13, 10
In the first, strpointer is used as the address of an already−declared string, and length is used as its
length; in the second, a string is given to the macro, which therefore declares it itself and works out the
address and length for itself.
Note the use of %if inside the %ifstr: this is to detect whether the macro was passed two arguments (so the
string would be a single string constant, and db %2 would be adequate) or more (in which case, all but the
first two would be lumped together into %3, and db %2,%3 would be required).
The usual %elif..., %ifn..., and %elifn... versions exist for each of %ifid, %ifnum and %ifstr.
49
4.4.7 %iftoken: Test for a Single Token
Some macros will want to do different things depending on if it is passed a single token (e.g. paste it to
something else using %+) versus a multi−token sequence.
The conditional assembly construct %iftoken assembles the subsequent code if and only if the expanded
parameters consist of exactly one token, possibly surrounded by whitespace.
For example:
%iftoken 1
will assemble the subsequent code, but
%iftoken −1
will not, since −1 contains two tokens: the unary minus operator −, and the number 1.
The usual %eliftoken, %ifntoken, and %elifntoken variants are also provided.
4.4.8 %ifempty: Test for Empty Expansion
The conditional assembly construct %ifempty assembles the subsequent code if and only if the expanded
parameters do not contain any tokens at all, whitespace excepted.
The usual %elifempty, %ifnempty, and %elifnempty variants are also provided.
50
fib_number equ ($−fibonacci)/2
This produces a list of all the Fibonacci numbers that will fit in 16 bits. Note that a maximum repeat count
must still be given to %rep. This is to prevent the possibility of NASM getting into an infinite loop in the
preprocessor, which (on multitasking or multi−user systems) would typically cause all the system memory to
be gradually used up and other applications to start crashing.
51
incbin dep,%2
%endmacro
This first resolves the location of the file into the macro dep, then adds it to the dependency lists, and finally
issues the assembler−level INCBIN directive.
4.6.4 %use: Include Standard Macro Package
The %use directive is similar to %include, but rather than including the contents of a file, it includes a
named standard macro package. The standard macro packages are part of NASM, and are described in chapter
5.
Unlike the %include directive, package names for the %use directive do not require quotes, but quotes are
permitted; using quotes will prevent unwanted macro expansion. Thus, the following lines are equivalent,
unless altreg is defined as a macro:
%use altreg
%use ’altreg’
Standard macro packages are protected from multiple inclusion. When a standard macro package is used, a
testable single−line macro of the form __USE_package__ is also defined, see section 4.11.8.
%push repeat
%$begin:
%endmacro
%macro until 1
52
j%−1 %$begin
%pop
%endmacro
and invoked by means of, for example,
mov cx,string
repeat
add cx,3
scasb
until e
which would scan every fourth byte of a string in search of the byte in AL.
If you need to define, or access, labels local to the context below the top one on the stack, you can use
%$$foo, or %$$$foo for the context below that, and so on.
4.7.3 Context−Local Single−Line Macros
NASM also allows you to define single−line macros which are local to a particular context, in just the same
way:
%define %$localmac 3
will define the single−line macro %$localmac to be local to the top context on the stack. Of course, after a
subsequent %push, it can then still be accessed by the name %$$localmac.
4.7.4 %repl: Renaming a Context
If you need to change the name of the top context on the stack (in order, for example, to have it respond
differently to %ifctx), you can execute a %pop followed by a %push; but this will have the side effect of
destroying all context−local labels and macros associated with the context that was just popped.
NASM provides the directive %repl, which replaces a context with a different name, without touching the
associated macros and labels. So you could replace the destructive code
%pop
%push newname
with the non−destructive version %repl newname.
4.7.5 Example Use of the Context Stack: Block IFs
This example makes use of almost all the context−stack features, including the conditional−assembly
construct %ifctx, to implement a block IF statement as a set of macros.
%macro if 1
%push if
j%−1 %$ifnot
%endmacro
%macro else 0
%ifctx if
%repl else
jmp %$ifend
53
%$ifnot:
%else
%error "expected ‘if’ before ‘else’"
%endif
%endmacro
%macro endif 0
%ifctx if
%$ifnot:
%pop
%elifctx else
%$ifend:
%pop
%else
%error "expected ‘if’ or ‘else’ before ‘endif’"
%endif
%endmacro
This code is more robust than the REPEAT and UNTIL macros given in section 4.7.2, because it uses
conditional assembly to check that the macros are issued in the right order (for example, not calling endif
before if) and issues a %error if they’re not.
In addition, the endif macro has to be able to cope with the two distinct cases of either directly following an
if, or following an else. It achieves this, again, by using conditional assembly to do different things
depending on whether the context on top of the stack is if or else.
The else macro has to preserve the context on the stack, in order to have the %$ifnot referred to by the if
macro be the same as the one defined by the endif macro, but has to change the context’s name so that
endif will know there was an intervening else. It does this by the use of %repl.
A sample usage of these macros might look like:
cmp ax,bx
if ae
cmp bx,cx
if ae
mov ax,cx
else
mov ax,bx
endif
else
cmp ax,cx
if ae
mov ax,cx
endif
endif
54
The block−IF macros handle nesting quite happily, by means of pushing another context, describing the inner
if, on top of the one describing the outer if; thus else and endif always refer to the last unmatched if
or else.
mov ax,[i]
mov bx,[j_ptr]
add ax,[bx]
ret
55
%stacksize small
This form also uses bp to address stack parameters, but it is different from large because it also assumes
that the old value of bp is pushed onto the stack (i.e. it expects an ENTER instruction). In other words, it
expects that bp, ip and cs are on the top of the stack, underneath any local space which may have been
allocated by ENTER. This form is probably most useful when used in combination with the %local directive
(see section 4.8.3).
4.8.3 %local Directive
The %local directive is used to simplify the use of local temporary stack variables allocated in a stack
frame. Automatic local variables in C are an example of this kind of variable. The %local directive is most
useful when used with the %stacksize (see section 4.8.2 and is also compatible with the %arg directive
(see section 4.8.1). It allows simplified reference to variables on the stack which have been allocated typically
by using the ENTER instruction. An example of its use is the following:
silly_swap:
56
Similarly, %warning issues a warning, but allows assembly to continue:
%ifdef F1
; do some setup
%elifdef F2
; do some different setup
%else
%warning "Neither F1 nor F2 was defined, assuming F1."
%define F1
%endif
%error and %warning are issued only on the final assembly pass. This makes them safe to use in
conjunction with tests that depend on symbol values.
%fatal terminates assembly immediately, regardless of pass. This is useful when there is no point in
continuing the assembly further, and doing so is likely just going to cause a spew of confusing error messages.
It is optional for the message string after %error, %warning or %fatal to be quoted. If it is not, then
single−line macros are expanded in it, which can be used to display more information to the user. For
example:
%if foo > 64
%assign foo_over foo−64
%error foo is foo_over bytes too large
%endif
57
4.10.2 %!<env>: Read an environment variable.
The %!<env> directive makes it possible to read the value of an environment variable at assembly time. This
could, for example, be used to store the contents of an environment variable into a string, which could be used
at some other point in your code.
For example, suppose that you have an environment variable FOO, and you want the contents of FOO to be
embedded in your program. You could do that as follows:
%defstr FOO %!FOO
See section 4.1.7 for notes on the %defstr directive.
58
4.11.4 __FILE__ and __LINE__: File Name and Line Number
Like the C preprocessor, NASM allows the user to find out the file name and line number containing the
current instruction. The macro __FILE__ expands to a string constant giving the name of the current input
file (which may change through the course of assembly if %include directives are used), and __LINE__
expands to a numeric constant giving the current line number in the input file.
These macros could be used, for example, to communicate debugging information to a macro, since invoking
__LINE__ inside a macro definition (either single−line or multi−line) will return the line number of the
macro call, rather than definition. So to determine where in a piece of code a crash is occurring, for example,
one could write a routine stillhere, which is passed a line number in EAX and outputs something like
‘line 155: still here’. You could then write a macro
%macro notdeadyet 0
push eax
mov eax,__LINE__
call stillhere
pop eax
%endmacro
and then pepper your code with calls to notdeadyet until you find the crash point.
4.11.5 __BITS__: Current BITS Mode
The __BITS__ standard macro is updated every time that the BITS mode is set using the BITS XX or
[BITS XX] directive, where XX is a valid mode number of 16, 32 or 64. __BITS__ receives the specified
mode number and makes it globally available. This can be very useful for those who utilize mode−dependent
macros.
4.11.6 __OUTPUT_FORMAT__: Current Output Format
The __OUTPUT_FORMAT__ standard macro holds the current Output Format, as given by the −f option or
NASM’s default. Type nasm −hf for a list.
%ifidn __OUTPUT_FORMAT__, win32
%define NEWLINE 13, 10
%elifidn __OUTPUT_FORMAT__, elf32
%define NEWLINE 10
%endif
4.11.7 Assembly Date and Time Macros
NASM provides a variety of macros that represent the timestamp of the assembly session.
• The __DATE__ and __TIME__ macros give the assembly date and time as strings, in ISO 8601 format
("YYYY−MM−DD" and "HH:MM:SS", respectively.)
• The __DATE_NUM__ and __TIME_NUM__ macros give the assembly date and time in numeric form; in
the format YYYYMMDD and HHMMSS respectively.
• The __UTC_DATE__ and __UTC_TIME__ macros give the assembly date and time in universal time
(UTC) as strings, in ISO 8601 format ("YYYY−MM−DD" and "HH:MM:SS", respectively.) If the host
platform doesn’t provide UTC time, these macros are undefined.
• The __UTC_DATE_NUM__ and __UTC_TIME_NUM__ macros give the assembly date and time
universal time (UTC) in numeric form; in the format YYYYMMDD and HHMMSS respectively. If the host
platform doesn’t provide UTC time, these macros are undefined.
59
• The __POSIX_TIME__ macro is defined as a number containing the number of seconds since the POSIX
epoch, 1 January 1970 00:00:00 UTC; excluding any leap seconds. This is computed using UTC time if
available on the host platform, otherwise it is computed using the local time as if it was UTC.
All instances of time and date macros in the same assembly session produce consistent output. For example,
in an assembly session started at 42 seconds after midnight on January 1, 2010 in Moscow (timezone UTC+3)
these macros would have the following values, assuming, of course, a properly configured environment with a
correct clock:
__DATE__ "2010−01−01"
__TIME__ "00:00:42"
__DATE_NUM__ 20100101
__TIME_NUM__ 000042
__UTC_DATE__ "2009−12−31"
__UTC_TIME__ "21:00:42"
__UTC_DATE_NUM__ 20091231
__UTC_TIME_NUM__ 210042
__POSIX_TIME__ 1262293242
4.11.8 __USE_package__: Package Include Test
When a standard macro package (see chapter 5) is included with the %use directive (see section 4.6.4), a
single−line macro of the form __USE_package__ is automatically defined. This allows testing if a particular
package is invoked or not.
For example, if the altreg package is included (see section 5.1), then the macro __USE_ALTREG__ is
defined.
4.11.9 __PASS__: Assembly Pass
The macro __PASS__ is defined to be 1 on preparatory passes, and 2 on the final pass. In preprocess−only
mode, it is set to 3, and when running only to generate dependencies (due to the −M or −MG option, see
section 2.1.4) it is set to 0.
Avoid using this macro if at all possible. It is tremendously easy to generate very strange errors by misusing
it, and the semantics may change in future versions of NASM.
4.11.10 STRUC and ENDSTRUC: Declaring Structure Data Types
The core of NASM contains no intrinsic means of defining data structures; instead, the preprocessor is
sufficiently powerful that data structures can be implemented as a set of macros. The macros STRUC and
ENDSTRUC are used to define a structure data type.
STRUC takes one parameter, which is the name of the data type. This name is defined as a symbol with the
value zero, and also has the suffix _size appended to it and is then defined as an EQU giving the size of the
structure. Once STRUC has been issued, you are defining the structure, and should define fields using the
RESB family of pseudo−instructions, and then invoke ENDSTRUC to finish the definition.
For example, to define a structure called mytype containing a longword, a word, a byte and a string of bytes,
you might code
struc mytype
mt_long: resd 1
mt_word: resw 1
mt_byte: resb 1
mt_str: resb 32
endstruc
60
The above code defines six symbols: mt_long as 0 (the offset from the beginning of a mytype structure to
the longword field), mt_word as 4, mt_byte as 6, mt_str as 7, mytype_size as 39, and mytype itself
as zero.
The reason why the structure type name is defined at zero is a side effect of allowing structures to work with
the local label mechanism: if your structure members tend to have the same names in more than one structure,
you can define the above structure like this:
struc mytype
.long: resd 1
.word: resw 1
.byte: resb 1
.str: resb 32
endstruc
This defines the offsets to the structure fields as mytype.long, mytype.word, mytype.byte and
mytype.str.
NASM, since it has no intrinsic structure support, does not support any form of period notation to refer to the
elements of a structure once you have one (except the above local−label notation), so code such as
mov ax,[mystruc.mt_word] is not valid. mt_word is a constant just like any other constant, so the
correct syntax is mov ax,[mystruc+mt_word] or mov ax,[mystruc+mytype.word].
4.11.11 ISTRUC, AT and IEND: Declaring Instances of Structures
Having defined a structure type, the next thing you typically want to do is to declare instances of that structure
in your data segment. NASM provides an easy way to do this in the ISTRUC mechanism. To declare a
structure of type mytype in a program, you code something like this:
mystruc:
istruc mytype
at mt_long, dd 123456
at mt_word, dw 1024
at mt_byte, db ’x’
at mt_str, db ’hello, world’, 13, 10, 0
iend
The function of the AT macro is to make use of the TIMES prefix to advance the assembly position to the
correct point for the specified structure field, and then to declare the specified data. Therefore the structure
fields must be declared in the same order as they were specified in the structure definition.
If the data to go in a structure field requires more than one source line to specify, the remaining source lines
can easily come after the AT line. For example:
at mt_str, db 123,134,145,156,167,178,189
db 190,100,0
Depending on personal taste, you can also omit the code part of the AT line completely, and start the structure
field on the next line:
at mt_str
db ’hello, world’
db 13,10,0
61
4.11.12 ALIGN and ALIGNB: Data Alignment
The ALIGN and ALIGNB macros provides a convenient way to align code or data on a word, longword,
paragraph or other boundary. (Some assemblers call this directive EVEN.) The syntax of the ALIGN and
ALIGNB macros is
align 4 ; align on 4−byte boundary
align 16 ; align on 16−byte boundary
align 8,db 0 ; pad with 0s rather than NOPs
align 4,resb 1 ; align to 4 in the BSS
alignb 4 ; equivalent to previous line
Both macros require their first argument to be a power of two; they both compute the number of additional
bytes required to bring the length of the current section up to a multiple of that power of two, and then apply
the TIMES prefix to their second argument to perform the alignment.
If the second argument is not specified, the default for ALIGN is NOP, and the default for ALIGNB is
RESB 1. So if the second argument is specified, the two macros are equivalent. Normally, you can just use
ALIGN in code and data sections and ALIGNB in BSS sections, and never need the second argument except
for special purposes.
ALIGN and ALIGNB, being simple macros, perform no error checking: they cannot warn you if their first
argument fails to be a power of two, or if their second argument generates more than one byte of code. In each
of these cases they will silently do the wrong thing.
ALIGNB (or ALIGN with a second argument of RESB 1) can be used within structure definitions:
struc mytype2
mt_byte:
resb 1
alignb 2
mt_word:
resw 1
alignb 4
mt_long:
resd 1
mt_str:
resb 32
endstruc
This will ensure that the structure members are sensibly aligned relative to the base of the structure.
A final caveat: ALIGN and ALIGNB work relative to the beginning of the section, not the beginning of the
address space in the final executable. Aligning to a 16−byte boundary when the section you’re in is only
guaranteed to be aligned to a 4−byte boundary, for example, is a waste of effort. Again, NASM does not
check that the section’s alignment characteristics are sensible for the use of ALIGN or ALIGNB.
See also the smartalign standard macro package, section 5.2.
62
Chapter 5: Standard Macro Packages
The %use directive (see section 4.6.4) includes one of the standard macro packages included with the NASM
distribution and compiled into the NASM binary. It operates like the %include directive (see section 4.6.1),
but the included contents is provided by NASM itself.
The names of standard macro packages are case insensitive, and can be quoted or not.
proc:
mov r0l,r3h ; mov al,bh
ret
See also section 11.1.
63
Chapter 6: Assembler Directives
NASM, though it attempts to avoid the bureaucracy of assemblers like MASM and TASM, is nevertheless
forced to support a few directives. These are described in this chapter.
NASM’s directives come in two types: user−level directives and primitive 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.
Primitive directives are enclosed in square brackets; user−level directives are not.
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 format−specific directives are
documented along with the formats that implement them, in chapter 7.
64
6.1.1 USE16 & USE32: Aliases for BITS
The ‘USE16’ and ‘USE32’ directives can be used in place of ‘BITS 16’ and ‘BITS 32’, for compatibility
with other assemblers.
[section .data]
%%str: db %2
%%endstr:
__SECT__
65
mov dx,%%str
mov cx,%%endstr−%%str
mov bx,%1
mov ah,0x40
int 0x21
%endmacro
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 SECTION directive so as not to modify __SECT__. It then declares its string
in the data section, and then invokes __SECT__ to switch back to whichever section the user was previously
working in. It thus avoids the need, in the previous version of the macro, to include a JMP instruction to jump
over the data, and also does not fail if, in a complicated OBJ format module, the user could potentially be
assembling the code in any of several separate code sections.
kbuf_chr resw 1
kbuf_free resw 1
kbuf resw 16
This example describes a section of the PC BIOS data area, at segment address 0x40: the above code defines
kbuf_chr to be 0x1A, kbuf_free to be 0x1C, and kbuf to be 0x1E.
The user−level form of ABSOLUTE, like that of SECTION, redefines the __SECT__ macro when it is
invoked.
STRUC and ENDSTRUC are defined as macros which use ABSOLUTE (and also __SECT__).
ABSOLUTE doesn’t have to take an absolute constant as an argument: it can take an expression (actually, a
critical expression: see section 3.8) 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:
org 100h ; it’s a .COM program
absolute setup
runtimevar1 resw 1
runtimevar2 resd 20
tsr_end:
66
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.
67
global intvar
section .bss
intvar resd 1
The difference is that if more than one module defines the same common variable, then at link time those
variables will be merged, and references to intvar in all modules will point at the same piece of memory.
Like GLOBAL and EXTERN, COMMON supports object−format specific extensions. For example, the obj
format allows common variables to be NEAR or FAR, and the elf format allows you to specify the
alignment requirements of a common variable:
common commvar 4:near ; works in OBJ
common intarray 100:4 ; works in ELF: 4 byte aligned
Once again, like EXTERN and GLOBAL, the primitive form of COMMON differs from the user−level form only
in that it can take only one argument at a time.
68
• FLOAT DAZ Flush denormals to zero
• FLOAT NODAZ Do not flush denormals to zero (default)
• FLOAT NEAR Round to nearest (default)
• FLOAT UP Round up (toward +Infinity)
• FLOAT DOWN Round down (toward –Infinity)
• FLOAT ZERO Round toward zero
• FLOAT DEFAULT Restore default settings
The standard macros __FLOAT_DAZ__, __FLOAT_ROUND__, and __FLOAT__ contain the current state,
as long as the programmer has avoided the use of the brackeded primitive form, ([FLOAT]).
__FLOAT__ contains the full set of floating−point settings; this value can be saved away and invoked later to
restore the setting.
69
Chapter 7: Output Formats
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 −f option on the NASM command line. Each of these formats,
along with its extensions to the base NASM syntax, is detailed in this chapter.
As stated in section 2.1.1, 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 (.asm, .s, 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.
70
The parameter to ALIGN 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.
7.1.3 Multisection support for the BIN format.
The bin format allows the use of multiple sections, of arbitrary names, besides the "known" .text, .data,
and .bss names.
• Sections may be designated progbits or nobits. Default is progbits (except .bss, which defaults
to nobits, of course).
• Sections can be aligned at a specified boundary following the previous section with align=, or at an
arbitrary byte−granular position with start=.
• Sections can be given a virtual start address, which will be used for the calculation of all memory
references within that section with vstart=.
• Sections can be ordered using follows=<section> or vfollows=<section> as an alternative to
specifying an explicit start address.
• Arguments to org, start, vstart, and align= are critical expressions. See section 3.8. E.g.
align=(1 << ALIGN_SHIFT) – ALIGN_SHIFT must be defined before it is used here.
• Any code which comes before an explicit SECTION directive is directed by default into the .text
section.
• If an ORG statement is not given, ORG 0 is used by default.
• The .bss section will be placed after the last progbits section, unless start=, vstart=,
follows=, or vfollows= has been specified.
• All sections are aligned on dword boundaries, unless a different alignment has been specified.
• Sections may not overlap.
• NASM creates the section.<secname>.start for each section, which may be used in your code.
7.1.4 Map files
Map files can be generated in −f bin format by means of the [map] option. Map types of all (default),
brief, sections, segments, or symbols may be specified. Output may be directed to stdout
(default), stderr, or a specified file. E.g. [map symbols myfile.map]. No "user form" exists, the
square brackets must be used.
71
When you define a segment in an obj 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:
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
The obj format also enables the use of the SEG and WRT operators, so that you can write code which does
things like
extern foo
72
• Segments can be declared as USE16 or USE32, 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.
• When writing OS/2 object files, you should declare 32−bit segments as FLAT, which causes the default
segment base for anything in the segment to be the special group FLAT, and also defines the group if it is
not already defined.
• The obj 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 SEGMENT SCREEN ABSOLUTE=0xB800 if you need to. The
ABSOLUTE and ALIGN keywords are mutually exclusive.
NASM’s default segment attributes are PUBLIC, ALIGN=1, no class, no overlay, and USE16.
7.2.2 GROUP: Defining Groups of Segments
The obj 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 GROUP directive, whereby you can code
segment data
; some data
segment bss
73
7.2.4 IMPORT: Importing DLL Symbols
The IMPORT 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 EXTERN as well as using
the IMPORT directive.
The IMPORT 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:
import WSAStartup wsock32.dll
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:
import asyncsel wsock32.dll WSAAsyncSelect
7.2.5 EXPORT: Exporting DLL Symbols
The EXPORT 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 GLOBAL as well as using the
EXPORT directive.
EXPORT 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 external
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.
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:
• resident 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.
• nodata indicates that the exported symbol is a function which does not make use of any initialized data.
• parm=NNN, where NNN 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.
• An attribute which is just a number indicates that the symbol should be exported with an identifying
number (ordinal), and gives the desired number.
For example:
export myfunc
export myfunc TheRealMoreFormalLookingFunctionName
export myfunc myfunc 1234 ; export by ordinal
export myfunc myfunc resident parm=23 nodata
7.2.6 ..start: Defining the Program Entry Point
OMF 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 ..start at the point where you wish
execution to begin.
7.2.7 obj Extensions to the EXTERN Directive
If you declare an external symbol with the directive
extern foo
74
then references such as mov ax,foo will give you the offset of foo from its preferred segment base (as
specified in whichever module foo is actually defined in). So to access the contents of foo you will usually
need to do something like
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
This is a little unwieldy, particularly if you know that an external is going to be accessible from a given
segment or group, say dgroup. So if DS already contained dgroup, you could simply code
mov ax,[foo wrt dgroup]
However, having to type this every time you want to access foo can be a pain; so NASM allows you to
declare foo in the alternative form
extern foo:wrt dgroup
This form causes NASM to pretend that the preferred segment base of foo is in fact dgroup; so the
expression seg foo will now return dgroup, and the expression foo is equivalent to foo wrt dgroup.
This default−WRT 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 section 7.2.8.
7.2.8 obj Extensions to the COMMON Directive
The obj 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
common nearvar 2:near ; ‘nearvar’ is a near common
common farvar 10:far ; and ‘farvar’ is far
Far common variables may be greater in size than 64Kb, and so the OMF specification says that they are
declared as a number of elements 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.
Some OMF 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:
common c_5by2 10:far 5 ; two five−byte elements
common c_2by5 10:far 2 ; five two−byte elements
If no element size is specified, the default is 1. Also, the FAR 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
common c_5by2 10:5 ; two five−byte elements
common c_2by5 10:2 ; five two−byte elements
In addition to these extensions, the COMMON directive in obj also supports default−WRT specification like
EXTERN does (explained in section 7.2.7). So you can also declare things like
common foo 10:wrt dgroup
common bar 16:far 2:wrt data
common baz 24:wrt data:6
75
7.3 win32: Microsoft Win32 Object Files
The win32 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 obj instead (see
section 7.2).
win32 provides a default output file−name extension of .obj.
Note that although Microsoft say that Win32 object files follow the COFF (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 coff output format; conversely, the
coff format does not produce object files that Win32 linkers can generate correct output from.
7.3.1 win32 Extensions to the SECTION Directive
Like the obj format, win32 allows you to specify additional information on the SECTION 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 .text, .data and .bss, but may still be
overridden by these qualifiers.
The available qualifiers are:
• code, or equivalently text, 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.
• data and bss define the section to be a data section, analogously to code. Data sections are marked as
readable and writable, but not executable. data declares an initialized data section, whereas bss declares
an uninitialized data section.
• rdata declares an initialized data section that is readable but not writable. Microsoft compilers use this
section to place constants in it.
• info 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 to the linker. For example, declaring an info–type section
called .drectve causes the linker to interpret the contents of the section as command−line options.
• align=, used with a trailing number as in obj, 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.
The defaults assumed by NASM if you do not specify the above qualifiers are:
section .text code align=16
section .data data align=4
section .rdata rdata align=8
section .bss bss align=4
Any other section name is treated by default like .text.
7.3.2 win32: Safe Structured Exception Handling
Among other improvements in Windows XP SP2 and Windows Server 2003 Microsoft has introduced
concept of "safe structured exception handling." General idea is to collect handlers’ entry points in designated
read−only table and have alleged entry point verified against this table prior exception control is passed to the
handler. In order for an executable module to be equipped with such "safe exception handler table," all object
modules on linker command line has to comply with certain criteria. If one single module among them does
not, then the table in question is omitted and above mentioned run−time checks will not be performed for
76
application in question. Table omission is by default silent and therefore can be easily overlooked. One can
instruct linker to refuse to produce binary without such table by passing /safeseh command line option.
Without regard to this run−time check merits it’s natural to expect NASM to be capable of generating
modules suitable for /safeseh linking. From developer’s viewpoint the problem is two−fold:
• how to adapt modules not deploying exception handlers of their own;
• how to adapt/develop modules utilizing custom exception handling;
Former can be easily achieved with any NASM version by adding following line to source code:
[email protected] equ 1
As of version 2.03 NASM adds this absolute symbol automatically. If it’s not already present to be precise.
I.e. if for whatever reason developer would choose to assign another value in source file, it would still be
perfectly possible.
Registering custom exception handler on the other hand requires certain "magic." As of version 2.03
additional directive is implemented, safeseh, which instructs the assembler to produce appropriately
formatted input data for above mentioned "safe exception handler table." Its typical use would be:
section .text
extern _MessageBoxA@16
%if __NASM_VERSION_ID__ >= 0x02030000
safeseh handler ; register handler as "safe handler"
%endif
handler:
push DWORD 1 ; MB_OKCANCEL
push DWORD caption
push DWORD text
push DWORD 0
call _MessageBoxA@16
sub eax,1 ; incidentally suits as return value
; for exception handler
ret
global _main
_main:
push DWORD handler
push DWORD [fs:0]
mov DWORD [fs:0],esp ; engage exception handler
xor eax,eax
mov eax,DWORD[eax] ; cause exception
pop DWORD [fs:0] ; disengage exception handler
add esp,4
ret
text: db ’OK to rethrow, CANCEL to generate core dump’,0
caption:db ’SEGV’,0
77
terminated without any notification whatsoever. One can argue that system could at least have logged some
kind "non−safe exception handler in x.exe at address n" message in event log, but no, literally no notification
is provided and user is left with no clue on what caused application failure.
Finally, all mentions of linker in this paragraph refer to Microsoft linker version 7.x and later. Presence of
@feat.00 symbol and input data for "safe exception handler table" causes no backward incompatibilities
and "safeseh" modules generated by NASM 2.03 and later can still be linked by earlier versions or
non−Microsoft linkers.
78
add rbx,rax
jmp rbx
...
dsptch: dd case0 wrt ..imagebase
dd case1 wrt ..imagebase
One can argue that the operator is redundant. Indeed, snippet before last works just fine with any NASM
version and is not even Windows specific... The real reason for implementing wrt ..imagebase will
become apparent in next paragraph.
It should be noted that wrt ..imagebase is defined as 32−bit operand only:
dd label wrt ..imagebase ; ok
dq label wrt ..imagebase ; bad
mov eax,label wrt ..imagebase ; ok
mov rax,label wrt ..imagebase ; bad
7.4.2 win64: Structured Exception Handling
Structured exception handing in Win64 is completely different matter from Win32. Upon exception program
counter value is noted, and linker−generated table comprising start and end addresses of all the functions [in
given executable module] is traversed and compared to the saved program counter. Thus so called
UNWIND_INFO structure is identified. If it’s not found, then offending subroutine is assumed to be "leaf" and
just mentioned lookup procedure is attempted for its caller. In Win64 leaf function is such function that does
not call any other function nor modifies any Win64 non−volatile registers, including stack pointer. The latter
ensures that it’s possible to identify leaf function’s caller by simply pulling the value from the top of the stack.
While majority of subroutines written in assembler are not calling any other function, requirement for
non−volatile registers’ immutability leaves developer with not more than 7 registers and no stack frame,
which is not necessarily what [s]he counted with. Customarily one would meet the requirement by saving
non−volatile registers on stack and restoring them upon return, so what can go wrong? If [and only if] an
exception is raised at run−time and no UNWIND_INFO structure is associated with such "leaf" function, the
stack unwind procedure will expect to find caller’s return address on the top of stack immediately followed by
its frame. Given that developer pushed caller’s non−volatile registers on stack, would the value on top point at
some code segment or even addressable space? Well, developer can attempt copying caller’s return address to
the top of stack and this would actually work in some very specific circumstances. But unless developer can
guarantee that these circumstances are always met, it’s more appropriate to assume worst case scenario, i.e.
stack unwind procedure going berserk. Relevant question is what happens then? Application is abruptly
terminated without any notification whatsoever. Just like in Win32 case, one can argue that system could at
least have logged "unwind procedure went berserk in x.exe at address n" in event log, but no, no trace of
failure is left.
Now, when we understand significance of the UNWIND_INFO structure, let’s discuss what’s in it and/or how
it’s processed. First of all it is checked for presence of reference to custom language−specific exception
handler. If there is one, then it’s invoked. Depending on the return value, execution flow is resumed
(exception is said to be "handled"), or rest of UNWIND_INFO structure is processed as following. Beside
optional reference to custom handler, it carries information about current callee’s stack frame and where
non−volatile registers are saved. Information is detailed enough to be able to reconstruct contents of caller’s
non−volatile registers upon call to current callee. And so caller’s context is reconstructed, and then unwind
procedure is repeated, i.e. another UNWIND_INFO structure is associated, this time, with caller’s instruction
pointer, which is then checked for presence of reference to language−specific handler, etc. The procedure is
recursively repeated till exception is handled. As last resort system "handles" it by generating memory core
dump and terminating the application.
As for the moment of this writing NASM unfortunately does not facilitate generation of above mentioned
detailed information about stack frame layout. But as of version 2.03 it implements building blocks for
79
generating structures involved in stack unwinding. As simplest example, here is how to deploy custom
exception handler for leaf function:
default rel
section .text
extern MessageBoxA
handler:
sub rsp,40
mov rcx,0
lea rdx,[text]
lea r8,[caption]
mov r9,1 ; MB_OKCANCEL
call MessageBoxA
sub eax,1 ; incidentally suits as return value
; for exception handler
add rsp,40
ret
global main
main:
xor rax,rax
mov rax,QWORD[rax] ; cause exception
ret
main_end:
text: db ’OK to rethrow, CANCEL to generate core dump’,0
caption:db ’SEGV’,0
80
function. In other words, handler would simply undertake part of unwinding procedure. Consider following
example:
function:
mov rax,rsp ; copy rsp to volatile register
push r15 ; save non−volatile registers
push rbx
push rbp
mov r11,rsp ; prepare variable stack frame
sub r11,rcx
and r11,−64
mov QWORD[r11],rax ; check for exceptions
mov rsp,r11 ; allocate stack frame
mov QWORD[rsp],rax ; save original rsp value
magic_point:
...
mov r11,QWORD[rsp] ; pull original rsp value
mov rbp,QWORD[r11−24]
mov rbx,QWORD[r11−16]
mov r15,QWORD[r11−8]
mov rsp,r11 ; destroy frame
ret
The keyword is that up to magic_point original rsp value remains in chosen volatile register and no
non−volatile register, except for rsp, is modified. While past magic_point rsp remains constant till the
very end of the function. In this case custom language−specific exception handler would look like this:
EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame,
CONTEXT *context,DISPATCHER_CONTEXT *disp)
{ ULONG64 *rsp;
if (context−>Rip<(ULONG64)magic_point)
rsp = (ULONG64 *)context−>Rax;
else
{ rsp = ((ULONG64 **)context−>Rsp)[0];
context−>Rbp = rsp[−3];
context−>Rbx = rsp[−2];
context−>R15 = rsp[−1];
}
context−>Rsp = (ULONG64)rsp;
memcpy (disp−>ContextRecord,context,sizeof(CONTEXT));
RtlVirtualUnwind(UNW_FLAG_NHANDLER,disp−>ImageBase,
dips−>ControlPc,disp−>FunctionEntry,disp−>ContextRecord,
&disp−>HandlerData,&disp−>EstablisherFrame,NULL);
return ExceptionContinueSearch;
}
As custom handler mimics leaf function, corresponding UNWIND_INFO structure does not have to contain
any information about stack frame and its layout.
81
The coff format supports the same extensions to the SECTION directive as win32 does, except that the
align qualifier and the info section type are not supported.
7.7 elf, elf32, and elf64: Executable and Linkable Format Object
Files
The elf32 and elf64 output formats generate ELF32 and ELF64 (Executable and Linkable Format)
object files, as used by Linux as well as Unix System V, including Solaris x86, UnixWare and SCO Unix.
elf provides a default output file−name extension of .o. elf is a synonym for elf32.
7.7.1 ELF specific directive osabi
The ELF header specifies the application binary interface for the target operating system (OSABI). This field
can be set by using the osabi directive with the numeric value (0−255) of the target system. If this directive
is not used, the default value will be "UNIX System V ABI" (0) which will work on most systems which
support ELF.
7.7.2 elf Extensions to the SECTION Directive
Like the obj format, elf allows you to specify additional information on the SECTION 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 .text, .data and .bss, but may still be
overridden by these qualifiers.
The available qualifiers are:
• alloc defines the section to be one which is loaded into memory when the program is run. noalloc
defines it to be one which is not, such as an informational or comment section.
• exec defines the section to be one which should have execute permission when the program is run.
noexec defines it as one which should not.
• write defines the section to be one which should be writable when the program is run. nowrite defines
it as one which should not.
• progbits defines the section to be one with explicit contents stored in the object file: an ordinary code
or data section, for example, nobits defines the section to be one with no explicit contents given, such as
a BSS section.
• align=, used with a trailing number as in obj, gives the alignment requirements of the section.
The defaults assumed by NASM if you do not specify the above qualifiers are:
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
(Any section name other than .text, .rodata, .data and .bss is treated by default like other in the
above code.)
82
7.7.3 Position−Independent Code: elf Special Symbols and WRT
The ELF 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.
Since ELF does not support segment−base references, the WRT operator is not used for its normal purpose;
therefore NASM’s elf output format makes use of WRT for a different purpose, namely the PIC−specific
relocation types.
elf defines five special symbols which you can use as the right−hand side of the WRT operator to obtain PIC
relocation types. They are ..gotpc, ..gotoff, ..got, ..plt and ..sym. Their functions are
summarized here:
• Referring to the symbol marking the global offset table base using wrt ..gotpc will end up giving the
distance from the beginning of the current section to the global offset table.
(_GLOBAL_OFFSET_TABLE_ is the standard symbol name used to refer to the GOT.) So you would then
need to add $$ to the result to get the real address of the GOT.
• Referring to a location in one of your own sections using wrt ..gotoff 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.
• Referring to an external or global symbol using wrt ..got causes the linker to build an entry in 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.
• Referring to a procedure name using wrt ..plt 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 CALL or JMP),
since ELF contains no relocation type to refer to PLT entries absolutely.
• Referring to a symbol name using wrt ..sym 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.
A fuller explanation of how to use these relocation types to write shared libraries entirely in NASM is given in
section 9.2.
7.7.4 elf Extensions to the GLOBAL Directive
ELF 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 GLOBAL directive, allowing you to specify these features.
You can specify whether a global variable is a function or a data object by suffixing the name with a colon
and the word function or data. (object is a synonym for data.) For example:
global hashlookup:function, hashtable:data
exports the global symbol hashlookup as a function and hashtable as a data object.
Optionally, you can control the ELF visibility of the symbol. Just add one of the visibility keywords:
default, internal, hidden, or protected. The default is default of course. For example, to make
hashlookup hidden:
global hashlookup:function hidden
83
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:
global hashtable:data (hashtable.end − hashtable)
hashtable:
db this,that,theother ; some data here
.end:
This makes NASM automatically calculate the length of the table and place that information into the ELF
symbol table.
Declaring the type and size of global symbols is necessary when writing shared library code. For more
information, see section 9.2.4.
7.7.5 elf Extensions to the COMMON Directive
ELF 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:
common dwordarray 128:4
This declares the total size of the array to be 128 bytes, and requires that it be aligned on a 4−byte boundary.
7.7.6 16−bit code and ELF
The ELF32 specification doesn’t provide relocations for 8− and 16−bit values, but the GNU ld linker adds
these as an extension. NASM can generate GNU−compatible relocations, to allow 16−bit code to be linked as
ELF using GNU ld. If NASM is used with the −w+gnu−elf−extensions option, a warning is issued
when one of these relocations is generated.
7.7.7 Debug formats and ELF
ELF32 and ELF64 provide debug information in STABS and DWARF formats. Line number information is
generated for all executable sections, but please note that only the ".text" section is executable by default.
84
aoutb supports no special directives, no special symbols, and only the three standard section names .text,
.data and .bss. However, it also supports the same use of WRT as elf does, to provide
position−independent code relocation types. See section 7.7.3 for full documentation of this feature.
aoutb also supports the same extensions to the GLOBAL directive as elf does: see section 7.7.4 for
documentation of this.
85
7.11.3 rdf Extensions to the GLOBAL directive
RDOFF 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 ELF,
you can also specify whether an exported symbol is a procedure (function) or data object.
Suffixing the name with a colon and the word export you make the symbol exported:
global sys_open:export
To specify that exported symbol is a procedure (function), you add the word proc or function after
declaration:
global sys_open:export proc
Similarly, to specify exported data object, add the word data or object to the directive:
global kernel_ticks:export data
7.11.4 rdf Extensions to the EXTERN directive
By default the EXTERN directive in RDOFF declares a "pure external" symbol (i.e. the static linker will
complain if such a symbol is not resolved). To declare an "imported" symbol, which must be resolved later
during a dynamic linking phase, RDOFF offers an additional import modifier. As in GLOBAL, you can also
specify whether an imported symbol is a procedure (function) or data object. For example:
library $libc
extern _open:import
extern _printf:import proc
extern _errno:import data
Here the directive LIBRARY is also included, which gives the dynamic linker a hint as to where to find
requested symbols.
86
This workaround will still typically not work for programs intended for obj format, because the obj
SEGMENT and GROUP directives have side effects of defining the segment and group names as symbols; dbg
will not do this, so the program will not assemble. You will have to work around that by defining the symbols
yourself (using EXTERN, for example) if you really need to get a dbg trace of an obj–specific source file.
dbg accepts any section name and any directives at all, and logs them all to its output file.
87
Chapter 8: Writing 16−bit Code (DOS, Windows 3/3.1)
This chapter attempts to cover some of the common issues encountered when writing 16−bit code to run
under MS−DOS or Windows 3.x. It covers how to link programs to produce .EXE or .COM files, how to
write .SYS device drivers, and how to interface assembly language code with 16−bit C compilers and with
Borland Pascal.
..start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,stacktop
This initial piece of code sets up DS to point to the data segment, and initializes SS and SP to point to the top
of the provided stack. Notice that interrupts are implicitly disabled for one instruction after a move into SS,
88
precisely for this situation, so that there’s no chance of an interrupt occurring between the loads of SS and SP
and not having a stack to execute on.
Note also that the special symbol ..start is defined at the beginning of this code, which means that will be
the entry point into the resulting executable file.
mov dx,hello
mov ah,9
int 0x21
The above is the main program: load DS:DX with a pointer to the greeting message (hello is implicitly
relative to the segment data, which was loaded into DS in the setup code, so the full pointer is valid), and
call the DOS print−string function.
mov ax,0x4c00
int 0x21
This terminates the program using another DOS system call.
segment data
89
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 CS instead.
On entry to your .EXE file, SS:SP 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 EXE_stack macro. For example, to change the stack size of your
program to 64 bytes, you would call EXE_stack 64.
A sample program which generates a .EXE file in this way is given in the test subdirectory of the NASM
archive, as binexe.asm.
section .text
start:
; put your code here
section .data
section .bss
90
If you do this, you need to take care of several things:
• The first object file containing code should start its code segment with a line like RESB 100h. This is to
ensure that the code begins at offset 100h 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 .COM
file. Other assemblers use an ORG directive for this purpose, but ORG in NASM is a format−specific
directive to the bin output format, and does not mean the same thing as it does in MASM−compatible
assemblers.
• You don’t need to define a stack segment.
• 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 .COM file is loaded, all the
segment registers contain the same value.
global _%1
%define %1 _%1
%endmacro
%macro cextern 1
extern _%1
%define %1 _%1
91
%endmacro
(These forms of the macros only take one argument at a time; a %rep construct could solve this.)
If you then declare an external like this:
cextern printf
then the macro will expand it as
extern _printf
%define printf _printf
Thereafter, you can reference printf as if it was a symbol, and the preprocessor will put the leading
underscore on where necessary.
The cglobal macro works similarly. You must use cglobal before defining the symbol in question, but
you would have had to do that anyway if you used GLOBAL.
Also see section 2.1.27.
8.4.2 Memory Models
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:
• 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 CS register never changes its value, and always gives the segment
part of the full function address), and that functions are called using ordinary near CALL instructions and
return using RETN (which, in NASM, is synonymous with RET anyway). This means both that you should
write your own routines to return with RETN, and that you should call external C routines with near CALL
instructions.
• 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 CALL FAR (or CALL seg:offset) and return using RETF. Again, you
should therefore write your own routines to return with RETF and use CALL FAR to call external routines.
• In models using a single data segment (tiny, small and medium), data pointers are 16 bits long, containing
only an offset field (the DS register doesn’t change its value, and always gives the segment part of the full
data item address).
• 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 DS in
your routines without restoring it afterwards, but ES is free for you to use to access the contents of 32−bit
data pointers you are passed.
• 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.
• In most memory models, there is a default data segment, whose segment address is kept in DS throughout
the program. This data segment is typically the same segment as the stack, kept in SS, so that functions’
local variables (which are stored on the stack) and global data items can both be accessed easily without
changing DS. Particularly large data items are typically stored in other segments. However, some memory
models (though not the standard ones, usually) allow the assumption that SS and DS hold the same value to
be removed. Be careful about functions’ local variables in this latter case.
92
In models with a single code segment, the segment is called _TEXT, 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 _DATA.
8.4.3 Function Definitions and Function Calls
The C calling convention in 16−bit programs is as follows. In the following description, the words caller and
callee are used to denote the function doing the calling and the function which gets called.
• 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).
• The caller then executes a CALL instruction to pass control to the callee. This CALL is either near or far
depending on the memory model.
• 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 SP in BP so as to be able to use BP 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 BP must be preserved by any C function. Hence the callee, if it is going to set
up BP as a frame pointer, must push the previous value first.
• The callee may then access its parameters relative to BP. The word at [BP] holds the previous value of BP
as it was pushed; the next word, at [BP+2], holds the offset part of the return address, pushed implicitly
by CALL. In a small−model (near) function, the parameters start after that, at [BP+4]; in a large−model
(far) function, the segment part of the return address lives at [BP+4], and the parameters begin at
[BP+6]. The leftmost parameter of the function, since it was pushed last, is accessible at this offset from
BP; the others follow, at successively greater offsets. Thus, in a function such as printf 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.
• The callee may also wish to decrease SP further, so as to allocate space on the stack for local variables,
which will then be accessible at negative offsets from BP.
• The callee, if it wishes to return a value to the caller, should leave the value in AL, AX or DX:AX
depending on the size of the value. Floating−point results are sometimes (depending on the compiler)
returned in ST0.
• Once the callee has finished processing, it restores SP from BP if it had allocated local stack space, then
pops the previous value of BP, and returns via RETN or RETF depending on memory model.
• When the caller regains control from the callee, the function parameters are still on the stack, so it typically
adds an immediate constant to SP to remove them (instead of executing a number of slow POP
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 knows how
many parameters it pushed, does the removing.
It is instructive to compare this calling convention with that for Pascal programs (described in section 8.5.1).
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 RET or RETF 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.
Thus, you would define a function in C style in the following way. The following example is for small model:
global _myfunc
_myfunc:
push bp
93
mov bp,sp
sub sp,0x40 ; 64 bytes of local stack space
mov bx,[bp+4] ; first parameter to function
segment _DATA
myint dw 1234
mystring db ’This number −> %d <− should be 1234’,10,0
This piece of code is the small−model assembly equivalent of the C code
int myint = 1234;
printf("This number −> %d <− should be 1234\n", myint);
In large model, the function−call code might look more like this. In this example, it is assumed that DS
already holds the segment base of the segment _DATA. If not, you would have to initialize it first.
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
The integer value still takes up one word on the stack, since large model does not affect the size of the int
data type. The first argument (pushed last) to printf, 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, PUSH DS would have been a shorter instruction than
PUSH WORD SEG mystring, if DS 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 SP has to be increased by 6 rather than
4 afterwards to make up for the extra word of parameters.
94
8.4.4 Accessing Data Items
To get at the contents of C variables, or to declare variables which C can access, you need only declare the
names as GLOBAL or EXTERN. (Again, the names require leading underscores, as stated in section 8.4.1.)
Thus, a C variable declared as int i can be accessed from assembler as
extern _i
mov ax,[_i]
And to declare your own integer variable which C programs can access as extern int j, you do this
(making sure you are assembling in the _DATA segment, if necessary):
global _j
_j dw 0
To access a C array, you need to know the size of the components of the array. For example, int variables
are two bytes long, so if a C program declares an array as int a[10], you can access a[3] by coding
mov ax,[_a+6]. (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 char, 2 for short and int, 4
for long and float, and 8 for double.
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 STRUC), or by calculating the one offset and using just that.
To do either of these, you should read your C compiler’s manual to find out how it organizes data structures.
NASM gives no special alignment to structure members in its own STRUC macro, so you have to specify
alignment yourself if the C compiler generates it. Typically, you might find that a structure like
struct {
char c;
int i;
} foo;
might be four bytes long rather than three, since the int 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 #pragma lines, so you have to find out how your own compiler does it.
8.4.5 c16.mac: Helper Macros for the 16−bit C Interface
Included in the NASM archives, in the misc directory, is a file c16.mac of macros. It defines three macros:
proc, arg and endproc. 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.
(An alternative, TASM compatible form of arg is also now built into NASM’s preprocessor. See section 4.8
for details.)
An example of an assembly function using the macro set is given here:
proc _nearproc
%$i arg
%$j arg
mov ax,[bp + %$i]
mov bx,[bp + %$j]
add ax,[bx]
95
endproc
This defines _nearproc to be a procedure taking two arguments, the first (i) an integer and the second (j)
a pointer to an integer. It returns i + *j.
Note that the arg macro has an EQU 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 EQU works, defining %$i to be an offset from BP.
A context−local variable is used, local to the context pushed by the proc macro and popped by the
endproc macro, so that the same argument name can be used in later procedures. Of course, you don’t have
to do that.
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
%define FARCODE. This changes the kind of return instruction generated by endproc, 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.
arg 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 int.
The large−model equivalent of the above function would look like this:
%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
This makes use of the argument to the arg macro to define a parameter of size 4, because j is now a far
pointer. When we load from j, we must load a segment and an offset.
96
• 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.
8.5.1 The Pascal Calling Convention
The 16−bit Pascal calling convention is as follows. In the following description, the words caller and callee
are used to denote the function doing the calling and the function which gets called.
• 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).
• The caller then executes a far CALL instruction to pass control to the callee.
• 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 SP in BP so as to be able to use BP 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 BP must be preserved by any function. Hence the callee, if it is going to set
up BP as a frame pointer, must push the previous value first.
• The callee may then access its parameters relative to BP. The word at [BP] holds the previous value of BP
as it was pushed. The next word, at [BP+2], holds the offset part of the return address, and the next one at
[BP+4] the segment part. The parameters begin at [BP+6]. The rightmost parameter of the function,
since it was pushed last, is accessible at this offset from BP; the others follow, at successively greater
offsets.
• The callee may also wish to decrease SP further, so as to allocate space on the stack for local variables,
which will then be accessible at negative offsets from BP.
• The callee, if it wishes to return a value to the caller, should leave the value in AL, AX or DX:AX
depending on the size of the value. Floating−point results are returned in ST0. Results of type Real
(Borland’s own custom floating−point data type, not handled directly by the FPU) are returned in
DX:BX:AX. To return a result of type String, 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 RETF instruction.
• Once the callee has finished processing, it restores SP from BP if it had allocated local stack space, then
pops the previous value of BP, and returns via RETF. It uses the form of RETF 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.
• 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.
Thus, you would define a function in Pascal style, taking two Integer–type parameters, in the following
way:
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
97
At the other end of the process, to call a Pascal function from your assembly code, you would do something
like this:
extern SomeFunc
proc _pascalproc
%$j arg 4
%$i arg
mov ax,[bp + %$i]
mov bx,[bp + %$j]
mov es,[bp + %$j + 2]
add ax,[bx]
endproc
This defines the same routine, conceptually, as the example in section 8.4.5: 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
98
pointer. The only difference between this code and the large−model C version is that PASCAL is defined
instead of FARCODE, and that the arguments are declared in reverse order.
99
Chapter 9: Writing 32−bit Code (Unix, Win32, DJGPP)
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.
Almost all 32−bit code, and in particular all code running under Win32, DJGPP or any of the PC Unix
variants, runs in flat 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 CALL and
JMP 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.
100
offsets. Thus, in a function such as printf 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.
• The callee may also wish to decrease ESP further, so as to allocate space on the stack for local variables,
which will then be accessible at negative offsets from EBP.
• The callee, if it wishes to return a value to the caller, should leave the value in AL, AX or EAX depending
on the size of the value. Floating−point results are typically returned in ST0.
• Once the callee has finished processing, it restores ESP from EBP if it had allocated local stack space, then
pops the previous value of EBP, and returns via RET (equivalently, RETN).
• When the caller regains control from the callee, the function parameters are still on the stack, so it typically
adds an immediate constant to ESP to remove them (instead of executing a number of slow POP
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 knows how
many parameters it pushed, does the removing.
There is an alternative calling convention used by Win32 programs for Windows API calls, and also for
functions called by the Windows API such as window procedures: they follow what Microsoft calls the
__stdcall convention. This is slightly closer to the Pascal convention, in that the callee clears the stack by
passing a parameter to the RET instruction. However, the parameters are still pushed in right−to−left order.
Thus, you would define a function in C style in the following way:
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
segment _DATA
myint dd 1234
mystring db ’This number −> %d <− should be 1234’,10,0
101
This piece of code is the assembly equivalent of the C code
int myint = 1234;
printf("This number −> %d <− should be 1234\n", myint);
9.1.3 Accessing Data Items
To get at the contents of C variables, or to declare variables which C can access, you need only declare the
names as GLOBAL or EXTERN. (Again, the names require leading underscores, as stated in section 9.1.1.)
Thus, a C variable declared as int i can be accessed from assembler as
extern _i
mov eax,[_i]
And to declare your own integer variable which C programs can access as extern int j, you do this
(making sure you are assembling in the _DATA segment, if necessary):
global _j
_j dd 0
To access a C array, you need to know the size of the components of the array. For example, int variables
are four bytes long, so if a C program declares an array as int a[10], you can access a[3] by coding
mov ax,[_a+12]. (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 char, 2 for short, 4 for
int, long and float, and 8 for double. Pointers, being 32−bit addresses, are also 4 bytes long.
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 STRUC), or by calculating the one offset and using just that.
To do either of these, you should read your C compiler’s manual to find out how it organizes data structures.
NASM gives no special alignment to structure members in its own STRUC macro, so you have to specify
alignment yourself if the C compiler generates it. Typically, you might find that a structure like
struct {
char c;
int i;
} foo;
might be eight bytes long rather than five, since the int 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 #pragma lines, so you have to find out how your own compiler does it.
9.1.4 c32.mac: Helper Macros for the 32−bit C Interface
Included in the NASM archives, in the misc directory, is a file c32.mac of macros. It defines three macros:
proc, arg and endproc. 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.
An example of an assembly function using the macro set is given here:
proc _proc32
%$i arg
%$j arg
mov eax,[ebp + %$i]
mov ebx,[ebp + %$j]
add eax,[ebx]
endproc
102
This defines _proc32 to be a procedure taking two arguments, the first (i) an integer and the second (j) a
pointer to an integer. It returns i + *j.
Note that the arg macro has an EQU 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 EQU works, defining %$i to be an offset from BP.
A context−local variable is used, local to the context pushed by the proc macro and popped by the
endproc macro, so that the same argument name can be used in later procedures. Of course, you don’t have
to do that.
arg 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 int or pointers.
103
mov ebx,[ebp−4]
mov esp,ebp
pop ebp
ret
(For BSD, again, the symbol _GLOBAL_OFFSET_TABLE requires a second leading underscore.)
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
EBX register, because PIC shared libraries use this register to store the address of the GOT.
The interesting bit is the CALL instruction and the following two lines. The CALL and POP combination
obtains the address of the label .get_GOT, without having to know in advance where the program was
loaded (since the CALL instruction is encoded relative to the current position). The ADD instruction makes use
of one of the special PIC relocation types: GOTPC relocation. With the WRT ..gotpc qualifier specified,
the symbol referenced (here _GLOBAL_OFFSET_TABLE_, the special symbol assigned to the GOT) is given
as an offset from the beginning of the section. (Actually, ELF encodes it as the offset from the operand field
of the ADD instruction, but NASM simplifies this deliberately, so you do things the same way for both ELF
and BSD.) So the instruction then adds the beginning of the section, to get the real address of the GOT, and
subtracts the value of .get_GOT which it knows is in EBX. Therefore, by the time that instruction has
finished, EBX contains the address of the GOT.
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:
%macro get_GOT 0
call %%getgot
%%getgot:
pop ebx
add ebx,_GLOBAL_OFFSET_TABLE_+$$−%%getgot wrt ..gotpc
%endmacro
9.2.2 Finding Your Local Data Items
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 ..gotoff special WRT type. The way this
works is like this:
lea eax,[ebx+myvar wrt ..gotoff]
The expression myvar wrt ..gotoff is calculated, when the shared library is linked, to be the offset to
the local variable myvar from the beginning of the GOT. Therefore, adding it to EBX as above will place the
real address of myvar in EAX.
If you declare variables as GLOBAL 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
..gotoff mechanism.
Note that due to a peculiarity of the way BSD a.out 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.
9.2.3 Finding External and Common Data Items
If your library needs to get at an external variable (external to the library, not just to one of the modules
within it), you must use the ..got type to get at it. The ..got 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 entry containing the address
104
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 extvar in EAX,
you would code
mov eax,[ebx+extvar wrt ..got]
This loads the address of extvar out of an entry in the GOT. The linker, when it builds the shared library,
collects together every relocation of type ..got, and builds the GOT so as to ensure it has every necessary
entry present.
Common variables must also be accessed in this way.
9.2.4 Exporting Symbols to the Library User
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.
So to export a function to users of the library, you must use
global func:function ; declare it as a function
; etc.
And to export a data item such as an array, you would have to code
global array:data array.end−array ; give the size too
105
will give the address of the procedure linkage table for the function, which is where the calling program will
believe the function lives. Either address is a valid way to call the function.
9.2.5 Calling Procedures Outside the Library
Calling procedures outside your shared library has to be done by means of a procedure linkage table, 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.
To call an external routine, you must use another special PIC relocation type, WRT ..plt. This is much
easier than the GOT−based ones: you simply replace calls such as CALL printf with the PLT−relative
version CALL printf WRT ..plt.
9.2.6 Generating the Library File
Having written some code modules and assembled them to .o files, you then generate your shared library
with a command such as
ld −shared −o library.so module1.o module2.o # for ELF
ld −Bshareable −o library.so module1.o module2.o # for BSD
For ELF, if your shared library is going to reside in system directories such as /usr/lib or /lib, it is
usually worth using the −soname flag to the linker, to store the final library file name, with a version
number, into the library:
ld −shared −soname library.so.1 −o library.so.1.2 *.o
You would then copy library.so.1.2 into the library directory, and create library.so.1 as a
symbolic link to it.
106
Chapter 10: Mixing 16 and 32 Bit Code
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.
107
mov eax,offset_into_32_bit_segment_specified_by_fs
mov dword [fs:eax],0x11223344
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?
It can. As in section 10.1, you need only prefix the address with the DWORD keyword, and it will be forced to
be a 32−bit address:
mov dword [fs:dword my_offset],0x11223344
Also as in section 10.1, NASM is not fussy about whether the DWORD prefix comes before or after the
segment override, so arguably a nicer−looking way to code the above instruction is
mov dword [dword fs:my_offset],0x11223344
Don’t confuse the DWORD prefix outside the square brackets, which controls the size of the data stored at the
address, with the one inside the square brackets which controls the length of the address itself. The two can
quite easily be different:
mov word [dword 0x12345678],0x9ABC
This moves 16 bits of data to an address specified by a 32−bit offset.
You can also specify WORD or DWORD prefixes along with the FAR prefix to indirect far jumps or calls. For
example:
call dword far [fs:word 0x4321]
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.
108
o16 push ss
o16 push ds
This code saves a doubleword of stack space by fitting two segment registers into the space which would
normally be consumed by pushing one.
(You can also use the o32 prefix to force the 32−bit behaviour when in 16−bit mode, but this seems less
useful.)
109
Chapter 11: Writing 64−bit Code (Unix, Win64)
This chapter attempts to cover some of the common issues involved when writing 64−bit code, to run under
Win64 or Unix. It covers how to write assembly code to interface with 64−bit C routines, and how to write
position−independent code for shared libraries.
All 64−bit code uses a flat memory model, since segmentation is not available in 64−bit mode. The one
exception is the FS and GS registers, which still add their bases.
Position independence in 64−bit mode is significantly simpler, since the processor supports RIP–relative
addressing directly; see the REL keyword (section 3.3). On most 64−bit platforms, it is probably desirable to
make that the default, using the directive DEFAULT REL (section 6.2).
64−bit programming is relatively similar to 32−bit programming, but of course pointers are 64 bits long;
additionally, all existing platforms pass arguments in registers rather than on the stack. Furthermore, 64−bit
platforms use SSE2 by default for floating point. Please see the ABI documentation for your platform.
64−bit platforms differ in the sizes of the fundamental datatypes, not just from 32−bit platforms but from each
other. If a specific size data type is desired, it is probably best to use the types defined in the Standard C
header <inttypes.h>.
In 64−bit mode, the default instruction size is still 32 bits. When loading a value into a 32−bit register (but not
an 8− or 16−bit register), the upper 32 bits of the corresponding 64−bit register are set to zero.
110
mov eax,foo ; 32−bit immediate, zero−extended
mov rax,dword foo ; 32−bit immediate, sign−extended
The length of these instructions are 10, 5 and 7 bytes, respectively.
The only instructions which take a full 64−bit displacement is loading or storing, using MOV, AL, AX, EAX or
RAX (but no other registers) to an absolute 64−bit address. Since this is a relatively rarely used instruction
(64−bit code generally uses relative addressing), the programmer has to explicitly declare the displacement
size as QWORD:
default abs
default rel
111
The first four integer arguments are passed in RCX, RDX, R8 and R9, in that order. Additional integer
arguments are passed on the stack. These registers, plus RAX, R10 and R11 are destroyed by function calls,
and thus are available for use by the function without saving.
Integer return values are passed in RAX only.
Floating point is done using SSE registers, except for long double. Floating−point arguments are passed
in XMM0 to XMM3; return is XMM0 only.
On Win64, long is 32 bits; long long or _int64 is 64 bits.
Integer and SSE register arguments are counted together, so for the case of
void foo(long long a, double b, int c)
a is passed in RCX, b in XMM1, and c in R8D.
112
Chapter 12: Troubleshooting
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.
ORG 510
DW 0xAA55
This is not the intended use of the ORG directive in NASM, and will not work. The correct way to solve this
problem in NASM is to use the TIMES directive, like this:
ORG 0
TIMES 510−($−$$) DB 0
DW 0xAA55
113
The TIMES 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.
12.1.4 TIMES Doesn’t Work
The other common problem with the above code is people who write the TIMES line as
TIMES 510−$ DB 0
by reasoning that $ should be a pure number, just like 510, so the difference between them is also a pure
number and can happily be fed to TIMES.
NASM is a modular assembler: the various component parts are designed to be easily separable for re−use, so
they don’t exchange information unnecessarily. In consequence, the bin output format, even though it has
been told by the ORG directive that the .text section should start at 0, does not pass that information back to
the expression evaluator. So from the evaluator’s point of view, $ isn’t a pure number: it’s an offset from a
section base. Therefore the difference between $ and 510 is also not a pure number, but involves a section
base. Values involving section bases cannot be passed as arguments to TIMES.
The solution, as in the previous section, is to code the TIMES line in the form
TIMES 510−($−$$) DB 0
in which $ and $$ are offsets from the same section base, and so their difference is a pure number. This will
solve the problem and generate sensible code.
12.2 Bugs
We have never yet released a version of NASM with any known 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 bugtracker at
https://sourceforge.net/projects/nasm/ (click on "Bugs"), or if that fails then through one of
the contacts in section 1.2.
Please read section 2.2 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 section 12.1,
and don’t bother reporting the bug if it’s listed there.
If you do report a bug, please give us all of the following information:
• What operating system you’re running NASM under. DOS, Linux, NetBSD, Win16, Win32, VMS (I’d be
impressed), whatever.
• 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.
• Which version of NASM you’re using, and exactly how you invoked it. Give us the precise command line,
and the contents of the NASMENV environment variable if any.
• 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.)
114
• 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 only 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 not to be
mailed large chunks of code anyway. The smaller the file, the better. A three−line sample file that does
nothing useful except demonstrate the problem is much easier to work with than a fully fledged
ten−thousand−line program. (Of course, some errors do only crop up in large files, so this may not be
possible.)
• A description of what the problem actually is. ‘It doesn’t work’ is not 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 should 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’.
• 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.
• 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
both object files, so we can see what TASM is doing differently from us.
115
Appendix A: Ndisasm
A.1 Introduction
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.
The Netwide Disassembler does nothing except to produce disassemblies of binary source files. NDISASM
does not have any understanding of object file formats, like objdump, and it will not understand DOS .EXE
files like debug will. It just disassembles.
116
Supposing NDISASM has just finished generating a strange machine instruction from part of the data section,
and its file position is now one byte before 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.
To avoid this, you can specify a ‘synchronisation’ 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 ‘db’
instead. So it will start disassembly exactly from the sync point, and so you will see all the instructions in your
code section.
Sync points are specified using the −s option: they are measured in terms of the program origin, not the file
position. So if you want to synchronize after 32 bytes of a .COM file, you would have to do
ndisasm −o100h −s120h file.com
rather than
ndisasm −o100h −s20h file.com
As stated above, you can specify multiple sync markers if you need to, just by repeating the −s option.
A.3.3 Mixed Code and Data: Automatic (Intelligent) Synchronisation
Suppose you are disassembling the boot sector of a DOS 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 JMP instruction, then some data, then the rest of the code. So there is a very good chance of
NDISASM being misaligned when the data ends and the code begins. Hence a sync point is needed.
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 JMP instruction, and then to use its target address
as a sync point. So can NDISASM do that for you?
The answer, of course, is yes: using either of the synonymous switches −a (for automatic sync) or −i (for
intelligent sync) will enable auto−sync 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...)
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).
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 not
guaranteed to catch all the sync points, and you may still have to place some manually.
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 −i and some −s options.
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 −k option (documented below) to
suppress disassembly of the data area.
117
A.3.4 Other Options
The −e option skips a header on the file, by ignoring the first N bytes. This means that the header is not
counted towards the disassembly offset: if you give −e10 −o10, disassembly will start at byte 10 in the file,
and this will be given offset 10, not 20.
The −k 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 will 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.
118
Appendix B: Instruction List
B.1 Introduction
The following sections show the instructions which NASM currently supports. For each instruction, there is a
separate entry for each supported addressing mode. The third column shows the processor type in which the
instruction was introduced and, when appropriate, one or more usage flags.
B.1.1 Special instructions...
DB
DW
DD
DQ
DT
DO
DY
RESB imm 8086
RESW
RESD
RESQ
REST
RESO
RESY
B.1.2 Conventional instructions
AAA 8086,NOLONG
AAD 8086,NOLONG
AAD imm 8086,NOLONG
AAM 8086,NOLONG
AAM imm 8086,NOLONG
AAS 8086,NOLONG
ADC mem,reg8 8086
ADC reg8,reg8 8086
ADC mem,reg16 8086
ADC reg16,reg16 8086
ADC mem,reg32 386
ADC reg32,reg32 386
ADC mem,reg64 X64
ADC reg64,reg64 X64
ADC reg8,mem 8086
ADC reg8,reg8 8086
ADC reg16,mem 8086
ADC reg16,reg16 8086
ADC reg32,mem 386
ADC reg32,reg32 386
ADC reg64,mem X64
ADC reg64,reg64 X64
ADC rm16,imm8 8086
119
ADC rm32,imm8 386
ADC rm64,imm8 X64
ADC reg_al,imm 8086
ADC reg_ax,imm 8086
ADC reg_eax,imm 386
ADC reg_rax,imm X64
ADC rm8,imm 8086
ADC rm16,imm 8086
ADC rm32,imm 386
ADC rm64,imm X64
ADC mem,imm8 8086
ADC mem,imm16 8086
ADC mem,imm32 386
ADD mem,reg8 8086
ADD reg8,reg8 8086
ADD mem,reg16 8086
ADD reg16,reg16 8086
ADD mem,reg32 386
ADD reg32,reg32 386
ADD mem,reg64 X64
ADD reg64,reg64 X64
ADD reg8,mem 8086
ADD reg8,reg8 8086
ADD reg16,mem 8086
ADD reg16,reg16 8086
ADD reg32,mem 386
ADD reg32,reg32 386
ADD reg64,mem X64
ADD reg64,reg64 X64
ADD rm16,imm8 8086
ADD rm32,imm8 386
ADD rm64,imm8 X64
ADD reg_al,imm 8086
ADD reg_ax,imm 8086
ADD reg_eax,imm 386
ADD reg_rax,imm X64
ADD rm8,imm 8086
ADD rm16,imm 8086
ADD rm32,imm 386
ADD rm64,imm X64
ADD mem,imm8 8086
ADD mem,imm16 8086
ADD mem,imm32 386
AND mem,reg8 8086
AND reg8,reg8 8086
AND mem,reg16 8086
AND reg16,reg16 8086
AND mem,reg32 386
AND reg32,reg32 386
AND mem,reg64 X64
AND reg64,reg64 X64
AND reg8,mem 8086
AND reg8,reg8 8086
120
AND reg16,mem 8086
AND reg16,reg16 8086
AND reg32,mem 386
AND reg32,reg32 386
AND reg64,mem X64
AND reg64,reg64 X64
AND rm16,imm8 8086
AND rm32,imm8 386
AND rm64,imm8 X64
AND reg_al,imm 8086
AND reg_ax,imm 8086
AND reg_eax,imm 386
AND reg_rax,imm X64
AND rm8,imm 8086
AND rm16,imm 8086
AND rm32,imm 386
AND rm64,imm X64
AND mem,imm8 8086
AND mem,imm16 8086
AND mem,imm32 386
ARPL mem,reg16 286,PROT,NOLONG
ARPL reg16,reg16 286,PROT,NOLONG
BB0_RESET PENT,CYRIX,ND
BB1_RESET PENT,CYRIX,ND
BOUND reg16,mem 186,NOLONG
BOUND reg32,mem 386,NOLONG
BSF reg16,mem 386
BSF reg16,reg16 386
BSF reg32,mem 386
BSF reg32,reg32 386
BSF reg64,mem X64
BSF reg64,reg64 X64
BSR reg16,mem 386
BSR reg16,reg16 386
BSR reg32,mem 386
BSR reg32,reg32 386
BSR reg64,mem X64
BSR reg64,reg64 X64
BSWAP reg32 486
BSWAP reg64 X64
BT mem,reg16 386
BT reg16,reg16 386
BT mem,reg32 386
BT reg32,reg32 386
BT mem,reg64 X64
BT reg64,reg64 X64
BT rm16,imm 386
BT rm32,imm 386
BT rm64,imm X64
BTC mem,reg16 386
BTC reg16,reg16 386
BTC mem,reg32 386
BTC reg32,reg32 386
121
BTC mem,reg64 X64
BTC reg64,reg64 X64
BTC rm16,imm 386
BTC rm32,imm 386
BTC rm64,imm X64
BTR mem,reg16 386
BTR reg16,reg16 386
BTR mem,reg32 386
BTR reg32,reg32 386
BTR mem,reg64 X64
BTR reg64,reg64 X64
BTR rm16,imm 386
BTR rm32,imm 386
BTR rm64,imm X64
BTS mem,reg16 386
BTS reg16,reg16 386
BTS mem,reg32 386
BTS reg32,reg32 386
BTS mem,reg64 X64
BTS reg64,reg64 X64
BTS rm16,imm 386
BTS rm32,imm 386
BTS rm64,imm X64
CALL imm 8086
CALL imm|near 8086
CALL imm|far 8086,ND,NOLONG
CALL imm16 8086
CALL imm16|near 8086
CALL imm16|far 8086,ND,NOLONG
CALL imm32 386
CALL imm32|near 386
CALL imm32|far 386,ND,NOLONG
CALL imm:imm 8086,NOLONG
CALL imm16:imm 8086,NOLONG
CALL imm:imm16 8086,NOLONG
CALL imm32:imm 386,NOLONG
CALL imm:imm32 386,NOLONG
CALL mem|far 8086,NOLONG
CALL mem|far X64
CALL mem16|far 8086
CALL mem32|far 386
CALL mem64|far X64
CALL mem|near 8086
CALL mem16|near 8086
CALL mem32|near 386,NOLONG
CALL mem64|near X64
CALL reg16 8086
CALL reg32 386,NOLONG
CALL reg64 X64
CALL mem 8086
CALL mem16 8086
CALL mem32 386,NOLONG
CALL mem64 X64
122
CBW 8086
CDQ 386
CDQE X64
CLC 8086
CLD 8086
CLGI X64,AMD
CLI 8086
CLTS 286,PRIV
CMC 8086
CMP mem,reg8 8086
CMP reg8,reg8 8086
CMP mem,reg16 8086
CMP reg16,reg16 8086
CMP mem,reg32 386
CMP reg32,reg32 386
CMP mem,reg64 X64
CMP reg64,reg64 X64
CMP reg8,mem 8086
CMP reg8,reg8 8086
CMP reg16,mem 8086
CMP reg16,reg16 8086
CMP reg32,mem 386
CMP reg32,reg32 386
CMP reg64,mem X64
CMP reg64,reg64 X64
CMP rm16,imm8 8086
CMP rm32,imm8 386
CMP rm64,imm8 X64
CMP reg_al,imm 8086
CMP reg_ax,imm 8086
CMP reg_eax,imm 386
CMP reg_rax,imm X64
CMP rm8,imm 8086
CMP rm16,imm 8086
CMP rm32,imm 386
CMP rm64,imm X64
CMP mem,imm8 8086
CMP mem,imm16 8086
CMP mem,imm32 386
CMPSB 8086
CMPSD 386
CMPSQ X64
CMPSW 8086
CMPXCHG mem,reg8 PENT
CMPXCHG reg8,reg8 PENT
CMPXCHG mem,reg16 PENT
CMPXCHG reg16,reg16 PENT
CMPXCHG mem,reg32 PENT
CMPXCHG reg32,reg32 PENT
CMPXCHG mem,reg64 X64
CMPXCHG reg64,reg64 X64
CMPXCHG486 mem,reg8 486,UNDOC,ND
CMPXCHG486 reg8,reg8 486,UNDOC,ND
123
CMPXCHG486 mem,reg16 486,UNDOC,ND
CMPXCHG486 reg16,reg16 486,UNDOC,ND
CMPXCHG486 mem,reg32 486,UNDOC,ND
CMPXCHG486 reg32,reg32 486,UNDOC,ND
CMPXCHG8B mem PENT
CMPXCHG16B mem X64
CPUID PENT
CPU_READ PENT,CYRIX
CPU_WRITE PENT,CYRIX
CQO X64
CWD 8086
CWDE 386
DAA 8086,NOLONG
DAS 8086,NOLONG
DEC reg16 8086,NOLONG
DEC reg32 386,NOLONG
DEC rm8 8086
DEC rm16 8086
DEC rm32 386
DEC rm64 X64
DIV rm8 8086
DIV rm16 8086
DIV rm32 386
DIV rm64 X64
DMINT P6,CYRIX
EMMS PENT,MMX
ENTER imm,imm 186
EQU imm 8086
EQU imm:imm 8086
F2XM1 8086,FPU
FABS 8086,FPU
FADD mem32 8086,FPU
FADD mem64 8086,FPU
FADD fpureg|to 8086,FPU
FADD fpureg 8086,FPU
FADD fpureg,fpu0 8086,FPU
FADD fpu0,fpureg 8086,FPU
FADD 8086,FPU,ND
FADDP fpureg 8086,FPU
FADDP fpureg,fpu0 8086,FPU
FADDP 8086,FPU,ND
FBLD mem80 8086,FPU
FBLD mem 8086,FPU
FBSTP mem80 8086,FPU
FBSTP mem 8086,FPU
FCHS 8086,FPU
FCLEX 8086,FPU
FCMOVB fpureg P6,FPU
FCMOVB fpu0,fpureg P6,FPU
FCMOVB P6,FPU,ND
FCMOVBE fpureg P6,FPU
FCMOVBE fpu0,fpureg P6,FPU
FCMOVBE P6,FPU,ND
124
FCMOVE fpureg P6,FPU
FCMOVE fpu0,fpureg P6,FPU
FCMOVE P6,FPU,ND
FCMOVNB fpureg P6,FPU
FCMOVNB fpu0,fpureg P6,FPU
FCMOVNB P6,FPU,ND
FCMOVNBE fpureg P6,FPU
FCMOVNBE fpu0,fpureg P6,FPU
FCMOVNBE P6,FPU,ND
FCMOVNE fpureg P6,FPU
FCMOVNE fpu0,fpureg P6,FPU
FCMOVNE P6,FPU,ND
FCMOVNU fpureg P6,FPU
FCMOVNU fpu0,fpureg P6,FPU
FCMOVNU P6,FPU,ND
FCMOVU fpureg P6,FPU
FCMOVU fpu0,fpureg P6,FPU
FCMOVU P6,FPU,ND
FCOM mem32 8086,FPU
FCOM mem64 8086,FPU
FCOM fpureg 8086,FPU
FCOM fpu0,fpureg 8086,FPU
FCOM 8086,FPU,ND
FCOMI fpureg P6,FPU
FCOMI fpu0,fpureg P6,FPU
FCOMI P6,FPU,ND
FCOMIP fpureg P6,FPU
FCOMIP fpu0,fpureg P6,FPU
FCOMIP P6,FPU,ND
FCOMP mem32 8086,FPU
FCOMP mem64 8086,FPU
FCOMP fpureg 8086,FPU
FCOMP fpu0,fpureg 8086,FPU
FCOMP 8086,FPU,ND
FCOMPP 8086,FPU
FCOS 386,FPU
FDECSTP 8086,FPU
FDISI 8086,FPU
FDIV mem32 8086,FPU
FDIV mem64 8086,FPU
FDIV fpureg|to 8086,FPU
FDIV fpureg 8086,FPU
FDIV fpureg,fpu0 8086,FPU
FDIV fpu0,fpureg 8086,FPU
FDIV 8086,FPU,ND
FDIVP fpureg 8086,FPU
FDIVP fpureg,fpu0 8086,FPU
FDIVP 8086,FPU,ND
FDIVR mem32 8086,FPU
FDIVR mem64 8086,FPU
FDIVR fpureg|to 8086,FPU
FDIVR fpureg,fpu0 8086,FPU
FDIVR fpureg 8086,FPU
125
FDIVR fpu0,fpureg 8086,FPU
FDIVR 8086,FPU,ND
FDIVRP fpureg 8086,FPU
FDIVRP fpureg,fpu0 8086,FPU
FDIVRP 8086,FPU,ND
FEMMS PENT,3DNOW
FENI 8086,FPU
FFREE fpureg 8086,FPU
FFREE 8086,FPU
FFREEP fpureg 286,FPU,UNDOC
FFREEP 286,FPU,UNDOC
FIADD mem32 8086,FPU
FIADD mem16 8086,FPU
FICOM mem32 8086,FPU
FICOM mem16 8086,FPU
FICOMP mem32 8086,FPU
FICOMP mem16 8086,FPU
FIDIV mem32 8086,FPU
FIDIV mem16 8086,FPU
FIDIVR mem32 8086,FPU
FIDIVR mem16 8086,FPU
FILD mem32 8086,FPU
FILD mem16 8086,FPU
FILD mem64 8086,FPU
FIMUL mem32 8086,FPU
FIMUL mem16 8086,FPU
FINCSTP 8086,FPU
FINIT 8086,FPU
FIST mem32 8086,FPU
FIST mem16 8086,FPU
FISTP mem32 8086,FPU
FISTP mem16 8086,FPU
FISTP mem64 8086,FPU
FISTTP mem16 PRESCOTT,FPU
FISTTP mem32 PRESCOTT,FPU
FISTTP mem64 PRESCOTT,FPU
FISUB mem32 8086,FPU
FISUB mem16 8086,FPU
FISUBR mem32 8086,FPU
FISUBR mem16 8086,FPU
FLD mem32 8086,FPU
FLD mem64 8086,FPU
FLD mem80 8086,FPU
FLD fpureg 8086,FPU
FLD 8086,FPU,ND
FLD1 8086,FPU
FLDCW mem 8086,FPU,SW
FLDENV mem 8086,FPU
FLDL2E 8086,FPU
FLDL2T 8086,FPU
FLDLG2 8086,FPU
FLDLN2 8086,FPU
FLDPI 8086,FPU
126
FLDZ 8086,FPU
FMUL mem32 8086,FPU
FMUL mem64 8086,FPU
FMUL fpureg|to 8086,FPU
FMUL fpureg,fpu0 8086,FPU
FMUL fpureg 8086,FPU
FMUL fpu0,fpureg 8086,FPU
FMUL 8086,FPU,ND
FMULP fpureg 8086,FPU
FMULP fpureg,fpu0 8086,FPU
FMULP 8086,FPU,ND
FNCLEX 8086,FPU
FNDISI 8086,FPU
FNENI 8086,FPU
FNINIT 8086,FPU
FNOP 8086,FPU
FNSAVE mem 8086,FPU
FNSTCW mem 8086,FPU,SW
FNSTENV mem 8086,FPU
FNSTSW mem 8086,FPU,SW
FNSTSW reg_ax 286,FPU
FPATAN 8086,FPU
FPREM 8086,FPU
FPREM1 386,FPU
FPTAN 8086,FPU
FRNDINT 8086,FPU
FRSTOR mem 8086,FPU
FSAVE mem 8086,FPU
FSCALE 8086,FPU
FSETPM 286,FPU
FSIN 386,FPU
FSINCOS 386,FPU
FSQRT 8086,FPU
FST mem32 8086,FPU
FST mem64 8086,FPU
FST fpureg 8086,FPU
FST 8086,FPU,ND
FSTCW mem 8086,FPU,SW
FSTENV mem 8086,FPU
FSTP mem32 8086,FPU
FSTP mem64 8086,FPU
FSTP mem80 8086,FPU
FSTP fpureg 8086,FPU
FSTP 8086,FPU,ND
FSTSW mem 8086,FPU,SW
FSTSW reg_ax 286,FPU
FSUB mem32 8086,FPU
FSUB mem64 8086,FPU
FSUB fpureg|to 8086,FPU
FSUB fpureg,fpu0 8086,FPU
FSUB fpureg 8086,FPU
FSUB fpu0,fpureg 8086,FPU
FSUB 8086,FPU,ND
127
FSUBP fpureg 8086,FPU
FSUBP fpureg,fpu0 8086,FPU
FSUBP 8086,FPU,ND
FSUBR mem32 8086,FPU
FSUBR mem64 8086,FPU
FSUBR fpureg|to 8086,FPU
FSUBR fpureg,fpu0 8086,FPU
FSUBR fpureg 8086,FPU
FSUBR fpu0,fpureg 8086,FPU
FSUBR 8086,FPU,ND
FSUBRP fpureg 8086,FPU
FSUBRP fpureg,fpu0 8086,FPU
FSUBRP 8086,FPU,ND
FTST 8086,FPU
FUCOM fpureg 386,FPU
FUCOM fpu0,fpureg 386,FPU
FUCOM 386,FPU,ND
FUCOMI fpureg P6,FPU
FUCOMI fpu0,fpureg P6,FPU
FUCOMI P6,FPU,ND
FUCOMIP fpureg P6,FPU
FUCOMIP fpu0,fpureg P6,FPU
FUCOMIP P6,FPU,ND
FUCOMP fpureg 386,FPU
FUCOMP fpu0,fpureg 386,FPU
FUCOMP 386,FPU,ND
FUCOMPP 386,FPU
FXAM 8086,FPU
FXCH fpureg 8086,FPU
FXCH fpureg,fpu0 8086,FPU
FXCH fpu0,fpureg 8086,FPU
FXCH 8086,FPU,ND
FXTRACT 8086,FPU
FYL2X 8086,FPU
FYL2XP1 8086,FPU
HLT 8086,PRIV
IBTS mem,reg16 386,SW,UNDOC,ND
IBTS reg16,reg16 386,UNDOC,ND
IBTS mem,reg32 386,SD,UNDOC,ND
IBTS reg32,reg32 386,UNDOC,ND
ICEBP 386,ND
IDIV rm8 8086
IDIV rm16 8086
IDIV rm32 386
IDIV rm64 X64
IMUL rm8 8086
IMUL rm16 8086
IMUL rm32 386
IMUL rm64 X64
IMUL reg16,mem 386
IMUL reg16,reg16 386
IMUL reg32,mem 386
IMUL reg32,reg32 386
128
IMUL reg64,mem X64
IMUL reg64,reg64 X64
IMUL reg16,mem,imm8 186
IMUL reg16,mem,sbyte16 186,ND
IMUL reg16,mem,imm16 186
IMUL reg16,mem,imm 186,ND
IMUL reg16,reg16,imm8 186
IMUL reg16,reg16,sbyte32 186,ND
IMUL reg16,reg16,imm16 186
IMUL reg16,reg16,imm 186,ND
IMUL reg32,mem,imm8 386
IMUL reg32,mem,sbyte64 386,ND
IMUL reg32,mem,imm32 386
IMUL reg32,mem,imm 386,ND
IMUL reg32,reg32,imm8 386
IMUL reg32,reg32,sbyte16 386,ND
IMUL reg32,reg32,imm32 386
IMUL reg32,reg32,imm 386,ND
IMUL reg64,mem,imm8 X64
IMUL reg64,mem,sbyte32 X64,ND
IMUL reg64,mem,imm32 X64
IMUL reg64,mem,imm X64,ND
IMUL reg64,reg64,imm8 X64
IMUL reg64,reg64,sbyte64 X64,ND
IMUL reg64,reg64,imm32 X64
IMUL reg64,reg64,imm X64,ND
IMUL reg16,imm8 186
IMUL reg16,sbyte16 186,ND
IMUL reg16,imm16 186
IMUL reg16,imm 186,ND
IMUL reg32,imm8 386
IMUL reg32,sbyte32 386,ND
IMUL reg32,imm32 386
IMUL reg32,imm 386,ND
IMUL reg64,imm8 X64
IMUL reg64,sbyte64 X64,ND
IMUL reg64,imm32 X64
IMUL reg64,imm X64,ND
IN reg_al,imm 8086
IN reg_ax,imm 8086
IN reg_eax,imm 386
IN reg_al,reg_dx 8086
IN reg_ax,reg_dx 8086
IN reg_eax,reg_dx 386
INC reg16 8086,NOLONG
INC reg32 386,NOLONG
INC rm8 8086
INC rm16 8086
INC rm32 386
INC rm64 X64
INCBIN
INSB 186
INSD 386
129
INSW 186
INT imm 8086
INT01 386,ND
INT1 386
INT03 8086,ND
INT3 8086
INTO 8086,NOLONG
INVD 486,PRIV
INVLPG mem 486,PRIV
INVLPGA reg_ax,reg_ecx X86_64,AMD,NOLONG
INVLPGA reg_eax,reg_ecx X86_64,AMD
INVLPGA reg_rax,reg_ecx X64,AMD
INVLPGA X86_64,AMD
IRET 8086
IRETD 386
IRETQ X64
IRETW 8086
JCXZ imm 8086,NOLONG
JECXZ imm 386
JMP imm|short 8086
JMP imm 8086,ND
JMP imm 8086
JMP imm|near 8086,ND
JMP imm|far 8086,ND,NOLONG
JMP imm16 8086
JMP imm16|near 8086,ND
JMP imm16|far 8086,ND,NOLONG
JMP imm32 386
JMP imm32|near 386,ND
JMP imm32|far 386,ND,NOLONG
JMP imm:imm 8086,NOLONG
JMP imm16:imm 8086,NOLONG
JMP imm:imm16 8086,NOLONG
JMP imm32:imm 386,NOLONG
JMP imm:imm32 386,NOLONG
JMP mem|far 8086,NOLONG
JMP mem|far X64
JMP mem16|far 8086
JMP mem32|far 386
JMP mem64|far X64
JMP mem|near 8086
JMP mem16|near 8086
JMP mem32|near 386,NOLONG
JMP mem64|near X64
JMP reg16 8086
JMP reg32 386,NOLONG
JMP reg64 X64
JMP mem 8086
JMP mem16 8086
JMP mem32 386,NOLONG
JMP mem64 X64
JMPE imm IA64
JMPE imm16 IA64
130
JMPE imm32 IA64
JMPE rm16 IA64
JMPE rm32 IA64
JRCXZ imm X64
LAHF 8086
LAR reg16,mem 286,PROT,SW
LAR reg16,reg16 286,PROT
LAR reg16,reg32 386,PROT
LAR reg16,reg64 X64,PROT,ND
LAR reg32,mem 386,PROT,SW
LAR reg32,reg16 386,PROT
LAR reg32,reg32 386,PROT
LAR reg32,reg64 X64,PROT,ND
LAR reg64,mem X64,PROT,SW
LAR reg64,reg16 X64,PROT
LAR reg64,reg32 X64,PROT
LAR reg64,reg64 X64,PROT
LDS reg16,mem 8086,NOLONG
LDS reg32,mem 386,NOLONG
LEA reg16,mem 8086
LEA reg32,mem 386
LEA reg64,mem X64
LEAVE 186
LES reg16,mem 8086,NOLONG
LES reg32,mem 386,NOLONG
LFENCE X64,AMD
LFS reg16,mem 386
LFS reg32,mem 386
LGDT mem 286,PRIV
LGS reg16,mem 386
LGS reg32,mem 386
LIDT mem 286,PRIV
LLDT mem 286,PROT,PRIV
LLDT mem16 286,PROT,PRIV
LLDT reg16 286,PROT,PRIV
LMSW mem 286,PRIV
LMSW mem16 286,PRIV
LMSW reg16 286,PRIV
LOADALL 386,UNDOC
LOADALL286 286,UNDOC
LODSB 8086
LODSD 386
LODSQ X64
LODSW 8086
LOOP imm 8086
LOOP imm,reg_cx 8086,NOLONG
LOOP imm,reg_ecx 386
LOOP imm,reg_rcx X64
LOOPE imm 8086
LOOPE imm,reg_cx 8086,NOLONG
LOOPE imm,reg_ecx 386
LOOPE imm,reg_rcx X64
LOOPNE imm 8086
131
LOOPNE imm,reg_cx 8086,NOLONG
LOOPNE imm,reg_ecx 386
LOOPNE imm,reg_rcx X64
LOOPNZ imm 8086
LOOPNZ imm,reg_cx 8086,NOLONG
LOOPNZ imm,reg_ecx 386
LOOPNZ imm,reg_rcx X64
LOOPZ imm 8086
LOOPZ imm,reg_cx 8086,NOLONG
LOOPZ imm,reg_ecx 386
LOOPZ imm,reg_rcx X64
LSL reg16,mem 286,PROT,SW
LSL reg16,reg16 286,PROT
LSL reg16,reg32 386,PROT
LSL reg16,reg64 X64,PROT,ND
LSL reg32,mem 386,PROT,SW
LSL reg32,reg16 386,PROT
LSL reg32,reg32 386,PROT
LSL reg32,reg64 X64,PROT,ND
LSL reg64,mem X64,PROT,SW
LSL reg64,reg16 X64,PROT
LSL reg64,reg32 X64,PROT
LSL reg64,reg64 X64,PROT
LSS reg16,mem 386
LSS reg32,mem 386
LTR mem 286,PROT,PRIV
LTR mem16 286,PROT,PRIV
LTR reg16 286,PROT,PRIV
MFENCE X64,AMD
MONITOR PRESCOTT
MONITOR reg_eax,reg_ecx,reg_edx PRESCOTT,ND
MOV mem,reg_sreg 8086
MOV reg16,reg_sreg 8086
MOV reg32,reg_sreg 386
MOV reg_sreg,mem 8086
MOV reg_sreg,reg16 8086
MOV reg_sreg,reg32 386
MOV reg_al,mem_offs 8086
MOV reg_ax,mem_offs 8086
MOV reg_eax,mem_offs 386
MOV reg_rax,mem_offs X64
MOV mem_offs,reg_al 8086
MOV mem_offs,reg_ax 8086
MOV mem_offs,reg_eax 386
MOV mem_offs,reg_rax X64
MOV reg32,reg_creg 386,PRIV,NOLONG
MOV reg64,reg_creg X64,PRIV
MOV reg_creg,reg32 386,PRIV,NOLONG
MOV reg_creg,reg64 X64,PRIV
MOV reg32,reg_dreg 386,PRIV,NOLONG
MOV reg64,reg_dreg X64,PRIV
MOV reg_dreg,reg32 386,PRIV,NOLONG
MOV reg_dreg,reg64 X64,PRIV
132
MOV reg32,reg_treg 386,NOLONG,ND
MOV reg_treg,reg32 386,NOLONG,ND
MOV mem,reg8 8086
MOV reg8,reg8 8086
MOV mem,reg16 8086
MOV reg16,reg16 8086
MOV mem,reg32 386
MOV reg32,reg32 386
MOV mem,reg64 X64
MOV reg64,reg64 X64
MOV reg8,mem 8086
MOV reg8,reg8 8086
MOV reg16,mem 8086
MOV reg16,reg16 8086
MOV reg32,mem 386
MOV reg32,reg32 386
MOV reg64,mem X64
MOV reg64,reg64 X64
MOV reg8,imm 8086
MOV reg16,imm 8086
MOV reg32,imm 386
MOV reg64,imm X64
MOV reg64,imm32 X64
MOV rm8,imm 8086
MOV rm16,imm 8086
MOV rm32,imm 386
MOV rm64,imm X64
MOV mem,imm8 8086
MOV mem,imm16 8086
MOV mem,imm32 386
MOVD mmxreg,mem PENT,MMX,SD
MOVD mmxreg,reg32 PENT,MMX
MOVD mem,mmxreg PENT,MMX,SD
MOVD reg32,mmxreg PENT,MMX
MOVD xmmreg,mem X64,SD
MOVD xmmreg,reg32 X64
MOVD mem,xmmreg X64,SD
MOVD reg32,xmmreg X64,SSE
MOVQ mmxreg,mmxrm PENT,MMX
MOVQ mmxrm,mmxreg PENT,MMX
MOVQ mmxreg,rm64 X64,MMX
MOVQ rm64,mmxreg X64,MMX
MOVSB 8086
MOVSD 386
MOVSQ X64
MOVSW 8086
MOVSX reg16,mem 386
MOVSX reg16,reg8 386
MOVSX reg32,rm8 386
MOVSX reg32,rm16 386
MOVSX reg64,rm8 X64
MOVSX reg64,rm16 X64
MOVSXD reg64,rm32 X64
133
MOVSX reg64,rm32 X64,ND
MOVZX reg16,mem 386
MOVZX reg16,reg8 386
MOVZX reg32,rm8 386
MOVZX reg32,rm16 386
MOVZX reg64,rm8 X64
MOVZX reg64,rm16 X64
MUL rm8 8086
MUL rm16 8086
MUL rm32 386
MUL rm64 X64
MWAIT PRESCOTT
MWAIT reg_eax,reg_ecx PRESCOTT,ND
NEG rm8 8086
NEG rm16 8086
NEG rm32 386
NEG rm64 X64
NOP 8086
NOP rm16 P6
NOP rm32 P6
NOP rm64 X64
NOT rm8 8086
NOT rm16 8086
NOT rm32 386
NOT rm64 X64
OR mem,reg8 8086
OR reg8,reg8 8086
OR mem,reg16 8086
OR reg16,reg16 8086
OR mem,reg32 386
OR reg32,reg32 386
OR mem,reg64 X64
OR reg64,reg64 X64
OR reg8,mem 8086
OR reg8,reg8 8086
OR reg16,mem 8086
OR reg16,reg16 8086
OR reg32,mem 386
OR reg32,reg32 386
OR reg64,mem X64
OR reg64,reg64 X64
OR rm16,imm8 8086
OR rm32,imm8 386
OR rm64,imm8 X64
OR reg_al,imm 8086
OR reg_ax,imm 8086
OR reg_eax,imm 386
OR reg_rax,imm X64
OR rm8,imm 8086
OR rm16,imm 8086
OR rm32,imm 386
OR rm64,imm X64
OR mem,imm8 8086
134
OR mem,imm16 8086
OR mem,imm32 386
OUT imm,reg_al 8086
OUT imm,reg_ax 8086
OUT imm,reg_eax 386
OUT reg_dx,reg_al 8086
OUT reg_dx,reg_ax 8086
OUT reg_dx,reg_eax 386
OUTSB 186
OUTSD 386
OUTSW 186
PACKSSDW mmxreg,mmxrm PENT,MMX
PACKSSWB mmxreg,mmxrm PENT,MMX
PACKUSWB mmxreg,mmxrm PENT,MMX
PADDB mmxreg,mmxrm PENT,MMX
PADDD mmxreg,mmxrm PENT,MMX
PADDSB mmxreg,mmxrm PENT,MMX
PADDSIW mmxreg,mmxrm PENT,MMX,CYRIX
PADDSW mmxreg,mmxrm PENT,MMX
PADDUSB mmxreg,mmxrm PENT,MMX
PADDUSW mmxreg,mmxrm PENT,MMX
PADDW mmxreg,mmxrm PENT,MMX
PAND mmxreg,mmxrm PENT,MMX
PANDN mmxreg,mmxrm PENT,MMX
PAUSE 8086
PAVEB mmxreg,mmxrm PENT,MMX,CYRIX
PAVGUSB mmxreg,mmxrm PENT,3DNOW
PCMPEQB mmxreg,mmxrm PENT,MMX
PCMPEQD mmxreg,mmxrm PENT,MMX
PCMPEQW mmxreg,mmxrm PENT,MMX
PCMPGTB mmxreg,mmxrm PENT,MMX
PCMPGTD mmxreg,mmxrm PENT,MMX
PCMPGTW mmxreg,mmxrm PENT,MMX
PDISTIB mmxreg,mem PENT,MMX,CYRIX
PF2ID mmxreg,mmxrm PENT,3DNOW
PFACC mmxreg,mmxrm PENT,3DNOW
PFADD mmxreg,mmxrm PENT,3DNOW
PFCMPEQ mmxreg,mmxrm PENT,3DNOW
PFCMPGE mmxreg,mmxrm PENT,3DNOW
PFCMPGT mmxreg,mmxrm PENT,3DNOW
PFMAX mmxreg,mmxrm PENT,3DNOW
PFMIN mmxreg,mmxrm PENT,3DNOW
PFMUL mmxreg,mmxrm PENT,3DNOW
PFRCP mmxreg,mmxrm PENT,3DNOW
PFRCPIT1 mmxreg,mmxrm PENT,3DNOW
PFRCPIT2 mmxreg,mmxrm PENT,3DNOW
PFRSQIT1 mmxreg,mmxrm PENT,3DNOW
PFRSQRT mmxreg,mmxrm PENT,3DNOW
PFSUB mmxreg,mmxrm PENT,3DNOW
PFSUBR mmxreg,mmxrm PENT,3DNOW
PI2FD mmxreg,mmxrm PENT,3DNOW
PMACHRIW mmxreg,mem PENT,MMX,CYRIX
PMADDWD mmxreg,mmxrm PENT,MMX
135
PMAGW mmxreg,mmxrm PENT,MMX,CYRIX
PMULHRIW mmxreg,mmxrm PENT,MMX,CYRIX
PMULHRWA mmxreg,mmxrm PENT,3DNOW
PMULHRWC mmxreg,mmxrm PENT,MMX,CYRIX
PMULHW mmxreg,mmxrm PENT,MMX
PMULLW mmxreg,mmxrm PENT,MMX
PMVGEZB mmxreg,mem PENT,MMX,CYRIX
PMVLZB mmxreg,mem PENT,MMX,CYRIX
PMVNZB mmxreg,mem PENT,MMX,CYRIX
PMVZB mmxreg,mem PENT,MMX,CYRIX
POP reg16 8086
POP reg32 386,NOLONG
POP reg64 X64
POP rm16 8086
POP rm32 386,NOLONG
POP rm64 X64
POP reg_cs 8086,UNDOC,ND
POP reg_dess 8086,NOLONG
POP reg_fsgs 386
POPA 186,NOLONG
POPAD 386,NOLONG
POPAW 186,NOLONG
POPF 8086
POPFD 386,NOLONG
POPFQ X64
POPFW 8086
POR mmxreg,mmxrm PENT,MMX
PREFETCH mem PENT,3DNOW
PREFETCHW mem PENT,3DNOW
PSLLD mmxreg,mmxrm PENT,MMX
PSLLD mmxreg,imm PENT,MMX
PSLLQ mmxreg,mmxrm PENT,MMX
PSLLQ mmxreg,imm PENT,MMX
PSLLW mmxreg,mmxrm PENT,MMX
PSLLW mmxreg,imm PENT,MMX
PSRAD mmxreg,mmxrm PENT,MMX
PSRAD mmxreg,imm PENT,MMX
PSRAW mmxreg,mmxrm PENT,MMX
PSRAW mmxreg,imm PENT,MMX
PSRLD mmxreg,mmxrm PENT,MMX
PSRLD mmxreg,imm PENT,MMX
PSRLQ mmxreg,mmxrm PENT,MMX
PSRLQ mmxreg,imm PENT,MMX
PSRLW mmxreg,mmxrm PENT,MMX
PSRLW mmxreg,imm PENT,MMX
PSUBB mmxreg,mmxrm PENT,MMX
PSUBD mmxreg,mmxrm PENT,MMX
PSUBSB mmxreg,mmxrm PENT,MMX
PSUBSIW mmxreg,mmxrm PENT,MMX,CYRIX
PSUBSW mmxreg,mmxrm PENT,MMX
PSUBUSB mmxreg,mmxrm PENT,MMX
PSUBUSW mmxreg,mmxrm PENT,MMX
PSUBW mmxreg,mmxrm PENT,MMX
136
PUNPCKHBW mmxreg,mmxrm PENT,MMX
PUNPCKHDQ mmxreg,mmxrm PENT,MMX
PUNPCKHWD mmxreg,mmxrm PENT,MMX
PUNPCKLBW mmxreg,mmxrm PENT,MMX
PUNPCKLDQ mmxreg,mmxrm PENT,MMX
PUNPCKLWD mmxreg,mmxrm PENT,MMX
PUSH reg16 8086
PUSH reg32 386,NOLONG
PUSH reg64 X64
PUSH rm16 8086
PUSH rm32 386,NOLONG
PUSH rm64 X64
PUSH reg_cs 8086,NOLONG
PUSH reg_dess 8086,NOLONG
PUSH reg_fsgs 386
PUSH imm8 186
PUSH imm16 186,AR0,SZ
PUSH imm32 386,NOLONG,AR0,SZ
PUSH imm32 386,NOLONG,SD
PUSH imm64 X64,AR0,SZ
PUSHA 186,NOLONG
PUSHAD 386,NOLONG
PUSHAW 186,NOLONG
PUSHF 8086
PUSHFD 386,NOLONG
PUSHFQ X64
PUSHFW 8086
PXOR mmxreg,mmxrm PENT,MMX
RCL rm8,unity 8086
RCL rm8,reg_cl 8086
RCL rm8,imm 186
RCL rm16,unity 8086
RCL rm16,reg_cl 8086
RCL rm16,imm 186
RCL rm32,unity 386
RCL rm32,reg_cl 386
RCL rm32,imm 386
RCL rm64,unity X64
RCL rm64,reg_cl X64
RCL rm64,imm X64
RCR rm8,unity 8086
RCR rm8,reg_cl 8086
RCR rm8,imm 186
RCR rm16,unity 8086
RCR rm16,reg_cl 8086
RCR rm16,imm 186
RCR rm32,unity 386
RCR rm32,reg_cl 386
RCR rm32,imm 386
RCR rm64,unity X64
RCR rm64,reg_cl X64
RCR rm64,imm X64
RDSHR rm32 P6,CYRIXM
137
RDMSR PENT,PRIV
RDPMC P6
RDTSC PENT
RDTSCP X86_64
RET 8086
RET imm 8086,SW
RETF 8086
RETF imm 8086,SW
RETN 8086
RETN imm 8086,SW
ROL rm8,unity 8086
ROL rm8,reg_cl 8086
ROL rm8,imm 186
ROL rm16,unity 8086
ROL rm16,reg_cl 8086
ROL rm16,imm 186
ROL rm32,unity 386
ROL rm32,reg_cl 386
ROL rm32,imm 386
ROL rm64,unity X64
ROL rm64,reg_cl X64
ROL rm64,imm X64
ROR rm8,unity 8086
ROR rm8,reg_cl 8086
ROR rm8,imm 186
ROR rm16,unity 8086
ROR rm16,reg_cl 8086
ROR rm16,imm 186
ROR rm32,unity 386
ROR rm32,reg_cl 386
ROR rm32,imm 386
ROR rm64,unity X64
ROR rm64,reg_cl X64
ROR rm64,imm X64
RDM P6,CYRIX,ND
RSDC reg_sreg,mem80 486,CYRIXM
RSLDT mem80 486,CYRIXM
RSM PENTM
RSTS mem80 486,CYRIXM
SAHF 8086
SAL rm8,unity 8086,ND
SAL rm8,reg_cl 8086,ND
SAL rm8,imm 186,ND
SAL rm16,unity 8086,ND
SAL rm16,reg_cl 8086,ND
SAL rm16,imm 186,ND
SAL rm32,unity 386,ND
SAL rm32,reg_cl 386,ND
SAL rm32,imm 386,ND
SAL rm64,unity X64,ND
SAL rm64,reg_cl X64,ND
SAL rm64,imm X64,ND
SALC 8086,UNDOC
138
SAR rm8,unity 8086
SAR rm8,reg_cl 8086
SAR rm8,imm 186
SAR rm16,unity 8086
SAR rm16,reg_cl 8086
SAR rm16,imm 186
SAR rm32,unity 386
SAR rm32,reg_cl 386
SAR rm32,imm 386
SAR rm64,unity X64
SAR rm64,reg_cl X64
SAR rm64,imm X64
SBB mem,reg8 8086
SBB reg8,reg8 8086
SBB mem,reg16 8086
SBB reg16,reg16 8086
SBB mem,reg32 386
SBB reg32,reg32 386
SBB mem,reg64 X64
SBB reg64,reg64 X64
SBB reg8,mem 8086
SBB reg8,reg8 8086
SBB reg16,mem 8086
SBB reg16,reg16 8086
SBB reg32,mem 386
SBB reg32,reg32 386
SBB reg64,mem X64
SBB reg64,reg64 X64
SBB rm16,imm8 8086
SBB rm32,imm8 386
SBB rm64,imm8 X64
SBB reg_al,imm 8086
SBB reg_ax,imm 8086
SBB reg_eax,imm 386
SBB reg_rax,imm X64
SBB rm8,imm 8086
SBB rm16,imm 8086
SBB rm32,imm 386
SBB rm64,imm X64
SBB mem,imm8 8086
SBB mem,imm16 8086
SBB mem,imm32 386
SCASB 8086
SCASD 386
SCASQ X64
SCASW 8086
SFENCE X64,AMD
SGDT mem 286
SHL rm8,unity 8086
SHL rm8,reg_cl 8086
SHL rm8,imm 186
SHL rm16,unity 8086
SHL rm16,reg_cl 8086
139
SHL rm16,imm 186
SHL rm32,unity 386
SHL rm32,reg_cl 386
SHL rm32,imm 386
SHL rm64,unity X64
SHL rm64,reg_cl X64
SHL rm64,imm X64
SHLD mem,reg16,imm 3862
SHLD reg16,reg16,imm 3862
SHLD mem,reg32,imm 3862
SHLD reg32,reg32,imm 3862
SHLD mem,reg64,imm X642
SHLD reg64,reg64,imm X642
SHLD mem,reg16,reg_cl 386
SHLD reg16,reg16,reg_cl 386
SHLD mem,reg32,reg_cl 386
SHLD reg32,reg32,reg_cl 386
SHLD mem,reg64,reg_cl X64
SHLD reg64,reg64,reg_cl X64
SHR rm8,unity 8086
SHR rm8,reg_cl 8086
SHR rm8,imm 186
SHR rm16,unity 8086
SHR rm16,reg_cl 8086
SHR rm16,imm 186
SHR rm32,unity 386
SHR rm32,reg_cl 386
SHR rm32,imm 386
SHR rm64,unity X64
SHR rm64,reg_cl X64
SHR rm64,imm X64
SHRD mem,reg16,imm 3862
SHRD reg16,reg16,imm 3862
SHRD mem,reg32,imm 3862
SHRD reg32,reg32,imm 3862
SHRD mem,reg64,imm X642
SHRD reg64,reg64,imm X642
SHRD mem,reg16,reg_cl 386
SHRD reg16,reg16,reg_cl 386
SHRD mem,reg32,reg_cl 386
SHRD reg32,reg32,reg_cl 386
SHRD mem,reg64,reg_cl X64
SHRD reg64,reg64,reg_cl X64
SIDT mem 286
SLDT mem 286
SLDT mem16 286
SLDT reg16 286
SLDT reg32 386
SLDT reg64 X64,ND
SLDT reg64 X64
SKINIT X64
SMI 386,UNDOC
SMINT P6,CYRIX,ND
140
SMINTOLD 486,CYRIX,ND
SMSW mem 286
SMSW mem16 286
SMSW reg16 286
SMSW reg32 386
STC 8086
STD 8086
STGI X64
STI 8086
STOSB 8086
STOSD 386
STOSQ X64
STOSW 8086
STR mem 286,PROT
STR mem16 286,PROT
STR reg16 286,PROT
STR reg32 386,PROT
STR reg64 X64
SUB mem,reg8 8086
SUB reg8,reg8 8086
SUB mem,reg16 8086
SUB reg16,reg16 8086
SUB mem,reg32 386
SUB reg32,reg32 386
SUB mem,reg64 X64
SUB reg64,reg64 X64
SUB reg8,mem 8086
SUB reg8,reg8 8086
SUB reg16,mem 8086
SUB reg16,reg16 8086
SUB reg32,mem 386
SUB reg32,reg32 386
SUB reg64,mem X64
SUB reg64,reg64 X64
SUB rm16,imm8 8086
SUB rm32,imm8 386
SUB rm64,imm8 X64
SUB reg_al,imm 8086
SUB reg_ax,imm 8086
SUB reg_eax,imm 386
SUB reg_rax,imm X64
SUB rm8,imm 8086
SUB rm16,imm 8086
SUB rm32,imm 386
SUB rm64,imm X64
SUB mem,imm8 8086
SUB mem,imm16 8086
SUB mem,imm32 386
SVDC mem80,reg_sreg 486,CYRIXM
SVLDT mem80 486,CYRIXM,ND
SVTS mem80 486,CYRIXM
SWAPGS X64
SYSCALL P6,AMD
141
SYSENTER P6
SYSEXIT P6,PRIV
SYSRET P6,PRIV,AMD
TEST mem,reg8 8086
TEST reg8,reg8 8086
TEST mem,reg16 8086
TEST reg16,reg16 8086
TEST mem,reg32 386
TEST reg32,reg32 386
TEST mem,reg64 X64
TEST reg64,reg64 X64
TEST reg8,mem 8086
TEST reg16,mem 8086
TEST reg32,mem 386
TEST reg64,mem X64
TEST reg_al,imm 8086
TEST reg_ax,imm 8086
TEST reg_eax,imm 386
TEST reg_rax,imm X64
TEST rm8,imm 8086
TEST rm16,imm 8086
TEST rm32,imm 386
TEST rm64,imm X64
TEST mem,imm8 8086
TEST mem,imm16 8086
TEST mem,imm32 386
UD0 186,UNDOC
UD1 186,UNDOC
UD2B 186,UNDOC,ND
UD2 186
UD2A 186,ND
UMOV mem,reg8 386,UNDOC,ND
UMOV reg8,reg8 386,UNDOC,ND
UMOV mem,reg16 386,UNDOC,ND
UMOV reg16,reg16 386,UNDOC,ND
UMOV mem,reg32 386,UNDOC,ND
UMOV reg32,reg32 386,UNDOC,ND
UMOV reg8,mem 386,UNDOC,ND
UMOV reg8,reg8 386,UNDOC,ND
UMOV reg16,mem 386,UNDOC,ND
UMOV reg16,reg16 386,UNDOC,ND
UMOV reg32,mem 386,UNDOC,ND
UMOV reg32,reg32 386,UNDOC,ND
VERR mem 286,PROT
VERR mem16 286,PROT
VERR reg16 286,PROT
VERW mem 286,PROT
VERW mem16 286,PROT
VERW reg16 286,PROT
WAIT 8086
FWAIT 8086
WBINVD 486,PRIV
WRSHR rm32 P6,CYRIXM
142
WRMSR PENT,PRIV
XADD mem,reg8 486
XADD reg8,reg8 486
XADD mem,reg16 486
XADD reg16,reg16 486
XADD mem,reg32 486
XADD reg32,reg32 486
XADD mem,reg64 X64
XADD reg64,reg64 X64
XBTS reg16,mem 386,SW,UNDOC,ND
XBTS reg16,reg16 386,UNDOC,ND
XBTS reg32,mem 386,SD,UNDOC,ND
XBTS reg32,reg32 386,UNDOC,ND
XCHG reg_ax,reg16 8086
XCHG reg_eax,reg32na 386
XCHG reg_rax,reg64 X64
XCHG reg16,reg_ax 8086
XCHG reg32na,reg_eax 386
XCHG reg64,reg_rax X64
XCHG reg_eax,reg_eax 386,NOLONG
XCHG reg8,mem 8086
XCHG reg8,reg8 8086
XCHG reg16,mem 8086
XCHG reg16,reg16 8086
XCHG reg32,mem 386
XCHG reg32,reg32 386
XCHG reg64,mem X64
XCHG reg64,reg64 X64
XCHG mem,reg8 8086
XCHG reg8,reg8 8086
XCHG mem,reg16 8086
XCHG reg16,reg16 8086
XCHG mem,reg32 386
XCHG reg32,reg32 386
XCHG mem,reg64 X64
XCHG reg64,reg64 X64
XLATB 8086
XLAT 8086
XOR mem,reg8 8086
XOR reg8,reg8 8086
XOR mem,reg16 8086
XOR reg16,reg16 8086
XOR mem,reg32 386
XOR reg32,reg32 386
XOR mem,reg64 X64
XOR reg64,reg64 X64
XOR reg8,mem 8086
XOR reg8,reg8 8086
XOR reg16,mem 8086
XOR reg16,reg16 8086
XOR reg32,mem 386
XOR reg32,reg32 386
XOR reg64,mem X64
143
XOR reg64,reg64 X64
XOR rm16,imm8 8086
XOR rm32,imm8 386
XOR rm64,imm8 X64
XOR reg_al,imm 8086
XOR reg_ax,imm 8086
XOR reg_eax,imm 386
XOR reg_rax,imm X64
XOR rm8,imm 8086
XOR rm16,imm 8086
XOR rm32,imm 386
XOR rm64,imm X64
XOR mem,imm8 8086
XOR mem,imm16 8086
XOR mem,imm32 386
CMOVcc reg16,mem P6
CMOVcc reg16,reg16 P6
CMOVcc reg32,mem P6
CMOVcc reg32,reg32 P6
CMOVcc reg64,mem X64
CMOVcc reg64,reg64 X64
Jcc imm|near 386
Jcc imm16|near 386
Jcc imm32|near 386
Jcc imm|short 8086,ND
Jcc imm 8086,ND
Jcc imm 386,ND
Jcc imm 8086,ND
Jcc imm 8086
SETcc mem 386
SETcc reg8 386
B.1.3 Katmai Streaming SIMD instructions (SSE –– a.k.a. KNI, XMM, MMX2)
ADDPS xmmreg,xmmrm KATMAI,SSE
ADDSS xmmreg,xmmrm KATMAI,SSE,SD
ANDNPS xmmreg,xmmrm KATMAI,SSE
ANDPS xmmreg,xmmrm KATMAI,SSE
CMPEQPS xmmreg,xmmrm KATMAI,SSE
CMPEQSS xmmreg,xmmrm KATMAI,SSE
CMPLEPS xmmreg,xmmrm KATMAI,SSE
CMPLESS xmmreg,xmmrm KATMAI,SSE
CMPLTPS xmmreg,xmmrm KATMAI,SSE
CMPLTSS xmmreg,xmmrm KATMAI,SSE
CMPNEQPS xmmreg,xmmrm KATMAI,SSE
CMPNEQSS xmmreg,xmmrm KATMAI,SSE
CMPNLEPS xmmreg,xmmrm KATMAI,SSE
CMPNLESS xmmreg,xmmrm KATMAI,SSE
CMPNLTPS xmmreg,xmmrm KATMAI,SSE
CMPNLTSS xmmreg,xmmrm KATMAI,SSE
CMPORDPS xmmreg,xmmrm KATMAI,SSE
CMPORDSS xmmreg,xmmrm KATMAI,SSE
CMPUNORDPS xmmreg,xmmrm KATMAI,SSE
CMPUNORDSS xmmreg,xmmrm KATMAI,SSE
144
CMPPS xmmreg,mem,imm KATMAI,SSE
CMPPS xmmreg,xmmreg,imm KATMAI,SSE
CMPSS xmmreg,mem,imm KATMAI,SSE
CMPSS xmmreg,xmmreg,imm KATMAI,SSE
COMISS xmmreg,xmmrm KATMAI,SSE
CVTPI2PS xmmreg,mmxrm KATMAI,SSE,MMX
CVTPS2PI mmxreg,xmmrm KATMAI,SSE,MMX
CVTSI2SS xmmreg,mem KATMAI,SSE,SD,AR1,ND
CVTSI2SS xmmreg,rm32 KATMAI,SSE,SD,AR1
CVTSI2SS xmmreg,rm64 X64,SSE,AR1
CVTSS2SI reg32,xmmreg KATMAI,SSE,SD,AR1
CVTSS2SI reg32,mem KATMAI,SSE,SD,AR1
CVTSS2SI reg64,xmmreg X64,SSE,SD,AR1
CVTSS2SI reg64,mem X64,SSE,SD,AR1
CVTTPS2PI mmxreg,xmmrm KATMAI,SSE,MMX
CVTTSS2SI reg32,xmmrm KATMAI,SSE,SD,AR1
CVTTSS2SI reg64,xmmrm X64,SSE,SD,AR1
DIVPS xmmreg,xmmrm KATMAI,SSE
DIVSS xmmreg,xmmrm KATMAI,SSE
LDMXCSR mem KATMAI,SSE,SD
MAXPS xmmreg,xmmrm KATMAI,SSE
MAXSS xmmreg,xmmrm KATMAI,SSE
MINPS xmmreg,xmmrm KATMAI,SSE
MINSS xmmreg,xmmrm KATMAI,SSE
MOVAPS xmmreg,mem KATMAI,SSE
MOVAPS mem,xmmreg KATMAI,SSE
MOVAPS xmmreg,xmmreg KATMAI,SSE
MOVAPS xmmreg,xmmreg KATMAI,SSE
MOVHPS xmmreg,mem KATMAI,SSE
MOVHPS mem,xmmreg KATMAI,SSE
MOVLHPS xmmreg,xmmreg KATMAI,SSE
MOVLPS xmmreg,mem KATMAI,SSE
MOVLPS mem,xmmreg KATMAI,SSE
MOVHLPS xmmreg,xmmreg KATMAI,SSE
MOVMSKPS reg32,xmmreg KATMAI,SSE
MOVMSKPS reg64,xmmreg X64,SSE
MOVNTPS mem,xmmreg KATMAI,SSE
MOVSS xmmreg,mem KATMAI,SSE
MOVSS mem,xmmreg KATMAI,SSE
MOVSS xmmreg,xmmreg KATMAI,SSE
MOVSS xmmreg,xmmreg KATMAI,SSE
MOVUPS xmmreg,mem KATMAI,SSE
MOVUPS mem,xmmreg KATMAI,SSE
MOVUPS xmmreg,xmmreg KATMAI,SSE
MOVUPS xmmreg,xmmreg KATMAI,SSE
MULPS xmmreg,xmmrm KATMAI,SSE
MULSS xmmreg,xmmrm KATMAI,SSE
ORPS xmmreg,xmmrm KATMAI,SSE
RCPPS xmmreg,xmmrm KATMAI,SSE
RCPSS xmmreg,xmmrm KATMAI,SSE
RSQRTPS xmmreg,xmmrm KATMAI,SSE
RSQRTSS xmmreg,xmmrm KATMAI,SSE
SHUFPS xmmreg,mem,imm KATMAI,SSE
145
SHUFPS xmmreg,xmmreg,imm KATMAI,SSE
SQRTPS xmmreg,xmmrm KATMAI,SSE
SQRTSS xmmreg,xmmrm KATMAI,SSE
STMXCSR mem KATMAI,SSE,SD
SUBPS xmmreg,xmmrm KATMAI,SSE
SUBSS xmmreg,xmmrm KATMAI,SSE
UCOMISS xmmreg,xmmrm KATMAI,SSE
UNPCKHPS xmmreg,xmmrm KATMAI,SSE
UNPCKLPS xmmreg,xmmrm KATMAI,SSE
XORPS xmmreg,xmmrm KATMAI,SSE
B.1.4 Introduced in Deschutes but necessary for SSE support
FXRSTOR mem P6,SSE,FPU
FXSAVE mem P6,SSE,FPU
B.1.5 XSAVE group (AVX and extended state)
XGETBV NEHALEM
XSETBV NEHALEM,PRIV
XSAVE mem NEHALEM
XRSTOR mem NEHALEM
B.1.6 Generic memory operations
PREFETCHNTA mem KATMAI
PREFETCHT0 mem KATMAI
PREFETCHT1 mem KATMAI
PREFETCHT2 mem KATMAI
SFENCE KATMAI
B.1.7 New MMX instructions introduced in Katmai
MASKMOVQ mmxreg,mmxreg KATMAI,MMX
MOVNTQ mem,mmxreg KATMAI,MMX
PAVGB mmxreg,mmxrm KATMAI,MMX
PAVGW mmxreg,mmxrm KATMAI,MMX
PEXTRW reg32,mmxreg,imm KATMAI,MMX
PINSRW mmxreg,reg16,imm KATMAI,MMX
PINSRW mmxreg,reg32,imm KATMAI,MMX,ND
PINSRW mmxreg,mem,imm KATMAI,MMX
PINSRW mmxreg,mem16,imm KATMAI,MMX,ND
PMAXSW mmxreg,mmxrm KATMAI,MMX
PMAXUB mmxreg,mmxrm KATMAI,MMX
PMINSW mmxreg,mmxrm KATMAI,MMX
PMINUB mmxreg,mmxrm KATMAI,MMX
PMOVMSKB reg32,mmxreg KATMAI,MMX
PMULHUW mmxreg,mmxrm KATMAI,MMX
PSADBW mmxreg,mmxrm KATMAI,MMX
PSHUFW mmxreg,mmxrm,imm KATMAI,MMX2
B.1.8 AMD Enhanced 3DNow! (Athlon) instructions
PF2IW mmxreg,mmxrm PENT,3DNOW
PFNACC mmxreg,mmxrm PENT,3DNOW
PFPNACC mmxreg,mmxrm PENT,3DNOW
146
PI2FW mmxreg,mmxrm PENT,3DNOW
PSWAPD mmxreg,mmxrm PENT,3DNOW
B.1.9 Willamette SSE2 Cacheability Instructions
MASKMOVDQU xmmreg,xmmreg WILLAMETTE,SSE2
CLFLUSH mem WILLAMETTE,SSE2
MOVNTDQ mem,xmmreg WILLAMETTE,SSE2,SO
MOVNTI mem,reg32 WILLAMETTE,SD
MOVNTI mem,reg64 X64
MOVNTPD mem,xmmreg WILLAMETTE,SSE2,SO
LFENCE WILLAMETTE,SSE2
MFENCE WILLAMETTE,SSE2
B.1.10 Willamette MMX instructions (SSE2 SIMD Integer Instructions)
MOVD xmmreg,reg32 WILLAMETTE,SSE2
MOVD reg32,xmmreg WILLAMETTE,SSE2
MOVD mem,xmmreg WILLAMETTE,SSE2,SD
MOVD xmmreg,mem WILLAMETTE,SSE2,SD
MOVDQA xmmreg,xmmreg WILLAMETTE,SSE2
MOVDQA mem,xmmreg WILLAMETTE,SSE2,SO
MOVDQA xmmreg,mem WILLAMETTE,SSE2,SO
MOVDQA xmmreg,xmmreg WILLAMETTE,SSE2
MOVDQU xmmreg,xmmreg WILLAMETTE,SSE2
MOVDQU mem,xmmreg WILLAMETTE,SSE2,SO
MOVDQU xmmreg,mem WILLAMETTE,SSE2,SO
MOVDQU xmmreg,xmmreg WILLAMETTE,SSE2
MOVDQ2Q mmxreg,xmmreg WILLAMETTE,SSE2
MOVQ xmmreg,xmmreg WILLAMETTE,SSE2
MOVQ xmmreg,xmmreg WILLAMETTE,SSE2
MOVQ mem,xmmreg WILLAMETTE,SSE2
MOVQ xmmreg,mem WILLAMETTE,SSE2
MOVQ xmmreg,rm64 X64,SSE2
MOVQ rm64,xmmreg X64,SSE2
MOVQ2DQ xmmreg,mmxreg WILLAMETTE,SSE2
PACKSSWB xmmreg,xmmrm WILLAMETTE,SSE2,SO
PACKSSDW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PACKUSWB xmmreg,xmmrm WILLAMETTE,SSE2,SO
PADDB xmmreg,xmmrm WILLAMETTE,SSE2,SO
PADDW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PADDD xmmreg,xmmrm WILLAMETTE,SSE2,SO
PADDQ mmxreg,mmxrm WILLAMETTE,SSE2,SO
PADDQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
PADDSB xmmreg,xmmrm WILLAMETTE,SSE2,SO
PADDSW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PADDUSB xmmreg,xmmrm WILLAMETTE,SSE2,SO
PADDUSW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PAND xmmreg,xmmrm WILLAMETTE,SSE2,SO
PANDN xmmreg,xmmrm WILLAMETTE,SSE2,SO
PAVGB xmmreg,xmmrm WILLAMETTE,SSE2,SO
PAVGW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PCMPEQB xmmreg,xmmrm WILLAMETTE,SSE2,SO
PCMPEQW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PCMPEQD xmmreg,xmmrm WILLAMETTE,SSE2,SO
147
PCMPGTB xmmreg,xmmrm WILLAMETTE,SSE2,SO
PCMPGTW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PCMPGTD xmmreg,xmmrm WILLAMETTE,SSE2,SO
PEXTRW reg32,xmmreg,imm WILLAMETTE,SSE2
PINSRW xmmreg,reg16,imm WILLAMETTE,SSE2
PINSRW xmmreg,reg32,imm WILLAMETTE,SSE2,ND
PINSRW xmmreg,mem,imm WILLAMETTE,SSE2
PINSRW xmmreg,mem16,imm WILLAMETTE,SSE2,ND
PMADDWD xmmreg,xmmrm WILLAMETTE,SSE2,SO
PMAXSW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PMAXUB xmmreg,xmmrm WILLAMETTE,SSE2,SO
PMINSW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PMINUB xmmreg,xmmrm WILLAMETTE,SSE2,SO
PMOVMSKB reg32,xmmreg WILLAMETTE,SSE2
PMULHUW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PMULHW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PMULLW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PMULUDQ mmxreg,mmxrm WILLAMETTE,SSE2,SO
PMULUDQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
POR xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSADBW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSHUFD xmmreg,xmmreg,imm WILLAMETTE,SSE2
PSHUFD xmmreg,mem,imm WILLAMETTE,SSE22
PSHUFHW xmmreg,xmmreg,imm WILLAMETTE,SSE2
PSHUFHW xmmreg,mem,imm WILLAMETTE,SSE22
PSHUFLW xmmreg,xmmreg,imm WILLAMETTE,SSE2
PSHUFLW xmmreg,mem,imm WILLAMETTE,SSE22
PSLLDQ xmmreg,imm WILLAMETTE,SSE2,AR1
PSLLW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSLLW xmmreg,imm WILLAMETTE,SSE2,AR1
PSLLD xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSLLD xmmreg,imm WILLAMETTE,SSE2,AR1
PSLLQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSLLQ xmmreg,imm WILLAMETTE,SSE2,AR1
PSRAW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSRAW xmmreg,imm WILLAMETTE,SSE2,AR1
PSRAD xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSRAD xmmreg,imm WILLAMETTE,SSE2,AR1
PSRLDQ xmmreg,imm WILLAMETTE,SSE2,AR1
PSRLW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSRLW xmmreg,imm WILLAMETTE,SSE2,AR1
PSRLD xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSRLD xmmreg,imm WILLAMETTE,SSE2,AR1
PSRLQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSRLQ xmmreg,imm WILLAMETTE,SSE2,AR1
PSUBB xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSUBW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSUBD xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSUBQ mmxreg,mmxrm WILLAMETTE,SSE2,SO
PSUBQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSUBSB xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSUBSW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PSUBUSB xmmreg,xmmrm WILLAMETTE,SSE2,SO
148
PSUBUSW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PUNPCKHBW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PUNPCKHWD xmmreg,xmmrm WILLAMETTE,SSE2,SO
PUNPCKHDQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
PUNPCKHQDQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
PUNPCKLBW xmmreg,xmmrm WILLAMETTE,SSE2,SO
PUNPCKLWD xmmreg,xmmrm WILLAMETTE,SSE2,SO
PUNPCKLDQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
PUNPCKLQDQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
PXOR xmmreg,xmmrm WILLAMETTE,SSE2,SO
B.1.11 Willamette Streaming SIMD instructions (SSE2)
ADDPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
ADDSD xmmreg,xmmrm WILLAMETTE,SSE2
ANDNPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
ANDPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
CMPEQPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
CMPEQSD xmmreg,xmmrm WILLAMETTE,SSE2
CMPLEPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
CMPLESD xmmreg,xmmrm WILLAMETTE,SSE2
CMPLTPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
CMPLTSD xmmreg,xmmrm WILLAMETTE,SSE2
CMPNEQPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
CMPNEQSD xmmreg,xmmrm WILLAMETTE,SSE2
CMPNLEPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
CMPNLESD xmmreg,xmmrm WILLAMETTE,SSE2
CMPNLTPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
CMPNLTSD xmmreg,xmmrm WILLAMETTE,SSE2
CMPORDPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
CMPORDSD xmmreg,xmmrm WILLAMETTE,SSE2
CMPUNORDPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
CMPUNORDSD xmmreg,xmmrm WILLAMETTE,SSE2
CMPPD xmmreg,xmmrm,imm WILLAMETTE,SSE22
CMPSD xmmreg,xmmrm,imm WILLAMETTE,SSE2
COMISD xmmreg,xmmrm WILLAMETTE,SSE2
CVTDQ2PD xmmreg,xmmrm WILLAMETTE,SSE2
CVTDQ2PS xmmreg,xmmrm WILLAMETTE,SSE2,SO
CVTPD2DQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
CVTPD2PI mmxreg,xmmrm WILLAMETTE,SSE2,SO
CVTPD2PS xmmreg,xmmrm WILLAMETTE,SSE2,SO
CVTPI2PD xmmreg,mmxrm WILLAMETTE,SSE2
CVTPS2DQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
CVTPS2PD xmmreg,xmmrm WILLAMETTE,SSE2
CVTSD2SI reg32,xmmreg WILLAMETTE,SSE2,AR1
CVTSD2SI reg32,mem WILLAMETTE,SSE2,AR1
CVTSD2SI reg64,xmmreg X64,SSE2,AR1
CVTSD2SI reg64,mem X64,SSE2,AR1
CVTSD2SS xmmreg,xmmrm WILLAMETTE,SSE2
CVTSI2SD xmmreg,mem WILLAMETTE,SSE2,SD,AR1,ND
CVTSI2SD xmmreg,rm32 WILLAMETTE,SSE2,SD,AR1
CVTSI2SD xmmreg,rm64 X64,SSE2,AR1
CVTSS2SD xmmreg,xmmrm WILLAMETTE,SSE2,SD
CVTTPD2PI mmxreg,xmmrm WILLAMETTE,SSE2,SO
149
CVTTPD2DQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
CVTTPS2DQ xmmreg,xmmrm WILLAMETTE,SSE2,SO
CVTTSD2SI reg32,xmmreg WILLAMETTE,SSE2,AR1
CVTTSD2SI reg32,mem WILLAMETTE,SSE2,AR1
CVTTSD2SI reg64,xmmreg X64,SSE2,AR1
CVTTSD2SI reg64,mem X64,SSE2,AR1
DIVPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
DIVSD xmmreg,xmmrm WILLAMETTE,SSE2
MAXPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
MAXSD xmmreg,xmmrm WILLAMETTE,SSE2
MINPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
MINSD xmmreg,xmmrm WILLAMETTE,SSE2
MOVAPD xmmreg,xmmreg WILLAMETTE,SSE2
MOVAPD xmmreg,xmmreg WILLAMETTE,SSE2
MOVAPD mem,xmmreg WILLAMETTE,SSE2,SO
MOVAPD xmmreg,mem WILLAMETTE,SSE2,SO
MOVHPD mem,xmmreg WILLAMETTE,SSE2
MOVHPD xmmreg,mem WILLAMETTE,SSE2
MOVLPD mem,xmmreg WILLAMETTE,SSE2
MOVLPD xmmreg,mem WILLAMETTE,SSE2
MOVMSKPD reg32,xmmreg WILLAMETTE,SSE2
MOVMSKPD reg64,xmmreg X64,SSE2
MOVSD xmmreg,xmmreg WILLAMETTE,SSE2
MOVSD xmmreg,xmmreg WILLAMETTE,SSE2
MOVSD mem,xmmreg WILLAMETTE,SSE2
MOVSD xmmreg,mem WILLAMETTE,SSE2
MOVUPD xmmreg,xmmreg WILLAMETTE,SSE2
MOVUPD xmmreg,xmmreg WILLAMETTE,SSE2
MOVUPD mem,xmmreg WILLAMETTE,SSE2,SO
MOVUPD xmmreg,mem WILLAMETTE,SSE2,SO
MULPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
MULSD xmmreg,xmmrm WILLAMETTE,SSE2
ORPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
SHUFPD xmmreg,xmmreg,imm WILLAMETTE,SSE2
SHUFPD xmmreg,mem,imm WILLAMETTE,SSE2
SQRTPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
SQRTSD xmmreg,xmmrm WILLAMETTE,SSE2
SUBPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
SUBSD xmmreg,xmmrm WILLAMETTE,SSE2
UCOMISD xmmreg,xmmrm WILLAMETTE,SSE2
UNPCKHPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
UNPCKLPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
XORPD xmmreg,xmmrm WILLAMETTE,SSE2,SO
B.1.12 Prescott New Instructions (SSE3)
ADDSUBPD xmmreg,xmmrm PRESCOTT,SSE3,SO
ADDSUBPS xmmreg,xmmrm PRESCOTT,SSE3,SO
HADDPD xmmreg,xmmrm PRESCOTT,SSE3,SO
HADDPS xmmreg,xmmrm PRESCOTT,SSE3,SO
HSUBPD xmmreg,xmmrm PRESCOTT,SSE3,SO
HSUBPS xmmreg,xmmrm PRESCOTT,SSE3,SO
LDDQU xmmreg,mem PRESCOTT,SSE3,SO
MOVDDUP xmmreg,xmmrm PRESCOTT,SSE3
150
MOVSHDUP xmmreg,xmmrm PRESCOTT,SSE3
MOVSLDUP xmmreg,xmmrm PRESCOTT,SSE3
B.1.13 VMX Instructions
VMCALL VMX
VMCLEAR mem VMX
VMLAUNCH VMX
VMLOAD X64,VMX
VMMCALL X64,VMX
VMPTRLD mem VMX
VMPTRST mem VMX
VMREAD rm32,reg32 VMX,NOLONG,SD
VMREAD rm64,reg64 X64,VMX
VMRESUME VMX
VMRUN X64,VMX
VMSAVE X64,VMX
VMWRITE reg32,rm32 VMX,NOLONG,SD
VMWRITE reg64,rm64 X64,VMX
VMXOFF VMX
VMXON mem VMX
B.1.14 Extended Page Tables VMX instructions
INVEPT reg32,mem VMX,SO,NOLONG
INVEPT reg64,mem VMX,SO,LONG
INVVPID reg32,mem VMX,SO,NOLONG
INVVPID reg64,mem VMX,SO,LONG
B.1.15 Tejas New Instructions (SSSE3)
PABSB mmxreg,mmxrm SSSE3,MMX
PABSB xmmreg,xmmrm SSSE3
PABSW mmxreg,mmxrm SSSE3,MMX
PABSW xmmreg,xmmrm SSSE3
PABSD mmxreg,mmxrm SSSE3,MMX
PABSD xmmreg,xmmrm SSSE3
PALIGNR mmxreg,mmxrm,imm SSSE3,MMX
PALIGNR xmmreg,xmmrm,imm SSSE3
PHADDW mmxreg,mmxrm SSSE3,MMX
PHADDW xmmreg,xmmrm SSSE3
PHADDD mmxreg,mmxrm SSSE3,MMX
PHADDD xmmreg,xmmrm SSSE3
PHADDSW mmxreg,mmxrm SSSE3,MMX
PHADDSW xmmreg,xmmrm SSSE3
PHSUBW mmxreg,mmxrm SSSE3,MMX
PHSUBW xmmreg,xmmrm SSSE3
PHSUBD mmxreg,mmxrm SSSE3,MMX
PHSUBD xmmreg,xmmrm SSSE3
PHSUBSW mmxreg,mmxrm SSSE3,MMX
PHSUBSW xmmreg,xmmrm SSSE3
PMADDUBSW mmxreg,mmxrm SSSE3,MMX
PMADDUBSW xmmreg,xmmrm SSSE3
PMULHRSW mmxreg,mmxrm SSSE3,MMX
PMULHRSW xmmreg,xmmrm SSSE3
151
PSHUFB mmxreg,mmxrm SSSE3,MMX
PSHUFB xmmreg,xmmrm SSSE3
PSIGNB mmxreg,mmxrm SSSE3,MMX
PSIGNB xmmreg,xmmrm SSSE3
PSIGNW mmxreg,mmxrm SSSE3,MMX
PSIGNW xmmreg,xmmrm SSSE3
PSIGND mmxreg,mmxrm SSSE3,MMX
PSIGND xmmreg,xmmrm SSSE3
B.1.16 AMD SSE4A
EXTRQ xmmreg,imm,imm SSE4A,AMD
EXTRQ xmmreg,xmmreg SSE4A,AMD
INSERTQ xmmreg,xmmreg,imm,imm SSE4A,AMD
INSERTQ xmmreg,xmmreg SSE4A,AMD
MOVNTSD mem,xmmreg SSE4A,AMD
MOVNTSS mem,xmmreg SSE4A,AMD,SD
B.1.17 New instructions in Barcelona
LZCNT reg16,rm16 P6,AMD
LZCNT reg32,rm32 P6,AMD
LZCNT reg64,rm64 P6,AMD
B.1.18 Penryn New Instructions (SSE4.1)
BLENDPD xmmreg,xmmrm,imm SSE41
BLENDPS xmmreg,xmmrm,imm SSE41
BLENDVPD xmmreg,xmmrm,xmm0 SSE41
BLENDVPS xmmreg,xmmrm,xmm0 SSE41
DPPD xmmreg,xmmrm,imm SSE41
DPPS xmmreg,xmmrm,imm SSE41
EXTRACTPS rm32,xmmreg,imm SSE41
EXTRACTPS reg64,xmmreg,imm SSE41,X64
INSERTPS xmmreg,xmmrm,imm SSE41,SD
MOVNTDQA xmmreg,mem SSE41
MPSADBW xmmreg,xmmrm,imm SSE41
PACKUSDW xmmreg,xmmrm SSE41
PBLENDVB xmmreg,xmmrm,xmm0 SSE41
PBLENDW xmmreg,xmmrm,imm SSE41
PCMPEQQ xmmreg,xmmrm SSE41
PEXTRB reg32,xmmreg,imm SSE41
PEXTRB mem8,xmmreg,imm SSE41
PEXTRB reg64,xmmreg,imm SSE41,X64
PEXTRD rm32,xmmreg,imm SSE41
PEXTRQ rm64,xmmreg,imm SSE41,X64
PEXTRW reg32,xmmreg,imm SSE41
PEXTRW mem16,xmmreg,imm SSE41
PEXTRW reg64,xmmreg,imm SSE41,X64
PHMINPOSUW xmmreg,xmmrm SSE41
PINSRB xmmreg,reg32,imm SSE41
PINSRB xmmreg,mem8,imm SSE41
PINSRD xmmreg,rm32,imm SSE41
PINSRQ xmmreg,rm64,imm SSE41,X64
PMAXSB xmmreg,xmmrm SSE41
152
PMAXSD xmmreg,xmmrm SSE41
PMAXUD xmmreg,xmmrm SSE41
PMAXUW xmmreg,xmmrm SSE41
PMINSB xmmreg,xmmrm SSE41
PMINSD xmmreg,xmmrm SSE41
PMINUD xmmreg,xmmrm SSE41
PMINUW xmmreg,xmmrm SSE41
PMOVSXBW xmmreg,xmmrm SSE41
PMOVSXBD xmmreg,xmmrm SSE41,SD
PMOVSXBQ xmmreg,xmmrm SSE41,SW
PMOVSXWD xmmreg,xmmrm SSE41
PMOVSXWQ xmmreg,xmmrm SSE41,SD
PMOVSXDQ xmmreg,xmmrm SSE41
PMOVZXBW xmmreg,xmmrm SSE41
PMOVZXBD xmmreg,xmmrm SSE41,SD
PMOVZXBQ xmmreg,xmmrm SSE41,SW
PMOVZXWD xmmreg,xmmrm SSE41
PMOVZXWQ xmmreg,xmmrm SSE41,SD
PMOVZXDQ xmmreg,xmmrm SSE41
PMULDQ xmmreg,xmmrm SSE41
PMULLD xmmreg,xmmrm SSE41
PTEST xmmreg,xmmrm SSE41
ROUNDPD xmmreg,xmmrm,imm SSE41
ROUNDPS xmmreg,xmmrm,imm SSE41
ROUNDSD xmmreg,xmmrm,imm SSE41
ROUNDSS xmmreg,xmmrm,imm SSE41
B.1.19 Nehalem New Instructions (SSE4.2)
CRC32 reg32,rm8 SSE42
CRC32 reg32,rm16 SSE42
CRC32 reg32,rm32 SSE42
CRC32 reg64,rm8 SSE42,X64
CRC32 reg64,rm64 SSE42,X64
PCMPESTRI xmmreg,xmmrm,imm SSE42
PCMPESTRM xmmreg,xmmrm,imm SSE42
PCMPISTRI xmmreg,xmmrm,imm SSE42
PCMPISTRM xmmreg,xmmrm,imm SSE42
PCMPGTQ xmmreg,xmmrm SSE42
POPCNT reg16,rm16 NEHALEM
POPCNT reg32,rm32 NEHALEM
POPCNT reg64,rm32 NEHALEM,X64
B.1.20 AMD SSE5 instructions
FMADDPS xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FMADDPS xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FMADDPS xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FMADDPS xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FMADDPD xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FMADDPD xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FMADDPD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FMADDPD xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FMADDSS xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FMADDSS xmmreg,=0,xmmrm,xmmreg SSE5,AMD
153
FMADDSS xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FMADDSS xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FMADDSD xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FMADDSD xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FMADDSD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FMADDSD xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FMSUBPS xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FMSUBPS xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FMSUBPS xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FMSUBPS xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FMSUBPD xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FMSUBPD xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FMSUBPD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FMSUBPD xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FMSUBSS xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FMSUBSS xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FMSUBSS xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FMSUBSS xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FMSUBSD xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FMSUBSD xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FMSUBSD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FMSUBSD xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FNMADDPS xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FNMADDPS xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FNMADDPS xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FNMADDPS xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FNMADDPD xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FNMADDPD xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FNMADDPD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FNMADDPD xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FNMADDSS xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FNMADDSS xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FNMADDSS xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FNMADDSS xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FNMADDSD xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FNMADDSD xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FNMADDSD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FNMADDSD xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FNMSUBPS xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FNMSUBPS xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FNMSUBPS xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FNMSUBPS xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FNMSUBPD xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FNMSUBPD xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FNMSUBPD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FNMSUBPD xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FNMSUBSS xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FNMSUBSS xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FNMSUBSS xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
FNMSUBSS xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
FNMSUBSD xmmreg,=0,xmmreg,xmmrm SSE5,AMD
FNMSUBSD xmmreg,=0,xmmrm,xmmreg SSE5,AMD
FNMSUBSD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
154
FNMSUBSD xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
COMEQPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMLTPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMLEPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMUNORDPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMUNEQPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMUNLTPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMUNLEPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMORDPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMUEQPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMULTPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMULEPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMFALSEPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMNEQPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMNLTPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMNLEPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMTRUEPS xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMPS xmmreg,xmmreg,xmmrm,imm SSE5,AMD,SO
COMEQPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMLTPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMLEPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMUNORDPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMUNEQPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMUNLTPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMUNLEPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMORDPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMUEQPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMULTPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMULEPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMFALSEPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMNEQPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMNLTPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMNLEPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMTRUEPD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
COMPD xmmreg,xmmreg,xmmrm,imm SSE5,AMD,SO
COMEQSS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMLTSS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMLESS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMUNORDSS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMUNEQSS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMUNLTSS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMUNLESS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMORDSS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMUEQSS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMULTSS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMULESS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMFALSESS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMNEQSS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMNLTSS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMNLESS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMTRUESS xmmreg,xmmreg,xmmrm SSE5,AMD,SD
COMSS xmmreg,xmmreg,xmmrm,imm SSE5,AMD,SD
COMEQSD xmmreg,xmmreg,xmmrm SSE5,AMD
155
COMLTSD xmmreg,xmmreg,xmmrm SSE5,AMD
COMLESD xmmreg,xmmreg,xmmrm SSE5,AMD
COMUNORDSD xmmreg,xmmreg,xmmrm SSE5,AMD
COMUNEQSD xmmreg,xmmreg,xmmrm SSE5,AMD
COMUNLTSD xmmreg,xmmreg,xmmrm SSE5,AMD
COMUNLESD xmmreg,xmmreg,xmmrm SSE5,AMD
COMORDSD xmmreg,xmmreg,xmmrm SSE5,AMD
COMUEQSD xmmreg,xmmreg,xmmrm SSE5,AMD
COMULTSD xmmreg,xmmreg,xmmrm SSE5,AMD
COMULESD xmmreg,xmmreg,xmmrm SSE5,AMD
COMFALSESD xmmreg,xmmreg,xmmrm SSE5,AMD
COMNEQSD xmmreg,xmmreg,xmmrm SSE5,AMD
COMNLTSD xmmreg,xmmreg,xmmrm SSE5,AMD
COMNLESD xmmreg,xmmreg,xmmrm SSE5,AMD
COMTRUESD xmmreg,xmmreg,xmmrm SSE5,AMD
COMSD xmmreg,xmmreg,xmmrm,imm SSE5,AMD
PCOMLTB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMLEB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGTB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGEB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMEQB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMNEQB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMFALSEB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMTRUEB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMB xmmreg,xmmreg,xmmrm,imm SSE5,AMD,SO
PCOMLTW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMLEW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGTW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGEW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMEQW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMNEQW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMFALSEW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMTRUEW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMW xmmreg,xmmreg,xmmrm,imm SSE5,AMD,SO
PCOMLTD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMLED xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGTD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGED xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMEQD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMNEQD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMFALSED xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMTRUED xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMD xmmreg,xmmreg,xmmrm,imm SSE5,AMD,SO
PCOMLTQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMLEQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGTQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGEQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMEQQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMNEQQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMFALSEQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMTRUEQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMQ xmmreg,xmmreg,xmmrm,imm SSE5,AMD,SO
PCOMLTUB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
156
PCOMLEUB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGTUB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGEUB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMEQUB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMNEQUB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMFALSEUB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMTRUEUB xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMUB xmmreg,xmmreg,xmmrm,imm SSE5,AMD,SO
PCOMLTUW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMLEUW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGTUW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGEUW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMEQUW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMNEQUW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMFALSEUW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMTRUEUW xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMUW xmmreg,xmmreg,xmmrm,imm SSE5,AMD,SO
PCOMLTUD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMLEUD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGTUD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGEUD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMEQUD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMNEQUD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMFALSEUD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMTRUEUD xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMUD xmmreg,xmmreg,xmmrm,imm SSE5,AMD,SO
PCOMLTUQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMLEUQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGTUQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMGEUQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMEQUQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMNEQUQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMFALSEUQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMTRUEUQ xmmreg,xmmreg,xmmrm SSE5,AMD,SO
PCOMUQ xmmreg,xmmreg,xmmrm,imm SSE5,AMD,SO
PERMPS xmmreg,=0,xmmreg,xmmrm SSE5,AMD
PERMPS xmmreg,=0,xmmrm,xmmreg SSE5,AMD
PERMPS xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PERMPS xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
PERMPD xmmreg,=0,xmmreg,xmmrm SSE5,AMD
PERMPD xmmreg,=0,xmmrm,xmmreg SSE5,AMD
PERMPD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PERMPD xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
PCMOV xmmreg,=0,xmmreg,xmmrm SSE5,AMD
PCMOV xmmreg,=0,xmmrm,xmmreg SSE5,AMD
PCMOV xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PCMOV xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
PPERM xmmreg,=0,xmmreg,xmmrm SSE5,AMD
PPERM xmmreg,=0,xmmrm,xmmreg SSE5,AMD
PPERM xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PPERM xmmreg,xmmrm,xmmreg,=0 SSE5,AMD
PMACSSWW xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PMACSWW xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
157
PMACSSWD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PMACSWD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PMACSSDD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PMACSDD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PMACSSDQL xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PMACSDQL xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PMACSSDQH xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PMACSDQH xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PMADCSSWD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PMADCSWD xmmreg,xmmreg,xmmrm,=0 SSE5,AMD
PROTB xmmreg,xmmreg,xmmrm SSE5,AMD
PROTB xmmreg,xmmrm,xmmreg SSE5,AMD
PROTW xmmreg,xmmreg,xmmrm SSE5,AMD
PROTW xmmreg,xmmrm,xmmreg SSE5,AMD
PROTD xmmreg,xmmreg,xmmrm SSE5,AMD
PROTD xmmreg,xmmrm,xmmreg SSE5,AMD
PROTQ xmmreg,xmmreg,xmmrm SSE5,AMD
PROTQ xmmreg,xmmrm,xmmreg SSE5,AMD
PSHLB xmmreg,xmmreg,xmmrm SSE5,AMD
PSHLB xmmreg,xmmrm,xmmreg SSE5,AMD
PSHLW xmmreg,xmmreg,xmmrm SSE5,AMD
PSHLW xmmreg,xmmrm,xmmreg SSE5,AMD
PSHLD xmmreg,xmmreg,xmmrm SSE5,AMD
PSHLD xmmreg,xmmrm,xmmreg SSE5,AMD
PSHLQ xmmreg,xmmreg,xmmrm SSE5,AMD
PSHLQ xmmreg,xmmrm,xmmreg SSE5,AMD
PSHAB xmmreg,xmmreg,xmmrm SSE5,AMD
PSHAB xmmreg,xmmrm,xmmreg SSE5,AMD
PSHAW xmmreg,xmmreg,xmmrm SSE5,AMD
PSHAW xmmreg,xmmrm,xmmreg SSE5,AMD
PSHAD xmmreg,xmmreg,xmmrm SSE5,AMD
PSHAD xmmreg,xmmrm,xmmreg SSE5,AMD
PSHAQ xmmreg,xmmreg,xmmrm SSE5,AMD
PSHAQ xmmreg,xmmrm,xmmreg SSE5,AMD
FRCZPS xmmreg,xmmrm SSE5,AMD
FRCZPD xmmreg,xmmrm SSE5,AMD
FRCZSS xmmreg,xmmrm SSE5,AMD
FRCZSD xmmreg,xmmrm SSE5,AMD
CVTPH2PS xmmreg,xmmrm SSE5,AMD
CVTPS2PH xmmrm,xmmreg SSE5,AMD
PHADDBW xmmreg,xmmrm SSE5,AMD
PHADDBD xmmreg,xmmrm SSE5,AMD
PHADDBQ xmmreg,xmmrm SSE5,AMD
PHADDWD xmmreg,xmmrm SSE5,AMD
PHADDWQ xmmreg,xmmrm SSE5,AMD
PHADDDQ xmmreg,xmmrm SSE5,AMD
PHADDUBW xmmreg,xmmrm SSE5,AMD
PHADDUBD xmmreg,xmmrm SSE5,AMD
PHADDUBQ xmmreg,xmmrm SSE5,AMD
PHADDUWD xmmreg,xmmrm SSE5,AMD
PHADDUWQ xmmreg,xmmrm SSE5,AMD
PHADDUDQ xmmreg,xmmrm SSE5,AMD
PHSUBBW xmmreg,xmmrm SSE5,AMD
158
PHSUBWD xmmreg,xmmrm SSE5,AMD
PHSUBDQ xmmreg,xmmrm SSE5,AMD
PROTB xmmreg,xmmrm,imm SSE5,AMD
PROTW xmmreg,xmmrm,imm SSE5,AMD
PROTD xmmreg,xmmrm,imm SSE5,AMD
PROTQ xmmreg,xmmrm,imm SSE5,AMD
ROUNDPS xmmreg,xmmrm,imm SSE5,AMD
ROUNDPD xmmreg,xmmrm,imm SSE5,AMD
ROUNDSS xmmreg,xmmrm,imm SSE5,AMD
ROUNDSD xmmreg,xmmrm,imm SSE5,AMD
B.1.21 Intel SMX
GETSEC KATMAI
B.1.22 Geode (Cyrix) 3DNow! additions
PFRCPV mmxreg,mmxrm PENT,3DNOW,CYRIX
PFRSQRTV mmxreg,mmxrm PENT,3DNOW,CYRIX
B.1.23 Intel new instructions in ???
MOVBE reg16,mem16 NEHALEM
MOVBE reg32,mem32 NEHALEM
MOVBE reg64,mem64 NEHALEM
MOVBE mem16,reg16 NEHALEM
MOVBE mem32,reg32 NEHALEM
MOVBE mem64,reg64 NEHALEM
B.1.24 Intel AES instructions
AESENC xmmreg,xmmrm WESTMERE,SO
AESENCLAST xmmreg,xmmrm WESTMERE,SO
AESDEC xmmreg,xmmrm WESTMERE,SO
AESDECLAST xmmreg,xmmrm WESTMERE,SO
AESIMC xmmreg,xmmrm WESTMERE,SO
AESKEYGENASSIST xmmreg,xmmrm,imm WESTMERE,SO
B.1.25 Intel AVX AES instructions
VAESENC xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VAESENC xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VAESENCLAST xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VAESENCLAST xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VAESDEC xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VAESDEC xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VAESDECLAST xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VAESDECLAST xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VAESIMC xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VAESKEYGENASSIST xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
B.1.26 Intel AVX instructions
VADDPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VADDPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VADDPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VADDPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VADDPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
159
VADDPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VADDPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VADDPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VADDSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VADDSD xmmreg,xmmrm AVX,SANDYBRIDGE
VADDSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VADDSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VADDSUBPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VADDSUBPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VADDSUBPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VADDSUBPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VADDSUBPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VADDSUBPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VADDSUBPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VADDSUBPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VANDPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VANDPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VANDPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VANDPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VANDPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VANDPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VANDPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VANDPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VANDNPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VANDNPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VANDNPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VANDNPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VANDNPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VANDNPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VANDNPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VANDNPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VBLENDPD xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VBLENDPD xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VBLENDPD ymmreg,ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VBLENDPD ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VBLENDPS xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VBLENDPS xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VBLENDPS ymmreg,ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VBLENDPS ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VBLENDVPD xmmreg,xmmreg,xmmrm,xmmrm AVX,SANDYBRIDGE,SO
VBLENDVPD xmmreg,xmmrm,xmm0 AVX,SANDYBRIDGE,SO
VBLENDVPD ymmreg,ymmreg,ymmrm,ymmrm AVX,SANDYBRIDGE,SY
VBLENDVPD ymmreg,ymmrm,ymm0 AVX,SANDYBRIDGE,SY
VBLENDVPS xmmreg,xmmreg,xmmrm,xmmrm AVX,SANDYBRIDGE,SO
VBLENDVPS xmmreg,xmmrm,xmm0 AVX,SANDYBRIDGE,SO
VBLENDVPS ymmreg,ymmreg,ymmrm,ymmrm AVX,SANDYBRIDGE,SY
VBLENDVPD ymmreg,ymmrm,ymm0 AVX,SANDYBRIDGE,SY
VBROADCASTSS xmmreg,mem AVX,SANDYBRIDGE,SD
VBROADCASTSS ymmreg,mem AVX,SANDYBRIDGE,SD
VBROADCASTSD ymmreg,mem AVX,SANDYBRIDGE
VBROADCASTF128 ymmreg,mem AVX,SANDYBRIDGE,SO
VCMPEQPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
160
VCMPEQPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPEQPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLTPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLTPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLTPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLTPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLEPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLEPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLEPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLEPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPUNORDPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPUNORDPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPUNORDPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPUNORDPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLTPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLTPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLTPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLTPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLEPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLEPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLEPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLEPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPORDPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPORDPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPORDPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPORDPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPEQ_UQPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQ_UQPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQ_UQPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPEQ_UQPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGEPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGEPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGEPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGEPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGTPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGTPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGTPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGTPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPFALSEPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPFALSEPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPFALSEPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPFALSEPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQ_OQPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQ_OQPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQ_OQPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQ_OQPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGEPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGEPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGEPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
161
VCMPGEPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGTPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGTPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGTPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGTPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPTRUEPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPTRUEPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPTRUEPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPTRUEPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPEQ_OSPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQ_OSPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQ_OSPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPEQ_OSPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLT_OQPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLT_OQPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLT_OQPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLT_OQPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLE_OQPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLE_OQPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLE_OQPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLE_OQPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPUNORD_SPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPUNORD_SPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPUNORD_SPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPUNORD_SPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQ_USPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQ_USPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQ_USPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQ_USPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLT_UQPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLT_UQPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLT_UQPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLT_UQPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLE_UQPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLE_UQPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLE_UQPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLE_UQPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPORD_SPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPORD_SPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPORD_SPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPORS_SPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPEQ_USPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQ_USPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQ_USPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPEQ_USPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGE_UQPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGE_UQPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGE_UQPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGE_UQPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGT_UQPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGT_UQPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGT_UQPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGT_UQPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
162
VCMPFALSE_OSPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPFALSE_OSPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPFALSE_OSPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPFALSE_OSPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQ_OSPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQ_OSPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQ_OSPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQ_OSPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGE_OQPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGE_OQPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGE_OQPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGE_OQPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGT_OQPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGT_OQPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGT_OQPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGT_OQPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPTRUE_USPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPTRUE_USPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPTRUE_USPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPTRUE_USPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPPD xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VCMPPD xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VCMPPD ymmreg,ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VCMPPD ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VCMPEQPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPEQPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLTPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLTPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLTPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLTPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLEPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLEPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLEPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLEPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPUNORDPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPUNORDPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPUNORDPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPUNORDPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLTPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLTPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLTPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLTPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLEPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLEPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLEPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLEPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPORDPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
163
VCMPORDPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPORDPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPORDPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPEQ_UQPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQ_UQPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQ_UQPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPEQ_UQPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGEPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGEPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGEPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGEPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGTPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGTPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGTPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGTPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPFALSEPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPFALSEPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPFALSEPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPFALSEPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQ_OQPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQ_OQPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQ_OQPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQ_OQPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGEPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGEPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGEPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGEPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGTPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGTPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGTPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGTPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPTRUEPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPTRUEPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPTRUEPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPTRUEPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPEQ_OSPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQ_OSPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQ_OSPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPEQ_OSPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLT_OQPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLT_OQPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLT_OQPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLT_OQPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLE_OQPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLE_OQPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPLE_OQPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPLE_OQPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPUNORD_SPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPUNORD_SPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPUNORD_SPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPUNORD_SPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQ_USPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQ_USPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
164
VCMPNEQ_USPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQ_USPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLT_UQPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLT_UQPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLT_UQPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLT_UQPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLE_UQPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLE_UQPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNLE_UQPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNLE_UQPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPORD_SPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPORD_SPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPORD_SPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPORS_SPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPEQ_USPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQ_USPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPEQ_USPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPEQ_USPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGE_UQPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGE_UQPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGE_UQPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGE_UQPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGT_UQPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGT_UQPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNGT_UQPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNGT_UQPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPFALSE_OSPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPFALSE_OSPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPFALSE_OSPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPFALSE_OSPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQ_OSPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQ_OSPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPNEQ_OSPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPNEQ_OSPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGE_OQPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGE_OQPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGE_OQPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGE_OQPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGT_OQPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGT_OQPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPGT_OQPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPGT_OQPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPTRUE_USPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPTRUE_USPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCMPTRUE_USPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPTRUE_USPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCMPPS xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VCMPPS xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VCMPPS ymmreg,ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VCMPPS ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VCMPEQSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPEQSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPLTSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
165
VCMPLTSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPLESD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPLESD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPUNORDSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPUNORDSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNEQSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNEQSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNLTSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNLTSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNLESD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNLESD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPORDSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPORDSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPEQ_UQSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPEQ_UQSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNGESD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNGESD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNGTSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNGTSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPFALSESD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPFALSESD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNEQ_OQSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNEQ_OQSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPGESD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPGESD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPGTSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPGTSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPTRUESD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPTRUESD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPEQ_OSSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPEQ_OSSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPLT_OQSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPLT_OQSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPLE_OQSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPLE_OQSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPUNORD_SSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPUNORD_SSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNEQ_USSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNEQ_USSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNLT_UQSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNLT_UQSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNLE_UQSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNLE_UQSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPORD_SSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPORD_SSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPEQ_USSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPEQ_USSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNGE_UQSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNGE_UQSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNGT_UQSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNGT_UQSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPFALSE_OSSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPFALSE_OSSD xmmreg,xmmrm AVX,SANDYBRIDGE
166
VCMPNEQ_OSSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPNEQ_OSSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPGE_OQSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPGE_OQSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPGT_OQSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPGT_OQSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPTRUE_USSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPTRUE_USSD xmmreg,xmmrm AVX,SANDYBRIDGE
VCMPSD xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE
VCMPSD xmmreg,xmmrm,imm AVX,SANDYBRIDGE
VCMPEQSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPEQSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPLTSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPLTSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPLESS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPLESS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPUNORDSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPUNORDSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNEQSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNEQSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNLTSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNLTSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNLESS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNLESS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPORDSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPORDSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPEQ_UQSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPEQ_UQSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNGESS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNGESS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNGTSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNGTSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPFALSESS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPFALSESS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNEQ_OQSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNEQ_OQSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPGESS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPGESS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPGTSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPGTSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPTRUESS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPTRUESS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPEQ_OSSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPEQ_OSSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPLT_OQSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPLT_OQSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPLE_OQSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPLE_OQSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPUNORD_SSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPUNORD_SSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNEQ_USSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNEQ_USSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNLT_UQSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
167
VCMPNLT_UQSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNLE_UQSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNLE_UQSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPORD_SSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPORD_SSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPEQ_USSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPEQ_USSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNGE_UQSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNGE_UQSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNGT_UQSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNGT_UQSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPFALSE_OSSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPFALSE_OSSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNEQ_OSSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPNEQ_OSSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPGE_OQSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPGE_OQSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPGT_OQSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPGT_OQSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPTRUE_USSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPTRUE_USSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCMPSS xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SD
VCMPSS xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SD
VCOMISD xmmreg,xmmrm AVX,SANDYBRIDGE
VCOMISS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCVTDQ2PD xmmreg,xmmrm AVX,SANDYBRIDGE
VCVTDQ2PD ymmreg,xmmrm AVX,SANDYBRIDGE,SO
VCVTDQ2PS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCVTDQ2PS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCVTPD2DQ xmmreg,xmmreg AVX,SANDYBRIDGE
VCVTPD2DQ xmmreg,mem128 AVX,SANDYBRIDGE
VCVTPD2DQ xmmreg,ymmreg AVX,SANDYBRIDGE
VCVTPD2DQ xmmreg,mem256 AVX,SANDYBRIDGE
VCVTPD2PS xmmreg,xmmreg AVX,SANDYBRIDGE
VCVTPD2PS xmmreg,mem128 AVX,SANDYBRIDGE
VCVTPD2PS xmmreg,ymmreg AVX,SANDYBRIDGE
VCVTPD2PS xmmreg,mem256 AVX,SANDYBRIDGE
VCVTPS2DQ xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCVTPS2DQ ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCVTPS2PD xmmreg,xmmrm AVX,SANDYBRIDGE
VCVTPS2PD ymmreg,xmmrm AVX,SANDYBRIDGE,SO
VCVTSD2SI reg32,xmmrm AVX,SANDYBRIDGE
VCVTSD2SI reg64,xmmrm AVX,SANDYBRIDGE,LONG
VCVTSD2SS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VCVTSD2SS xmmreg,xmmrm AVX,SANDYBRIDGE
VCVTSI2SD xmmreg,xmmreg,rm32 AVX,SANDYBRIDGE
VCVTSI2SD xmmreg,rm32 AVX,SANDYBRIDGE
VCVTSI2SD xmmreg,xmmreg,mem AVX,SANDYBRIDGE,SD,ND
VCVTSI2SD xmmreg,mem AVX,SANDYBRIDGE,SD,ND
VCVTSI2SD xmmreg,xmmreg,rm64 AVX,SANDYBRIDGE,LONG
VCVTSI2SD xmmreg,rm64 AVX,SANDYBRIDGE,LONG
VCVTSI2SS xmmreg,xmmreg,rm32 AVX,SANDYBRIDGE
VCVTSI2SS xmmreg,rm32 AVX,SANDYBRIDGE
168
VCVTSI2SS xmmreg,xmmreg,mem AVX,SANDYBRIDGE,SD,ND
VCVTSI2SS xmmreg,mem AVX,SANDYBRIDGE,SD,ND
VCVTSI2SS xmmreg,xmmreg,rm64 AVX,SANDYBRIDGE,LONG
VCVTSI2SS xmmreg,rm64 AVX,SANDYBRIDGE,LONG
VCVTSS2SD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCVTSS2SD xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VCVTSS2SI reg32,xmmrm AVX,SANDYBRIDGE,SD
VCVTSS2SI reg64,xmmrm AVX,SANDYBRIDGE,SD,LONG
VCVTTPD2DQ xmmreg,xmmreg AVX,SANDYBRIDGE
VCVTTPD2DQ xmmreg,mem128 AVX,SANDYBRIDGE
VCVTTPD2DQ xmmreg,ymmreg AVX,SANDYBRIDGE
VCVTTPD2DQ xmmreg,mem256 AVX,SANDYBRIDGE
VCVTTPS2DQ xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VCVTTPS2DQ ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VCVTTSD2SI reg32,xmmrm AVX,SANDYBRIDGE
VCVTTSD2SI reg64,xmmrm AVX,SANDYBRIDGE,LONG
VCVTTSS2SI reg32,xmmrm AVX,SANDYBRIDGE,SD
VCVTTSS2SI reg64,xmmrm AVX,SANDYBRIDGE,SD,LONG
VDIVPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VDIVPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VDIVPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VDIVPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VDIVPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VDIVPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VDIVPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VDIVPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VDIVSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VDIVSD xmmreg,xmmrm AVX,SANDYBRIDGE
VDIVSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VDIVSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VDPPD xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VDPPD xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VDPPS xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VDPPS xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VDPPS ymmreg,ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VDPPS ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VEXTRACTF128 xmmrm,xmmreg,imm AVX,SANDYBRIDGE,SO
VEXTRACTPS rm32,xmmreg,imm AVX,SANDYBRIDGE,SD
VHADDPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VHADDPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VHADDPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VHADDPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VHADDPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VHADDPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VHADDPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VHADDPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VHSUBPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VHSUBPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VHSUBPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VHSUBPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VHSUBPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VHSUBPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VHSUBPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
169
VHSUBPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VINSERTF128 ymmreg,ymmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VINSERTPS xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SD
VINSERTPS xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SD
VLDDQU xmmreg,mem AVX,SANDYBRIDGE,SO
VLDQQU ymmreg,mem AVX,SANDYBRIDGE,SY
VLDDQU ymmreg,mem AVX,SANDYBRIDGE,SY
VLDMXCSR mem32 AVX,SANDYBRIDGE,SD
VMASKMOVDQU xmmreg,xmmreg AVX,SANDYBRIDGE
VMASKMOVPS xmmreg,xmmreg,mem AVX,SANDYBRIDGE,SO
VMASKMOVPS ymmreg,ymmreg,mem AVX,SANDYBRIDGE,SY
VMASKMOVPS mem,xmmreg,xmmreg AVX,SANDYBRIDGE,SO
VMASKMOVPS mem,xmmreg,xmmreg AVX,SANDYBRIDGE,SY
VMASKMOVPD xmmreg,xmmreg,mem AVX,SANDYBRIDGE,SO
VMASKMOVPD ymmreg,ymmreg,mem AVX,SANDYBRIDGE,SY
VMASKMOVPD mem,xmmreg,xmmreg AVX,SANDYBRIDGE,SO
VMASKMOVPD mem,ymmreg,ymmreg AVX,SANDYBRIDGE,SY
VMAXPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMAXPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMAXPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMAXPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMAXPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMAXPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMAXPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMAXPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMAXSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VMAXSD xmmreg,xmmrm AVX,SANDYBRIDGE
VMAXSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VMAXSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VMINPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMINPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMINPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMINPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMINPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMINPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMINPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMINPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMINSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VMINSD xmmreg,xmmrm AVX,SANDYBRIDGE
VMINSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VMINSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VMOVAPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMOVAPD xmmrm,xmmreg AVX,SANDYBRIDGE,SO
VMOVAPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMOVAPD ymmrm,ymmreg AVX,SANDYBRIDGE,SY
VMOVAPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMOVAPS xmmrm,xmmreg AVX,SANDYBRIDGE,SO
VMOVAPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMOVAPS ymmrm,ymmreg AVX,SANDYBRIDGE,SY
VMOVQ xmmreg,xmmrm AVX,SANDYBRIDGE
VMOVQ xmmrm,xmmreg AVX,SANDYBRIDGE
VMOVD xmmreg,rm32 AVX,SANDYBRIDGE,SD
VMOVQ xmmreg,rm64 AVX,SANDYBRIDGE,LONG
170
VMOVD rm32,xmmreg AVX,SANDYBRIDGE,SD
VMOVQ rm64,xmmreg AVX,SANDYBRIDGE,LONG
VMOVDDUP xmmreg,xmmrm AVX,SANDYBRIDGE
VMOVDDUP ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMOVDQA xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMOVDQA xmmrm,xmmreg AVX,SANDYBRIDGE,SO
VMOVQQA ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMOVQQA ymmrm,ymmreg AVX,SANDYBRIDGE,SY
VMOVDQA ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMOVDQA ymmrm,ymmreg AVX,SANDYBRIDGE,SY
VMOVDQU xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMOVDQU xmmrm,xmmreg AVX,SANDYBRIDGE,SO
VMOVQQU ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMOVQQU ymmrm,ymmreg AVX,SANDYBRIDGE,SY
VMOVDQU ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMOVDQU ymmrm,ymmreg AVX,SANDYBRIDGE,SY
VMOVHLPS xmmreg,xmmreg,xmmreg AVX,SANDYBRIDGE
VMOVHLPS xmmreg,xmmreg AVX,SANDYBRIDGE
VMOVHPD xmmreg,xmmreg,mem AVX,SANDYBRIDGE
VMOVHPD xmmreg,mem AVX,SANDYBRIDGE
VMOVHPD mem,xmmreg AVX,SANDYBRIDGE
VMOVHPS xmmreg,xmmreg,mem AVX,SANDYBRIDGE
VMOVHPS xmmreg,mem AVX,SANDYBRIDGE
VMOVHPS mem,xmmreg AVX,SANDYBRIDGE
VMOVLHPS xmmreg,xmmreg,xmmreg AVX,SANDYBRIDGE
VMOVLHPS xmmreg,xmmreg AVX,SANDYBRIDGE
VMOVLPD xmmreg,xmmreg,mem AVX,SANDYBRIDGE
VMOVLPD xmmreg,mem AVX,SANDYBRIDGE
VMOVLPD mem,xmmreg AVX,SANDYBRIDGE
VMOVLPS xmmreg,xmmreg,mem AVX,SANDYBRIDGE
VMOVLPS xmmreg,mem AVX,SANDYBRIDGE
VMOVLPS mem,xmmreg AVX,SANDYBRIDGE
VMOVMSKPD reg64,xmmreg AVX,SANDYBRIDGE,LONG
VMOVMSKPD reg32,xmmreg AVX,SANDYBRIDGE
VMOVMSKPD reg64,ymmreg AVX,SANDYBRIDGE,LONG
VMOVMSKPD reg32,ymmreg AVX,SANDYBRIDGE
VMOVMSKPS reg64,xmmreg AVX,SANDYBRIDGE,LONG
VMOVMSKPS reg32,xmmreg AVX,SANDYBRIDGE
VMOVMSKPS reg64,ymmreg AVX,SANDYBRIDGE,LONG
VMOVMSKPS reg32,ymmreg AVX,SANDYBRIDGE
VMOVNTDQ mem,xmmreg AVX,SANDYBRIDGE,SO
VMOVNTQQ mem,ymmreg AVX,SANDYBRIDGE,SY
VMOVNTDQ mem,ymmreg AVX,SANDYBRIDGE,SY
VMOVNTDQA xmmreg,mem AVX,SANDYBRIDGE,SO
VMOVNTPD mem,xmmreg AVX,SANDYBRIDGE,SO
VMOVNTPD mem,ymmreg AVX,SANDYBRIDGE,SY
VMOVNTPS mem,xmmreg AVX,SANDYBRIDGE,SO
VMOVNTPS mem,ymmreg AVX,SANDYBRIDGE,SO
VMOVSD xmmreg,xmmreg,xmmreg AVX,SANDYBRIDGE
VMOVSD xmmreg,xmmreg AVX,SANDYBRIDGE
VMOVSD xmmreg,mem AVX,SANDYBRIDGE
VMOVSD xmmreg,xmmreg,xmmreg AVX,SANDYBRIDGE
VMOVSD xmmreg,xmmreg AVX,SANDYBRIDGE
171
VMOVSD mem,xmmreg AVX,SANDYBRIDGE
VMOVSHDUP xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMOVSHDUP ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMOVSLDUP xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMOVSLDUP ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMOVSS xmmreg,xmmreg,xmmreg AVX,SANDYBRIDGE
VMOVSS xmmreg,xmmreg AVX,SANDYBRIDGE
VMOVSS xmmreg,mem AVX,SANDYBRIDGE
VMOVSS xmmreg,xmmreg,xmmreg AVX,SANDYBRIDGE
VMOVSS xmmreg,xmmreg AVX,SANDYBRIDGE
VMOVSS mem,xmmreg AVX,SANDYBRIDGE
VMOVUPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMOVUPD xmmrm,xmmreg AVX,SANDYBRIDGE,SO
VMOVUPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMOVUPD ymmrm,ymmreg AVX,SANDYBRIDGE,SY
VMOVUPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMOVUPS xmmrm,xmmreg AVX,SANDYBRIDGE,SO
VMOVUPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMOVUPS ymmrm,ymmreg AVX,SANDYBRIDGE,SY
VMPSADBW xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VMPSADBW xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VMULPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMULPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMULPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMULPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMULPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMULPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VMULPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMULPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VMULSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VMULSD xmmreg,xmmrm AVX,SANDYBRIDGE
VMULSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VMULSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VORPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VORPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VORPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VORPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VORPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VORPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VORPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VORPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VPABSB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPABSW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPABSD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPACKSSWB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPACKSSWB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPACKSSDW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPACKSSDW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPACKUSWB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPACKUSWB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPACKUSDW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPACKUSDW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
172
VPADDB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDQ xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDQ xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDSB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDSB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDSW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDSW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDUSB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDUSB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDUSW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPADDUSW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPALIGNR xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPALIGNR xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPAND xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPAND xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPANDN xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPANDN xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPAVGB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPAVGB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPAVGW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPAVGW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPBLENDVB xmmreg,xmmreg,xmmrm,xmmreg AVX,SANDYBRIDGE,SO
VPBLENDVB xmmreg,xmmrm,xmmreg AVX,SANDYBRIDGE,SO
VPBLENDW xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPBLENDW xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPCMPESTRI xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPCMPESTRM xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPCMPISTRI xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPCMPISTRM xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPCMPEQB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPEQB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPEQW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPEQW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPEQD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPEQD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPEQQ xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPEQQ xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPGTB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPGTB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPGTW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPGTW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPGTD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPGTD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPGTQ xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPCMPGTQ xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPERMILPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPERMILPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VPERMILPD xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPERMILPD ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
173
VPERMILTD2PD xmmreg,xmmreg,xmmrm,xmmreg AVX,SANDYBRIDGE,SO
VPERMILTD2PD xmmreg,xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPERMILTD2PD ymmreg,ymmreg,ymmrm,ymmreg AVX,SANDYBRIDGE,SY
VPERMILTD2PD ymmreg,ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VPERMILMO2PD xmmreg,xmmreg,xmmrm,xmmreg AVX,SANDYBRIDGE,SO
VPERMILMO2PD xmmreg,xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPERMILMO2PD ymmreg,ymmreg,ymmrm,ymmreg AVX,SANDYBRIDGE,SY
VPERMILMO2PD ymmreg,ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VPERMILMZ2PD xmmreg,xmmreg,xmmrm,xmmreg AVX,SANDYBRIDGE,SO
VPERMILMZ2PD xmmreg,xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPERMILMZ2PD ymmreg,ymmreg,ymmrm,ymmreg AVX,SANDYBRIDGE,SY
VPERMILMZ2PD ymmreg,ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VPERMIL2PD xmmreg,xmmreg,xmmrm,xmmreg,imm AVX,SANDYBRIDGE,SO
VPERMIL2PD xmmreg,xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPERMIL2PD ymmreg,ymmreg,ymmrm,ymmreg,imm AVX,SANDYBRIDGE,SY
VPERMIL2PD ymmreg,ymmreg,ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VPERMILPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPERMILPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VPERMILPS xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPERMILPS ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VPERMILTD2PS xmmreg,xmmreg,xmmrm,xmmreg AVX,SANDYBRIDGE,SO
VPERMILTD2PS xmmreg,xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPERMILTD2PS ymmreg,ymmreg,ymmrm,ymmreg AVX,SANDYBRIDGE,SY
VPERMILTD2PS ymmreg,ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VPERMILMO2PS xmmreg,xmmreg,xmmrm,xmmreg AVX,SANDYBRIDGE,SO
VPERMILMO2PS xmmreg,xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPERMILMO2PS ymmreg,ymmreg,ymmrm,ymmreg AVX,SANDYBRIDGE,SY
VPERMILMO2PS ymmreg,ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VPERMILMZ2PS xmmreg,xmmreg,xmmrm,xmmreg AVX,SANDYBRIDGE,SO
VPERMILMZ2PS xmmreg,xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPERMILMZ2PS ymmreg,ymmreg,ymmrm,ymmreg AVX,SANDYBRIDGE,SY
VPERMILMZ2PS ymmreg,ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VPERMIL2PS xmmreg,xmmreg,xmmrm,xmmreg,imm AVX,SANDYBRIDGE,SO
VPERMIL2PS xmmreg,xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPERMIL2PS ymmreg,ymmreg,ymmrm,ymmreg,imm AVX,SANDYBRIDGE,SY
VPERMIL2PS ymmreg,ymmreg,ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VPERM2F128 ymmreg,ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VPEXTRB reg64,xmmreg,imm AVX,SANDYBRIDGE,LONG
VPEXTRB reg32,xmmreg,imm AVX,SANDYBRIDGE
VPEXTRB mem,xmmreg,imm AVX,SANDYBRIDGE
VPEXTRW reg64,xmmreg,imm AVX,SANDYBRIDGE,LONG
VPEXTRW reg32,xmmreg,imm AVX,SANDYBRIDGE
VPEXTRW mem,xmmreg,imm AVX,SANDYBRIDGE,SW
VPEXTRW reg64,xmmreg,imm AVX,SANDYBRIDGE,LONG
VPEXTRW reg32,xmmreg,imm AVX,SANDYBRIDGE
VPEXTRW mem,xmmreg,imm AVX,SANDYBRIDGE,SW
VPEXTRD reg64,xmmreg,imm AVX,SANDYBRIDGE,LONG
VPEXTRD rm32,xmmreg,imm AVX,SANDYBRIDGE,SD
VPEXTRQ rm64,xmmreg,imm AVX,SANDYBRIDGE,LONG
VPHADDW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPHADDW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPHADDD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPHADDD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
174
VPHADDSW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPHADDSW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPHMINPOSUW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPHSUBW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPHSUBW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPHSUBD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPHSUBD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPHSUBSW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPHSUBSW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPINSRB xmmreg,xmmreg,reg32,imm AVX,SANDYBRIDGE
VPINSRB xmmreg,reg32,imm AVX,SANDYBRIDGE
VPINSRB xmmreg,xmmreg,mem,imm AVX,SANDYBRIDGE
VPINSRB xmmreg,reg32,mem,imm AVX,SANDYBRIDGE
VPINSRW xmmreg,xmmreg,reg32,imm AVX,SANDYBRIDGE
VPINSRW xmmreg,reg32,imm AVX,SANDYBRIDGE
VPINSRW xmmreg,xmmreg,mem,imm AVX,SANDYBRIDGE,SW
VPINSRW xmmreg,reg32,mem,imm AVX,SANDYBRIDGE,SW
VPINSRD xmmreg,xmmreg,rm32,imm AVX,SANDYBRIDGE,SD
VPINSRD xmmreg,rm32,imm AVX,SANDYBRIDGE,SD
VPINSRQ xmmreg,xmmreg,rm64,imm AVX,SANDYBRIDGE,LONG
VPINSRQ xmmreg,rm64,imm AVX,SANDYBRIDGE,SD,LONG
VPMADDWD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMADDWD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMADDUBSW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMADDUBSW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMAXSB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMAXSB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMAXSW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMAXSW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMAXSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMAXSD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMAXUB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMAXUB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMAXUW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMAXUW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMAXUD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMAXUD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMINSB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMINSB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMINSW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMINSW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMINSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMINSD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMINUB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMINUB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMINUW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMINUW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMINUD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMINUD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMOVMSKB reg64,xmmreg AVX,SANDYBRIDGE,LONG
VPMOVMSKB reg32,xmmreg AVX,SANDYBRIDGE
VPMOVSXBW xmmreg,xmmrm AVX,SANDYBRIDGE
VPMOVSXBD xmmreg,xmmrm AVX,SANDYBRIDGE,SD
175
VPMOVSXBQ xmmreg,xmmrm AVX,SANDYBRIDGE,SW
VPMOVSXWD xmmreg,xmmrm AVX,SANDYBRIDGE
VPMOVSXWQ xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VPMOVSXDQ xmmreg,xmmrm AVX,SANDYBRIDGE
VPMOVZXBW xmmreg,xmmrm AVX,SANDYBRIDGE
VPMOVZXBD xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VPMOVZXBQ xmmreg,xmmrm AVX,SANDYBRIDGE,SW
VPMOVZXWD xmmreg,xmmrm AVX,SANDYBRIDGE
VPMOVZXWQ xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VPMOVZXDQ xmmreg,xmmrm AVX,SANDYBRIDGE
VPMULHUW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMULHUW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMULHRSW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMULHRSW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMULHW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMULHW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMULLW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMULLW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMULLD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMULLD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMULUDQ xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMULUDQ xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMULDQ xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPMULDQ xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPOR xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPOR xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSADBW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSADBW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSHUFB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSHUFB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSHUFD xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPSHUFHW xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPSHUFLW xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VPSIGNB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSIGNB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSIGNW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSIGNW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSIGND xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSIGND xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSLLDQ xmmreg,xmmreg,imm AVX,SANDYBRIDGE
VPSLLDQ xmmreg,imm AVX,SANDYBRIDGE
VPSRLDQ xmmreg,xmmreg,imm AVX,SANDYBRIDGE
VPSRLDQ xmmreg,imm AVX,SANDYBRIDGE
VPSLLW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSLLW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSLLW xmmreg,xmmreg,imm AVX,SANDYBRIDGE
VPSLLW xmmreg,imm AVX,SANDYBRIDGE
VPSLLD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSLLD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSLLD xmmreg,xmmreg,imm AVX,SANDYBRIDGE
VPSLLD xmmreg,imm AVX,SANDYBRIDGE
VPSLLQ xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSLLQ xmmreg,xmmrm AVX,SANDYBRIDGE,SO
176
VPSLLQ xmmreg,xmmreg,imm AVX,SANDYBRIDGE
VPSLLQ xmmreg,imm AVX,SANDYBRIDGE
VPSRAW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSRAW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSRAW xmmreg,xmmreg,imm AVX,SANDYBRIDGE
VPSRAW xmmreg,imm AVX,SANDYBRIDGE
VPSRAD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSRAD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSRAD xmmreg,xmmreg,imm AVX,SANDYBRIDGE
VPSRAD xmmreg,imm AVX,SANDYBRIDGE
VPSRLW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSRLW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSRLW xmmreg,xmmreg,imm AVX,SANDYBRIDGE
VPSRLW xmmreg,imm AVX,SANDYBRIDGE
VPSRLD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSRLD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSRLD xmmreg,xmmreg,imm AVX,SANDYBRIDGE
VPSRLD xmmreg,imm AVX,SANDYBRIDGE
VPSRLQ xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSRLQ xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSRLQ xmmreg,xmmreg,imm AVX,SANDYBRIDGE
VPSRLQ xmmreg,imm AVX,SANDYBRIDGE
VPTEST xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPTEST ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VPSUBB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBQ xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBQ xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBSB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBSB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBSW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBSW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBUSB xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBUSB xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBUSW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPSUBUSW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKHBW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKHBW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKHWD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKHWD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKHDQ xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKHDQ xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKHQDQ xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKHQDQ xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKLBW xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKLBW xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKLWD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKLWD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKLDQ xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
177
VPUNPCKLDQ xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKLQDQ xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPUNPCKLQDQ xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPXOR xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VPXOR xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VRCPPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VRCPPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VRCPSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VRCPSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VRSQRTPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VRSQRTPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VRSQRTSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VRSQRTSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VROUNDPD xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VROUNDPD ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VROUNDPS xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VROUNDPS ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VROUNDSD xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE
VROUNDSD xmmreg,xmmrm,imm AVX,SANDYBRIDGE
VROUNDSS xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SD
VROUNDSS xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SD
VSHUFPD xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VSHUFPD xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VSHUFPD ymmreg,ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VSHUFPD ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VSHUFPS xmmreg,xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VSHUFPS xmmreg,xmmrm,imm AVX,SANDYBRIDGE,SO
VSHUFPS ymmreg,ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VSHUFPS ymmreg,ymmrm,imm AVX,SANDYBRIDGE,SY
VSQRTPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VSQRTPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VSQRTPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VSQRTPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VSQRTSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VSQRTSD xmmreg,xmmrm AVX,SANDYBRIDGE
VSQRTSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VSQRTSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VSTMXCSR mem AVX,SANDYBRIDGE,SD
VSUBPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VSUBPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VSUBPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VSUBPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VSUBPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VSUBPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VSUBPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VSUBPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VSUBSD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE
VSUBSD xmmreg,xmmrm AVX,SANDYBRIDGE
VSUBSS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VSUBSS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VTESTPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VTESTPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VTESTPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
178
VTESTPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VUCOMISD xmmreg,xmmrm AVX,SANDYBRIDGE
VUCOMISS xmmreg,xmmrm AVX,SANDYBRIDGE,SD
VUNPCKHPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VUNPCKHPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VUNPCKHPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VUNPCKHPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VUNPCKHPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VUNPCKHPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VUNPCKHPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VUNPCKHPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VUNPCKLPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VUNPCKLPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VUNPCKLPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VUNPCKLPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VUNPCKLPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VUNPCKLPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VUNPCKLPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VUNPCKLPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VXORPD xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VXORPD xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VXORPD ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VXORPD ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VXORPS xmmreg,xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VXORPS xmmreg,xmmrm AVX,SANDYBRIDGE,SO
VXORPS ymmreg,ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VXORPS ymmreg,ymmrm AVX,SANDYBRIDGE,SY
VZEROALL AVX,SANDYBRIDGE
VZEROUPPER AVX,SANDYBRIDGE
B.1.27 Intel Carry−Less Multiplication instructions (CLMUL)
PCLMULLQLQDQ xmmreg,xmmrm SSE,SANDYBRIDGE,SO
PCLMULHQLQDQ xmmreg,xmmrm SSE,SANDYBRIDGE,SO
PCLMULLQHQDQ xmmreg,xmmrm SSE,SANDYBRIDGE,SO
PCLMULHQHQDQ xmmreg,xmmrm SSE,SANDYBRIDGE,SO
PCLMULQDQ xmmreg,xmmrm,imm SSE,SANDYBRIDGE,SO
B.1.28 Intel Fused Multiply−Add instructions (FMA)
VFMADDPD xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SO
VFMADDPD xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SO
VFMADDPD ymmreg,ymmreg,ymmrm,ymmreg FMA,SANDYBRIDGE,SY
VFMADDPD ymmreg,ymmreg,ymmreg,ymmrm FMA,SANDYBRIDGE,SY
VFMADDPS xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SO
VFMADDPS xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SO
VFMADDPS ymmreg,ymmreg,ymmrm,ymmreg FMA,SANDYBRIDGE,SY
VFMADDPS ymmreg,ymmreg,ymmreg,ymmrm FMA,SANDYBRIDGE,SY
VFMADDSD xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE
VFMADDSD xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE
VFMADDSS xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SD
VFMADDSS xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SD
VFMADDSUBPD xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SO
VFMADDSUBPD xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SO
VFMADDSUBPD ymmreg,ymmreg,ymmrm,ymmreg FMA,SANDYBRIDGE,SY
179
VFMADDSUBPD ymmreg,ymmreg,ymmreg,ymmrm FMA,SANDYBRIDGE,SY
VFMADDSUBPS xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SO
VFMADDSUBPS xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SO
VFMADDSUBPS ymmreg,ymmreg,ymmrm,ymmreg FMA,SANDYBRIDGE,SY
VFMADDSUBPS ymmreg,ymmreg,ymmreg,ymmrm FMA,SANDYBRIDGE,SY
VFMSUBADDPD xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SO
VFMSUBADDPD xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SO
VFMSUBADDPD ymmreg,ymmreg,ymmrm,ymmreg FMA,SANDYBRIDGE,SY
VFMSUBADDPD ymmreg,ymmreg,ymmreg,ymmrm FMA,SANDYBRIDGE,SY
VFMSUBADDPS xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SO
VFMSUBADDPS xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SO
VFMSUBADDPS ymmreg,ymmreg,ymmrm,ymmreg FMA,SANDYBRIDGE,SY
VFMSUBADDPS ymmreg,ymmreg,ymmreg,ymmrm FMA,SANDYBRIDGE,SY
VFMSUBPD xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SO
VFMSUBPD xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SO
VFMSUBPD ymmreg,ymmreg,ymmrm,ymmreg FMA,SANDYBRIDGE,SY
VFMSUBPD ymmreg,ymmreg,ymmreg,ymmrm FMA,SANDYBRIDGE,SY
VFMSUBPS xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SO
VFMSUBPS xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SO
VFMSUBPS ymmreg,ymmreg,ymmrm,ymmreg FMA,SANDYBRIDGE,SY
VFMSUBPS ymmreg,ymmreg,ymmreg,ymmrm FMA,SANDYBRIDGE,SY
VFMSUBSD xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE
VFMSUBSD xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE
VFMSUBSS xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SD
VFMSUBSS xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SD
VFNMADDPD xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SO
VFNMADDPD xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SO
VFNMADDPD xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SY
VFNMADDPD xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SY
VFNMADDPS xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SO
VFNMADDPS xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SO
VFNMADDPS xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SY
VFNMADDPS xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SY
VFNMADDSD xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE
VFNMADDSD xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE
VFNMADDSS xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SD
VFNMADDSS xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SD
VFNMSUBPD xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SO
VFNMSUBPD xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SO
VFNMSUBPD xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SY
VFNMSUBPD xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SY
VFNMSUBPS xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SO
VFNMSUBPS xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SO
VFNMSUBPS xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SY
VFNMSUBPS xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SY
VFNMSUBSD xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE
VFNMSUBSD xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE
VFNMSUBSS xmmreg,xmmreg,xmmrm,xmmreg FMA,SANDYBRIDGE,SD
VFNMSUBSS xmmreg,xmmreg,xmmreg,xmmrm FMA,SANDYBRIDGE,SD
B.1.29 VIA (Centaur) security instructions
XSTORE PENT,CYRIX
XCRYPTECB PENT,CYRIX
180
XCRYPTCBC PENT,CYRIX
XCRYPTCTR PENT,CYRIX
XCRYPTCFB PENT,CYRIX
XCRYPTOFB PENT,CYRIX
MONTMUL PENT,CYRIX
XSHA1 PENT,CYRIX
XSHA256 PENT,CYRIX
B.1.30 Systematic names for the hinting nop instructions
HINT_NOP0 rm16 P6,UNDOC
HINT_NOP0 rm32 P6,UNDOC
HINT_NOP0 rm64 X64,UNDOC
HINT_NOP1 rm16 P6,UNDOC
HINT_NOP1 rm32 P6,UNDOC
HINT_NOP1 rm64 X64,UNDOC
HINT_NOP2 rm16 P6,UNDOC
HINT_NOP2 rm32 P6,UNDOC
HINT_NOP2 rm64 X64,UNDOC
HINT_NOP3 rm16 P6,UNDOC
HINT_NOP3 rm32 P6,UNDOC
HINT_NOP3 rm64 X64,UNDOC
HINT_NOP4 rm16 P6,UNDOC
HINT_NOP4 rm32 P6,UNDOC
HINT_NOP4 rm64 X64,UNDOC
HINT_NOP5 rm16 P6,UNDOC
HINT_NOP5 rm32 P6,UNDOC
HINT_NOP5 rm64 X64,UNDOC
HINT_NOP6 rm16 P6,UNDOC
HINT_NOP6 rm32 P6,UNDOC
HINT_NOP6 rm64 X64,UNDOC
HINT_NOP7 rm16 P6,UNDOC
HINT_NOP7 rm32 P6,UNDOC
HINT_NOP7 rm64 X64,UNDOC
HINT_NOP8 rm16 P6,UNDOC
HINT_NOP8 rm32 P6,UNDOC
HINT_NOP8 rm64 X64,UNDOC
HINT_NOP9 rm16 P6,UNDOC
HINT_NOP9 rm32 P6,UNDOC
HINT_NOP9 rm64 X64,UNDOC
HINT_NOP10 rm16 P6,UNDOC
HINT_NOP10 rm32 P6,UNDOC
HINT_NOP10 rm64 X64,UNDOC
HINT_NOP11 rm16 P6,UNDOC
HINT_NOP11 rm32 P6,UNDOC
HINT_NOP11 rm64 X64,UNDOC
HINT_NOP12 rm16 P6,UNDOC
HINT_NOP12 rm32 P6,UNDOC
HINT_NOP12 rm64 X64,UNDOC
HINT_NOP13 rm16 P6,UNDOC
HINT_NOP13 rm32 P6,UNDOC
HINT_NOP13 rm64 X64,UNDOC
HINT_NOP14 rm16 P6,UNDOC
HINT_NOP14 rm32 P6,UNDOC
181
HINT_NOP14 rm64 X64,UNDOC
HINT_NOP15 rm16 P6,UNDOC
HINT_NOP15 rm32 P6,UNDOC
HINT_NOP15 rm64 X64,UNDOC
HINT_NOP16 rm16 P6,UNDOC
HINT_NOP16 rm32 P6,UNDOC
HINT_NOP16 rm64 X64,UNDOC
HINT_NOP17 rm16 P6,UNDOC
HINT_NOP17 rm32 P6,UNDOC
HINT_NOP17 rm64 X64,UNDOC
HINT_NOP18 rm16 P6,UNDOC
HINT_NOP18 rm32 P6,UNDOC
HINT_NOP18 rm64 X64,UNDOC
HINT_NOP19 rm16 P6,UNDOC
HINT_NOP19 rm32 P6,UNDOC
HINT_NOP19 rm64 X64,UNDOC
HINT_NOP20 rm16 P6,UNDOC
HINT_NOP20 rm32 P6,UNDOC
HINT_NOP20 rm64 X64,UNDOC
HINT_NOP21 rm16 P6,UNDOC
HINT_NOP21 rm32 P6,UNDOC
HINT_NOP21 rm64 X64,UNDOC
HINT_NOP22 rm16 P6,UNDOC
HINT_NOP22 rm32 P6,UNDOC
HINT_NOP22 rm64 X64,UNDOC
HINT_NOP23 rm16 P6,UNDOC
HINT_NOP23 rm32 P6,UNDOC
HINT_NOP23 rm64 X64,UNDOC
HINT_NOP24 rm16 P6,UNDOC
HINT_NOP24 rm32 P6,UNDOC
HINT_NOP24 rm64 X64,UNDOC
HINT_NOP25 rm16 P6,UNDOC
HINT_NOP25 rm32 P6,UNDOC
HINT_NOP25 rm64 X64,UNDOC
HINT_NOP26 rm16 P6,UNDOC
HINT_NOP26 rm32 P6,UNDOC
HINT_NOP26 rm64 X64,UNDOC
HINT_NOP27 rm16 P6,UNDOC
HINT_NOP27 rm32 P6,UNDOC
HINT_NOP27 rm64 X64,UNDOC
HINT_NOP28 rm16 P6,UNDOC
HINT_NOP28 rm32 P6,UNDOC
HINT_NOP28 rm64 X64,UNDOC
HINT_NOP29 rm16 P6,UNDOC
HINT_NOP29 rm32 P6,UNDOC
HINT_NOP29 rm64 X64,UNDOC
HINT_NOP30 rm16 P6,UNDOC
HINT_NOP30 rm32 P6,UNDOC
HINT_NOP30 rm64 X64,UNDOC
HINT_NOP31 rm16 P6,UNDOC
HINT_NOP31 rm32 P6,UNDOC
HINT_NOP31 rm64 X64,UNDOC
HINT_NOP32 rm16 P6,UNDOC
182
HINT_NOP32 rm32 P6,UNDOC
HINT_NOP32 rm64 X64,UNDOC
HINT_NOP33 rm16 P6,UNDOC
HINT_NOP33 rm32 P6,UNDOC
HINT_NOP33 rm64 X64,UNDOC
HINT_NOP34 rm16 P6,UNDOC
HINT_NOP34 rm32 P6,UNDOC
HINT_NOP34 rm64 X64,UNDOC
HINT_NOP35 rm16 P6,UNDOC
HINT_NOP35 rm32 P6,UNDOC
HINT_NOP35 rm64 X64,UNDOC
HINT_NOP36 rm16 P6,UNDOC
HINT_NOP36 rm32 P6,UNDOC
HINT_NOP36 rm64 X64,UNDOC
HINT_NOP37 rm16 P6,UNDOC
HINT_NOP37 rm32 P6,UNDOC
HINT_NOP37 rm64 X64,UNDOC
HINT_NOP38 rm16 P6,UNDOC
HINT_NOP38 rm32 P6,UNDOC
HINT_NOP38 rm64 X64,UNDOC
HINT_NOP39 rm16 P6,UNDOC
HINT_NOP39 rm32 P6,UNDOC
HINT_NOP39 rm64 X64,UNDOC
HINT_NOP40 rm16 P6,UNDOC
HINT_NOP40 rm32 P6,UNDOC
HINT_NOP40 rm64 X64,UNDOC
HINT_NOP41 rm16 P6,UNDOC
HINT_NOP41 rm32 P6,UNDOC
HINT_NOP41 rm64 X64,UNDOC
HINT_NOP42 rm16 P6,UNDOC
HINT_NOP42 rm32 P6,UNDOC
HINT_NOP42 rm64 X64,UNDOC
HINT_NOP43 rm16 P6,UNDOC
HINT_NOP43 rm32 P6,UNDOC
HINT_NOP43 rm64 X64,UNDOC
HINT_NOP44 rm16 P6,UNDOC
HINT_NOP44 rm32 P6,UNDOC
HINT_NOP44 rm64 X64,UNDOC
HINT_NOP45 rm16 P6,UNDOC
HINT_NOP45 rm32 P6,UNDOC
HINT_NOP45 rm64 X64,UNDOC
HINT_NOP46 rm16 P6,UNDOC
HINT_NOP46 rm32 P6,UNDOC
HINT_NOP46 rm64 X64,UNDOC
HINT_NOP47 rm16 P6,UNDOC
HINT_NOP47 rm32 P6,UNDOC
HINT_NOP47 rm64 X64,UNDOC
HINT_NOP48 rm16 P6,UNDOC
HINT_NOP48 rm32 P6,UNDOC
HINT_NOP48 rm64 X64,UNDOC
HINT_NOP49 rm16 P6,UNDOC
HINT_NOP49 rm32 P6,UNDOC
HINT_NOP49 rm64 X64,UNDOC
183
HINT_NOP50 rm16 P6,UNDOC
HINT_NOP50 rm32 P6,UNDOC
HINT_NOP50 rm64 X64,UNDOC
HINT_NOP51 rm16 P6,UNDOC
HINT_NOP51 rm32 P6,UNDOC
HINT_NOP51 rm64 X64,UNDOC
HINT_NOP52 rm16 P6,UNDOC
HINT_NOP52 rm32 P6,UNDOC
HINT_NOP52 rm64 X64,UNDOC
HINT_NOP53 rm16 P6,UNDOC
HINT_NOP53 rm32 P6,UNDOC
HINT_NOP53 rm64 X64,UNDOC
HINT_NOP54 rm16 P6,UNDOC
HINT_NOP54 rm32 P6,UNDOC
HINT_NOP54 rm64 X64,UNDOC
HINT_NOP55 rm16 P6,UNDOC
HINT_NOP55 rm32 P6,UNDOC
HINT_NOP55 rm64 X64,UNDOC
HINT_NOP56 rm16 P6,UNDOC
HINT_NOP56 rm32 P6,UNDOC
HINT_NOP56 rm64 X64,UNDOC
HINT_NOP57 rm16 P6,UNDOC
HINT_NOP57 rm32 P6,UNDOC
HINT_NOP57 rm64 X64,UNDOC
HINT_NOP58 rm16 P6,UNDOC
HINT_NOP58 rm32 P6,UNDOC
HINT_NOP58 rm64 X64,UNDOC
HINT_NOP59 rm16 P6,UNDOC
HINT_NOP59 rm32 P6,UNDOC
HINT_NOP59 rm64 X64,UNDOC
HINT_NOP60 rm16 P6,UNDOC
HINT_NOP60 rm32 P6,UNDOC
HINT_NOP60 rm64 X64,UNDOC
HINT_NOP61 rm16 P6,UNDOC
HINT_NOP61 rm32 P6,UNDOC
HINT_NOP61 rm64 X64,UNDOC
HINT_NOP62 rm16 P6,UNDOC
HINT_NOP62 rm32 P6,UNDOC
HINT_NOP62 rm64 X64,UNDOC
HINT_NOP63 rm16 P6,UNDOC
HINT_NOP63 rm32 P6,UNDOC
HINT_NOP63 rm64 X64,UNDOC
184
Appendix C: NASM Version History
185
• Builtin macro __PASS__ which expands to the current assembly pass. See section 4.11.9.
• __utf16__ and __utf32__ operators to generate UTF−16 and UTF−32 strings. See section 3.4.5.
• Fix bug in case−insensitive matching when compiled on platforms that don’t use the configure script.
Of the official release binaries, that only affected the OS/2 binary.
• Support for x87 packed BCD constants. See section 3.4.7.
• Correct the LTR and SLDT instructions in 64−bit mode.
• Fix unnecessary REX.W prefix on indirect jumps in 64−bit mode.
• Add AVX versions of the AES instructions (VAES...).
• Fix the 256−bit FMA instructions.
• Add 256−bit AVX stores per the latest AVX spec.
• VIA XCRYPT instructions can now be written either with or without REP, apparently different versions of
the VIA spec wrote them differently.
• Add missing 64−bit MOVNTI instruction.
• Fix the operand size of VMREAD and VMWRITE.
• Numerous bug fixes, especially to the AES, AVX and VTX instructions.
• The optimizer now always runs until it converges. It also runs even when disabled, but doesn’t optimize.
This allows most forward references to be resolved properly.
C.1.4 Version 2.03.01
• Fix buffer overflow in the listing module.
• Fix the handling of hexadecimal escape codes in ‘...‘ strings.
• The Postscript/PDF documentation has been reformatted.
• The −F option now implies −g.
C.1.5 Version 2.03
• Add support for Intel AVX, CLMUL and FMA instructions, including YMM registers.
• dy, resy and yword for 32−byte operands.
• Fix some SSE5 instructions.
• Intel INVEPT, INVVPID and MOVBE instructions.
• Fix checking for critical expressions when the optimizer is enabled.
• Support the DWARF debugging format for ELF targets.
• Fix optimizations of signed bytes.
• Fix operation on bigendian machines.
• Fix buffer overflow in the preprocessor.
• SAFESEH support for Win32, IMAGEREL for Win64 (SEH).
• %? and %?? to refer to the name of a macro itself. In particular, %idefine keyword $%? can be used
to make a keyword "disappear".
• New options for dependency generation: −MD, −MF, −MP, −MT, −MQ.
186
• New preprocessor directives %pathsearch and %depend; INCBIN reimplemented as a macro.
• %include now resolves macros in a sane manner.
• %substr can now be used to get other than one−character substrings.
• New type of character/string constants, using backquotes (‘...‘), which support C−style escape
sequences.
• %defstr and %idefstr to stringize macro definitions before creation.
• Fix forward references used in EQU statements.
C.1.6 Version 2.02
• Additional fixes for MMX operands with explicit qword, as well as (hopefully) SSE operands with
oword.
• Fix handling of truncated strings with DO.
• Fix segfaults due to memory overwrites when floating−point constants were used.
• Fix segfaults due to missing include files.
• Fix OpenWatcom Makefiles for DOS and OS/2.
• Add autogenerated instruction list back into the documentation.
• ELF: Fix segfault when generating stabs, and no symbols have been defined.
• ELF: Experimental support for DWARF debugging information.
• New compile date and time standard macros.
• %ifnum now returns true for negative numbers.
• New %iftoken test for a single token.
• New %ifempty test for empty expansion.
• Add support for the XSAVE instruction group.
• Makefile for Netware/gcc.
• Fix issue with some warnings getting emitted way too many times.
• Autogenerated instruction list added to the documentation.
C.1.7 Version 2.01
• Fix the handling of MMX registers with explicit qword tags on memory (broken in 2.00 due to 64−bit
changes.)
• Fix the PREFETCH instructions.
• Fix the documentation.
• Fix debugging info when using −f elf (backwards compatibility alias for −f elf32).
• Man pages for rdoff tools (from the Debian project.)
• ELF: handle large numbers of sections.
• Fix corrupt output when the optimizer runs out of passes.
187
C.1.8 Version 2.00
• Added c99 data−type compliance.
• Added general x86−64 support.
• Added win64 (x86−64 COFF) output format.
• Added __BITS__ standard macro.
• Renamed the elf output format to elf32 for clarity.
• Added elf64 and macho (MacOS X) output formats.
• Added Numeric constants in dq directive.
• Added oword, do and reso pseudo operands.
• Allow underscores in numbers.
• Added 8−, 16− and 128−bit floating−point formats.
• Added binary, octal and hexadecimal floating−point.
• Correct the generation of floating−point constants.
• Added floating−point option control.
• Added Infinity and NaN floating point support.
• Added ELF Symbol Visibility support.
• Added setting OSABI value in ELF header directive.
• Added Generate Makefile Dependencies option.
• Added Unlimited Optimization Passes option.
• Added %IFN and %ELIFN support.
• Added Logical Negation Operator.
• Enhanced Stack Relative Preprocessor Directives.
• Enhanced ELF Debug Formats.
• Enhanced Send Errors to a File option.
• Added SSSE3, SSE4.1, SSE4.2, SSE5 support.
• Added a large number of additional instructions.
• Significant performance improvements.
188
• (nasm.c)__OUTPUT_FORMAT__ changed to string value instead of symbol.
C.2.2 Version 0.98.38
• Add Makefile for 16−bit DOS binaries under OpenWatcom, and modify mkdep.pl to be able to generate
completely pathless dependencies, as required by OpenWatcom wmake (it supports path searches, but not
explicit paths.)
• Fix the STR instruction.
• Fix the ELF output format, which was broken under certain circumstances due to the addition of stabs
support.
• Quick−fix Borland format debug−info for −f obj
• Fix for %rep with no arguments (#560568)
• Fix concatenation of preprocessor function call (#794686)
• Fix long label causes coredump (#677841)
• Use autoheader as well as autoconf to keep configure from generating ridiculously long command lines.
• Make sure that all of the formats which support debugging output actually will suppress debugging output
when −g not specified.
C.2.3 Version 0.98.37
• Paths given in −I switch searched for incbin–ed as well as %include–ed files.
• Added stabs debugging for the ELF output format, patch from Martin Wawro.
• Fix output/outbin.c to allow origin > 80000000h.
• Make −U switch work.
• Fix the use of relative offsets with explicit prefixes, e.g. a32 loop foo.
• Remove backslash().
• Fix the SMSW and SLDT instructions.
• −O2 and −O3 are no longer aliases for −O10 and −O15. If you mean the latter, please say so! :)
C.2.4 Version 0.98.36
• Update rdoff – librarian/archiver – common rec – docs!
• Fix signed/unsigned problems.
• Fix JMP FAR label and CALL FAR label.
• Add new multisection support – map files – fix align bug
• Fix sysexit, movhps/movlps reg,reg bugs in insns.dat
• Q or O suffixes indicate octal
• Support Prescott new instructions (PNI).
• Cyrix XSTORE instruction.
C.2.5 Version 0.98.35
• Fix build failure on 16−bit DOS (Makefile.bc3 workaround for compiler bug.)
• Fix dependencies and compiler warnings.
189
• Add "const" in a number of places.
• Add –X option to specify error reporting format (use –Xvc to integrate with Microsoft Visual Studio.)
• Minor changes for code legibility.
• Drop use of tmpnam() in rdoff (security fix.)
C.2.6 Version 0.98.34
• Correct additional address−size vs. operand−size confusions.
• Generate dependencies for all Makefiles automatically.
• Add support for unimplemented (but theoretically available) registers such as tr0 and cr5. Segment
registers 6 and 7 are called segr6 and segr7 for the operations which they can be represented.
• Correct some disassembler bugs related to redundant address−size prefixes. Some work still remains in this
area.
• Correctly generate an error for things like "SEG eax".
• Add the JMPE instruction, enabled by "CPU IA64".
• Correct compilation on newer gcc/glibc platforms.
• Issue an error on things like "jmp far eax".
C.2.7 Version 0.98.33
• New __NASM_PATCHLEVEL__ and __NASM_VERSION_ID__ standard macros to round out the
version−query macros. version.pl now understands X.YYplWW or X.YY.ZZplWW as a version number,
equivalent to X.YY.ZZ.WW (or X.YY.0.WW, as appropriate).
• New keyword "strict" to disable the optimization of specific operands.
• Fix the handing of size overrides with JMP instructions (instructions such as "jmp dword foo".)
• Fix the handling of "ABSOLUTE label", where "label" points into a relocatable segment.
• Fix OBJ output format with lots of externs.
• More documentation updates.
• Add –Ov option to get verbose information about optimizations.
• Undo a braindead change which broke %elif directives.
• Makefile updates.
C.2.8 Version 0.98.32
• Fix NASM crashing when %macro directives were left unterminated.
• Lots of documentation updates.
• Complete rewrite of the PostScript/PDF documentation generator.
• The MS Visual C++ Makefile was updated and corrected.
• Recognize .rodata as a standard section name in ELF.
• Fix some obsolete Perl4−isms in Perl scripts.
• Fix configure.in to work with autoconf 2.5x.
• Fix a couple of "make cleaner" misses.
190
• Make the normal "./configure && make" work with Cygwin.
C.2.9 Version 0.98.31
• Correctly build in a separate object directory again.
• Derive all references to the version number from the version file.
• New standard macros __NASM_SUBMINOR__ and __NASM_VER__ macros.
• Lots of Makefile updates and bug fixes.
• New %ifmacro directive to test for multiline macros.
• Documentation updates.
• Fixes for 16−bit OBJ format output.
• Changed the NASM environment variable to NASMENV.
C.2.10 Version 0.98.30
• Changed doc files a lot: completely removed old READMExx and Wishlist files, incorporating all
information in CHANGES and TODO.
• I waited a long time to rename zoutieee.c to (original) outieee.c
• moved all output modules to output/ subdirectory.
• Added ’make strip’ target to strip debug info from nasm & ndisasm.
• Added INSTALL file with installation instructions.
• Added –v option description to nasm man.
• Added dist makefile target to produce source distributions.
• 16−bit support for ELF output format (GNU extension, but useful.)
C.2.11 Version 0.98.28
• Fastcooked this for Debian’s Woody release: Frank applied the INCBIN bug patch to 0.98.25alt and called
it 0.98.28 to not confuse poor little apt−get.
C.2.12 Version 0.98.26
• Reorganised files even better from 0.98.25alt
C.2.13 Version 0.98.25alt
• Prettified the source tree. Moved files to more reasonable places.
• Added findleak.pl script to misc/ directory.
• Attempted to fix doc.
C.2.14 Version 0.98.25
• Line continuation character \.
• Docs inadvertantly reverted – "dos packaging".
C.2.15 Version 0.98.24p1
• FIXME: Someone, document this please.
191
C.2.16 Version 0.98.24
• Documentation – Ndisasm doc added to Nasm.doc.
C.2.17 Version 0.98.23
• Attempted to remove rdoff version1
• Lino Mastrodomenico’s patches to preproc.c (%$$ bug?).
C.2.18 Version 0.98.22
• Update rdoff2 – attempt to remove v1.
C.2.19 Version 0.98.21
• Optimization fixes.
C.2.20 Version 0.98.20
• Optimization fixes.
C.2.21 Version 0.98.19
• H. J. Lu’s patch back out.
C.2.22 Version 0.98.18
• Added ".rdata" to "−f win32".
C.2.23 Version 0.98.17
• H. J. Lu’s "bogus elf" patch. (Red Hat problem?)
C.2.24 Version 0.98.16
• Fix whitespace before "[section ..." bug.
C.2.25 Version 0.98.15
• Rdoff changes (?).
• Fix fixes to memory leaks.
C.2.26 Version 0.98.14
• Fix memory leaks.
C.2.27 Version 0.98.13
• There was no 0.98.13
C.2.28 Version 0.98.12
• Update optimization (new function of "−O1")
• Changes to test/bintest.asm (?).
C.2.29 Version 0.98.11
• Optimization changes.
• Ndisasm fixed.
192
C.2.30 Version 0.98.10
• There was no 0.98.10
C.2.31 Version 0.98.09
• Add multiple sections support to "−f bin".
• Changed GLOBAL_TEMP_BASE in outelf.c from 6 to 15.
• Add "−v" as an alias to the "−r" switch.
• Remove "#ifdef" from Tasm compatibility options.
• Remove redundant size−overrides on "mov ds, ex", etc.
• Fixes to SSE2, other insns.dat (?).
• Enable uppercase "I" and "P" switches.
• Case insinsitive "seg" and "wrt".
• Update install.sh (?).
• Allocate tokens in blocks.
• Improve "invalid effective address" messages.
C.2.32 Version 0.98.08
• Add "%strlen" and "%substr" macro operators
• Fixed broken c16.mac.
• Unterminated string error reported.
• Fixed bugs as per 0.98bf
C.2.33 Version 0.98.09b with John Coffman patches released 28−Oct−2001
Changes from 0.98.07 release to 98.09b as of 28−Oct−2001
• More closely compatible with 0.98 when –O0 is implied or specified. Not strictly identical, since backward
branches in range of short offsets are recognized, and signed byte values with no explicit size specification
will be assembled as a single byte.
• More forgiving with the PUSH instruction. 0.98 requires a size to be specified always. 0.98.09b will imply
the size from the current BITS setting (16 or 32).
• Changed definition of the optimization flag:
–O0 strict two−pass assembly, JMP and Jcc are handled more like 0.98, except that back− ward JMPs are
short, if possible.
–O1 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.
–O2 multi−pass optimization, minimize branch offsets; also will minimize signed immed− iate bytes,
overriding size specification.
–O3 like –O2, but more passes taken, if needed
193
C.2.34 Version 0.98.07 released 01/28/01
• Added Stepane Denis’ SSE2 instructions to a *working* version of the code – some earlier versions were
based on broken code – sorry ’bout that. version "0.98.07"
01/28/01
• Cosmetic modifications to nasm.c, nasm.h, AUTHORS, MODIFIED
C.2.35 Version 0.98.06f released 01/18/01
• – Add "metalbrain"s jecxz bug fix in insns.dat – alter nasmdoc.src to match – version "0.98.06f"
C.2.36 Version 0.98.06e released 01/09/01
• Removed the "outforms.h" file – it appears to be someone’s old backup of "outform.h". version "0.98.06e"
01/09/01
• fbk – finally added the fix for the "multiple %includes bug", known since 7/27/99 – reported originally (?)
and sent to us by Austin Lunnen – he reports that John Fine had a fix within the day. Here it is...
• Nelson Rush resigns from the group. Big thanks to Nelson for his leadership and enthusiasm in getting
these changes incorporated into Nasm!
• fbk – [list +], [list –] directives – ineptly implemented, should be re−written or removed, perhaps.
• Brian Raiter / fbk – "elfso bug" fix – applied to aoutb format as well – testing might be desirable...
08/07/00
• James Seter – –postfix, –prefix command line switches.
• Yuri Zaporogets – rdoff utility changes.
C.2.37 Version 0.98p1
• GAS−like palign (Panos Minos)
• FIXME: Someone, fill this in with details
C.2.38 Version 0.98bf (bug−fixed)
• Fixed – elf and aoutb bug – shared libraries – multiple "%include" bug in "−f obj" – jcxz, jecxz bug –
unrecognized option bug in ndisasm
C.2.39 Version 0.98.03 with John Coffman’s changes released 27−Jul−2000
• Added signed byte optimizations for the 0x81/0x83 class of instructions: ADC, ADD, AND, CMP, OR,
SBB, SUB, XOR: when used as ’ADD reg16,imm’ or ’ADD reg32,imm.’ Also optimization of signed byte
form of ’PUSH imm’ and ’IMUL reg,imm’/’IMUL reg,reg,imm.’ No size specification is needed.
• Added multi−pass JMP and Jcc offset optimization. Offsets on forward references will preferentially use
the short form, without the need to code a specific size (short or near) for the branch. Added instructions
for ’Jcc label’ to use the form ’Jnotcc $+3/JMP label’, in cases where a short offset is out of bounds. If
compiling for a 386 or higher CPU, then the 386 form of Jcc will be used instead.
This feature is controlled by a new command−line switch: "O", (upper case letter O). "−O0" reverts the
assembler to no extra optimization passes, "−O1" allows up to 5 extra passes, and "−O2"(default), allows up
to 10 extra optimization passes.
194
• Added a new directive: ’cpu XXX’, where XXX is any of: 8086, 186, 286, 386, 486, 586, pentium, 686,
PPro, P2, P3 or Katmai. All are case insensitive. All instructions will be selected only if they apply to the
selected cpu or lower. Corrected a couple of bugs in cpu−dependence in ’insns.dat’.
• Added to ’standard.mac’, the "use16" and "use32" forms of the "bits 16/32" directive. This is nothing new,
just conforms to a lot of other assemblers. (minor)
• Changed label allocation from 320/32 (10000 labels @ 200K+) to 32/37 (1000 labels); makes running
under DOS much easier. Since additional label space is allocated dynamically, this should have no effect
on large programs with lots of labels. The 37 is a prime, believed to be better for hashing. (minor)
C.2.40 Version 0.98.03
"Integrated patchfile 0.98−0.98.01. I call this version 0.98.03 for historical reasons: 0.98.02 was trashed."
––John Coffman <[email protected]>, 27−Jul−2000
• Kendall Bennett’s SciTech MGL changes
• Note that you must define "TASM_COMPAT" at compile−time to get the Tasm Ideal Mode compatibility.
• All changes can be compiled in and out using the TASM_COMPAT macros, and when compiled without
TASM_COMPAT defined we get the exact same binary as the unmodified 0.98 sources.
• standard.mac, macros.c: Added macros to ignore TASM directives before first include
• nasm.h: Added extern declaration for tasm_compatible_mode
• nasm.c: Added global variable tasm_compatible_mode
• Added command line switch for TASM compatible mode (−t)
• Changed version command line to reflect when compiled with TASM additions
• Added response file processing to allow all arguments on a single line (response file is @resp rather than
–@resp for NASM format).
• labels.c: Changes islocal() macro to support TASM style @@local labels.
• Added islocalchar() macro to support TASM style @@local labels.
• parser.c: Added support for TASM style memory references (ie: mov [DWORD eax],10 rather than the
NASM style mov DWORD [eax],10).
• preproc.c: Added new directives, %arg, %local, %stacksize to directives table
• Added support for TASM style directives without a leading % symbol.
• Integrated a block of changes from Andrew Zabolotny <[email protected]>:
• A new keyword %xdefine and its case−insensitive counterpart %ixdefine. They work almost the
same way as %define and %idefine but expand the definition immediately, not on the invocation.
Something like a cross between %define and %assign. The "x" suffix stands for "eXpand", so
"xdefine" can be deciphered as "expand−and−define". Thus you can do things like this:
%assign ofs 0
%macro arg 1
%xdefine %1 dword [esp+ofs]
%assign ofs ofs+4
%endmacro
195
• Changed the place where the expansion of %$name macros are expanded. Now they are converted into
[email protected] form when detokenizing, so there are no quirks as before when using %$name arguments
to macros, in macros etc. For example:
%macro abc 1
%define %1 hello
%endm
abc %$here
%$here
Now last line will be expanded into "hello" as expected. This also allows for lots of goodies, a good example
are extended "proc" macros included in this archive.
• Added a check for "cstk" in smacro_defined() before calling get_ctx() – this allows for things like:
%ifdef %$abc
%endif
to work without warnings even in no context.
• Added a check for "cstk" in %if*ctx and %elif*ctx directives – this allows to use %ifctx without
excessive warnings. If there is no active context, %ifctx goes through "false" branch.
• Removed "user error: " prefix with %error directive: it just clobbers the output and has absolutely no
functionality. Besides, this allows to write macros that does not differ from built−in functions in any way.
• Added expansion of string that is output by %error directive. Now you can do things like:
%define hello(x) Hello, x!
196
• A new directive [WARNING {+|−}warning−id] have been added. It works only if the assembly phase is
enabled (i.e. it doesn’t work with nasm –e).
• A new warning type: macro−selfref. By default this warning is disabled; when enabled NASM warns when
a macro self−references itself; for example the following source:
[WARNING macro−selfref]
push eax,ebx,ecx
will produce a warning, but if we remove the first line we won’t see it anymore (which is The Right Thing To
Do {tm} IMHO since C preprocessor eats such constructs without warnings at all).
• Added a "error" routine to preprocessor which always will set ERR_PASS1 bit in severity_code. This
removes annoying repeated errors on first and second passes from preprocessor.
• Added the %+ operator in single−line macros for concatenating two identifiers. Usage example:
%define _myfunc _otherfunc
%define cextern(x) _ %+ x
cextern (myfunc)
After first expansion, third line will become "_myfunc". After this expansion is performed again so it
becomes "_otherunc".
• Now if preprocessor is in a non−emitting state, no warning or error will be emitted. Example:
%if 1
mov eax,ebx
%else
put anything you want between these two brackets,
even macro−parameter references %1 or local
labels %$zz or macro−local labels %%zz − no
warning will be emitted.
%endif
• Context−local variables on expansion as a last resort are looked up in outer contexts. For example, the
following piece:
%push outer
%define %$a [esp]
%push inner
%$a
%pop
%pop
will expand correctly the fourth line to [esp]; if we’ll define another %$a inside the "inner" context, it will
take precedence over outer definition. However, this modification has been applied only to expand_smacro
and not to smacro_define: as a consequence expansion looks in outer contexts, but %ifdef won’t look in
outer contexts.
197
This behaviour is needed because we don’t want nested contexts to act on already defined local macros.
Example:
%define %$arg1 [esp+4]
test eax,eax
if nz
mov eax,%$arg1
endif
In this example the "if" mmacro enters into the "if" context, so %$arg1 is not valid anymore inside "if". Of
course it could be worked around by using explicitely %$$arg1 but this is ugly IMHO.
• Fixed memory leak in %undef. The origline wasn’t freed before exiting on success.
• Fixed trap in preprocessor when line expanded to empty set of tokens. This happens, for example, in the
following case:
#define SOMETHING
SOMETHING
C.2.41 Version 0.98
All changes since NASM 0.98p3 have been produced by H. Peter Anvin <[email protected]>.
• The documentation comment delimiter is
• Allow EQU definitions to refer to external labels; reported by Pedro Gimeno.
• Re−enable support for RDOFF v1; reported by Pedro Gimeno.
• Updated License file per OK from Simon and Julian.
C.2.42 Version 0.98p9
• Update documentation (although the instruction set reference will have to wait; I don’t want to hold up the
0.98 release for it.)
• Verified that the NASM implementation of the PEXTRW and PMOVMSKB instructions is correct. The
encoding differs from what the Intel manuals document, but the Pentium III behaviour matches NASM, not
the Intel manuals.
• Fix handling of implicit sizes in PSHUFW and PINSRW, reported by Stefan Hoffmeister.
• Resurrect the –s option, which was removed when changing the diagnostic output to stdout.
C.2.43 Version 0.98p8
• Fix for "DB" when NASM is running on a bigendian machine.
• Invoke insns.pl once for each output script, making Makefile.in legal for "make –j".
• Improve the Unix configure−based makefiles to make package creation easier.
• Included an RPM .spec file for building RPM (RedHat Package Manager) packages on Linux or Unix
systems.
• Fix Makefile dependency problems.
• Change src/rdsrc.pl to include sectioning information in info output; required for install−info to work.
• Updated the RDOFF distribution to version 2 from Jules; minor massaging to make it compile in my
environment.
• Split doc files that can be built by anyone with a Perl interpreter off into a separate archive.
198
• "Dress rehearsal" release!
C.2.44 Version 0.98p7
• Fixed opcodes with a third byte−sized immediate argument to not complain if given "byte" on the
immediate.
• Allow %undef to remove single−line macros with arguments. This matches the behaviour of #undef in the
C preprocessor.
• Allow –d, –u, –i and –p to be specified as –D, –U, –I and –P for compatibility with most C compilers and
preprocessors. This allows Makefile options to be shared between cc and nasm, for example.
• Minor cleanups.
• Went through the list of Katmai instructions and hopefully fixed the (rather few) mistakes in it.
• (Hopefully) fixed a number of disassembler bugs related to ambiguous instructions (disambiguated by –p)
and SSE instructions with REP.
• Fix for bug reported by Mark Junger: "call dword 0x12345678" should work and may add an OSP
(affected CALL, JMP, Jcc).
• Fix for environments when "stderr" isn’t a compile−time constant.
C.2.45 Version 0.98p6
• Took officially over coordination of the 0.98 release; so drop the p3.x notation. Skipped p4 and p5 to avoid
confusion with John Fine’s J4 and J5 releases.
• Update the documentation; however, it still doesn’t include documentation for the various new
instructions. I somehow wonder if it makes sense to have an instruction set reference in the assembler
manual when Intel et al have PDF versions of their manuals online.
• Recognize "idt" or "centaur" for the –p option to ndisasm.
• Changed error messages back to stderr where they belong, but add an –E option to redirect them elsewhere
(the DOS shell cannot redirect stderr.)
• –M option to generate Makefile dependencies (based on code from Alex Verstak.)
• %undef preprocessor directive, and –u option, that undefines a single−line macro.
• OS/2 Makefile (Mkfiles/Makefile.os2) for Borland under OS/2; from Chuck Crayne.
• Various minor bugfixes (reported by): – Dangling %s in preproc.c (Martin Junker)
• THERE ARE KNOWN BUGS IN SSE AND THE OTHER KATMAI INSTRUCTIONS. I am on a trip
and didn’t bring the Katmai instruction reference, so I can’t work on them right now.
• Updated the License file per agreement with Simon and Jules to include a GPL distribution clause.
C.2.46 Version 0.98p3.7
• (Hopefully) fixed the canned Makefiles to include the outrdf2 and zoutieee modules.
• Renamed changes.asm to changed.asm.
C.2.47 Version 0.98p3.6
• Fixed a bunch of instructions that were added in 0.98p3.5 which had memory operands, and the
address−size prefix was missing from the instruction pattern.
199
C.2.48 Version 0.98p3.5
• Merged in changes from John S. Fine’s 0.98−J5 release. John’s based 0.98−J5 on my 0.98p3.3 release; this
merges the changes.
• Expanded the instructions flag field to a long so we can fit more flags; mark SSE (KNI) and AMD or
Katmai−specific instructions as such.
• Fix the "PRIV" flag on a bunch of instructions, and create new "PROT" flag for protected−mode−only
instructions (orthogonal to if the instruction is privileged!) and new "SMM" flag for SMM−only
instructions.
• Added AMD−only SYSCALL and SYSRET instructions.
• Make SSE actually work, and add new Katmai MMX instructions.
• Added a –p (preferred vendor) option to ndisasm so that it can distinguish e.g. Cyrix opcodes also used in
SSE. For example:
ndisasm −p cyrix aliased.bin
00000000 670F514310 paddsiw mm0,[ebx+0x10]
00000005 670F514320 paddsiw mm0,[ebx+0x20]
ndisasm −p intel aliased.bin
00000000 670F514310 sqrtps xmm0,[ebx+0x10]
00000005 670F514320 sqrtps xmm0,[ebx+0x20]
• Added a bunch of Cyrix−specific instructions.
C.2.49 Version 0.98p3.4
• Made at least an attempt to modify all the additional Makefiles (in the Mkfiles directory). I can’t test it, but
this was the best I could do.
• DOS DJGPP+"Opus Make" Makefile from John S. Fine.
• changes.asm changes from John S. Fine.
C.2.50 Version 0.98p3.3
• Patch from Conan Brink to allow nesting of %rep directives.
• If we’re going to allow INT01 as an alias for INT1/ICEBP (one of Jules 0.98p3 changes), then we should
allow INT03 as an alias for INT3 as well.
• Updated changes.asm to include the latest changes.
• Tried to clean up the <CR>s that had snuck in from a DOS/Windows environment into my Unix
environment, and try to make sure than DOS/Windows users get them back.
• We would silently generate broken tools if insns.dat wasn’t sorted properly. Change insns.pl so that the
order doesn’t matter.
• Fix bug in insns.pl (introduced by me) which would cause conditional instructions to have an extra "cc" in
disassembly, e.g. "jnz" disassembled as "jccnz".
C.2.51 Version 0.98p3.2
• Merged in John S. Fine’s changes from his 0.98−J4 prerelease; see http://www.csoft.net/cz/johnfine/
• Changed previous "spotless" Makefile target (appropriate for distribution) to "distclean", and added
"cleaner" target which is same as "clean" except deletes files generated by Perl scripts; "spotless" is union.
• Removed BASIC programs from distribution. Get a Perl interpreter instead (see below.)
200
• Calling this "pre−release 3.2" rather than "p3−hpa2" because of John’s contributions.
• Actually link in the IEEE output format (zoutieee.c); fix a bunch of compiler warnings in that file. Note I
don’t know what IEEE output is supposed to look like, so these changes were made "blind".
C.2.52 Version 0.98p3−hpa
• Merged nasm098p3.zip with nasm−0.97.tar.gz to create a fully buildable version for Unix systems
(Makefile.in updates, etc.)
• Changed insns.pl to create the instruction tables in nasm.h and names.c, so that a new instruction can be
added by adding it *only* to insns.dat.
• Added the following new instructions: SYSENTER, SYSEXIT, FXSAVE, FXRSTOR, UD1, UD2 (the
latter two are two opcodes that Intel guarantee will never be used; one of them is documented as UD2 in
Intel documentation, the other one just as "Undefined Opcode" –– calling it UD1 seemed to make sense.)
• MAX_SYMBOL was defined to be 9, but LOADALL286 and LOADALL386 are 10 characters long. Now
MAX_SYMBOL is derived from insns.dat.
• A note on the BASIC programs included: forget them. insns.bas is already out of date. Get yourself a Perl
interpreter for your platform of choice at http://www.cpan.org/ports/index.html.
C.2.53 Version 0.98 pre−release 3
• added response file support, improved command line handling, new layout help screen
• fixed limit checking bug, ’OUT byte nn, reg’ bug, and a couple of rdoff related bugs, updated Wishlist;
0.98 Prerelease 3.
C.2.54 Version 0.98 pre−release 2
• fixed bug in outcoff.c to do with truncating section names longer than 8 characters, referencing beyond end
of string; 0.98 pre−release 2
C.2.55 Version 0.98 pre−release 1
• Fixed a bug whereby STRUC didn’t work at all in RDF.
• Fixed a problem with group specification in PUBDEFs in OBJ.
• Improved ease of adding new output formats. Contribution due to Fox Cutter.
• Fixed a bug in relocations in the ‘bin’ format: was showing up when a relocatable reference crossed an
8192−byte boundary in any output section.
• Fixed a bug in local labels: local−label lookups were inconsistent between passes one and two if an EQU
occurred between the definition of a global label and the subsequent use of a local label local to that global.
• Fixed a seg−fault in the preprocessor (again) which happened when you use a blank line as the first line of
a multi−line macro definition and then defined a label on the same line as a call to that macro.
• Fixed a stale−pointer bug in the handling of the NASM environment variable. Thanks to Thomas
McWilliams.
• ELF had a hard limit on the number of sections which caused segfaults when transgressed. Fixed.
• Added ability for ndisasm to read from stdin by using ‘−’ as the filename.
• ndisasm wasn’t outputting the TO keyword. Fixed.
• Fixed error cascade on bogus expression in %if – an error in evaluation was causing the entire %if to be
discarded, thus creating trouble later when the %else or %endif was encountered.
201
• Forward reference tracking was instruction−granular not operand− granular, which was causing
286−specific code to be generated needlessly on code of the form ‘shr word [forwardref],1’. Thanks to Jim
Hague for sending a patch.
• All messages now appear on stdout, as sending them to stderr serves no useful purpose other than to make
redirection difficult.
• Fixed the problem with EQUs pointing to an external symbol – this now generates an error message.
• Allowed multiple size prefixes to an operand, of which only the first is taken into account.
• Incorporated John Fine’s changes, including fixes of a large number of preprocessor bugs, some small
problems in OBJ, and a reworking of label handling to define labels before their line is assembled, rather
than after.
• Reformatted a lot of the source code to be more readable. Included ’coding.txt’ as a guideline for how to
format code for contributors.
• Stopped nested %reps causing a panic – they now cause a slightly more friendly error message instead.
• Fixed floating point constant problems (patch by Pedro Gimeno)
• Fixed the return value of insn_size() not being checked for –1, indicating an error.
• Incorporated 3Dnow! instructions.
• Fixed the ’mov eax, eax + ebx’ bug.
• Fixed the GLOBAL EQU bug in ELF. Released developers release 3.
• Incorporated John Fine’s command line parsing changes
• Incorporated David Lindauer’s OMF debug support
• Made changes for LCC 4.0 support (__NASM_CDecl__, removed register size specification warning
when sizes agree).
202
• Fixed a problem with buffer overrun in OBJ, which was causing corruption at ends of long PUBDEF
records.
• Separated DOS archives into main−program and documentation to reduce download size.
C.3.2 Version 0.96 released November 1997
• Fixed a bug whereby, if ‘nasm sourcefile’ would cause a filename collision warning and put output into
‘nasm.out’, then ‘nasm sourcefile –o outputfile’ still gave the warning even though the ‘−o’ was honoured.
Fixed name pollution under Digital UNIX: one of its header files defined R_SP, which broke the enum in
nasm.h.
• Fixed minor instruction table problems: FUCOM and FUCOMP didn’t have two−operand forms;
NDISASM didn’t recognise the longer register forms of PUSH and POP (eg FF F3 for PUSH BX); TEST
mem,imm32 was flagged as undocumented; the 32−bit forms of CMOV had 16−bit operand size prefixes;
‘AAD imm’ and ‘AAM imm’ are no longer flagged as undocumented because the Intel Architecture
reference documents them.
• Fixed a problem with the local−label mechanism, whereby strange types of symbol (EQUs, auto−defined
OBJ segment base symbols) interfered with the ‘previous global label’ value and screwed up local labels.
• Fixed a bug whereby the stub preprocessor didn’t communicate with the listing file generator, so that the
–a and –l options in conjunction would produce a useless listing file.
• Merged ‘os2’ object file format back into ‘obj’, after discovering that ‘obj’ _also_ shouldn’t have a link
pass separator in a module containing a non−trivial MODEND. Flat segments are now declared using the
FLAT attribute. ‘os2’ is no longer a valid object format name: use ‘obj’.
• Removed the fixed−size temporary storage in the evaluator. Very very long expressions (like ‘mov
ax,1+1+1+1+...’ for two hundred 1s or so) should now no longer crash NASM.
• Fixed a bug involving segfaults on disassembly of MMX instructions, by changing the meaning of one of
the operand−type flags in nasm.h. This may cause other apparently unrelated MMX problems; it needs to
be tested thoroughly.
• Fixed some buffer overrun problems with large OBJ output files. Thanks to DJ Delorie for the bug report
and fix.
• Made preprocess−only mode actually listen to the %line markers as it prints them, so that it can report
errors more sanely.
• Re−designed the evaluator to keep more sensible track of expressions involving forward references: can
now cope with previously−nightmare situations such as:
mov ax,foo | bar
foo equ 1
bar equ 2
• Added the ALIGN and ALIGNB standard macros.
• Added PIC support in ELF: use of WRT to obtain the four extra relocation types needed.
• Added the ability for output file formats to define their own extensions to the GLOBAL, COMMON and
EXTERN directives.
• Implemented common−variable alignment, and global−symbol type and size declarations, in ELF.
• Implemented NEAR and FAR keywords for common variables, plus far−common element size
specification, in OBJ.
• Added a feature whereby EXTERNs and COMMONs in OBJ can be given a default WRT specification
(either a segment or a group).
203
• Transformed the Unix NASM archive into an auto−configuring package.
• Added a sanity−check for people applying SEG to things which are already segment bases: this previously
went unnoticed by the SEG processing and caused OBJ−driver panics later.
• Added the ability, in OBJ format, to deal with ‘MOV EAX,<segment>’ type references: OBJ doesn’t
directly support dword−size segment base fixups, but as long as the low two bytes of the constant term are
zero, a word−size fixup can be generated instead and it will work.
• Added the ability to specify sections’ alignment requirements in Win32 object files and pure binary files.
• Added preprocess−time expression evaluation: the %assign (and %iassign) directive and the bare %if
(and %elif) conditional. Added relational operators to the evaluator, for use only in %if constructs: the
standard relationals = < > <= >= <> (and C−like synonyms == and !=) plus low−precedence logical
operators &&, ^^ and ||.
• Added a preprocessor repeat construct: %rep / %exitrep / %endrep.
• Added the __FILE__ and __LINE__ standard macros.
• Added a sanity check for number constants being greater than 0xFFFFFFFF. The warning can be disabled.
• Added the %0 token whereby a variadic multi−line macro can tell how many parameters it’s been given in
a specific invocation.
• Added %rotate, allowing multi−line macro parameters to be cycled.
• Added the ‘*’ option for the maximum parameter count on multi−line macros, allowing them to take
arbitrarily many parameters.
• Added the ability for the user−level forms of EXTERN, GLOBAL and COMMON to take more than one
argument.
• Added the IMPORT and EXPORT directives in OBJ format, to deal with Windows DLLs.
• Added some more preprocessor %if constructs: %ifidn / %ifidni (exact textual identity), and %ifid
/ %ifnum / %ifstr (token type testing).
• Added the ability to distinguish SHL AX,1 (the 8086 version) from SHL AX,BYTE 1 (the
286−and−upwards version whose constant happens to be 1).
• Added NetBSD/FreeBSD/OpenBSD’s variant of a.out format, complete with PIC shared library features.
• Changed NASM’s idiosyncratic handling of FCLEX, FDISI, FENI, FINIT, FSAVE, FSTCW, FSTENV,
and FSTSW to bring it into line with the otherwise accepted standard. The previous behaviour, though it
was a deliberate feature, was a deliberate feature based on a misunderstanding. Apologies for the
inconvenience.
• Improved the flexibility of ABSOLUTE: you can now give it an expression rather than being restricted to a
constant, and it can take relocatable arguments as well.
• Added the ability for a variable to be declared as EXTERN multiple times, and the subsequent definitions
are just ignored.
• We now allow instruction prefixes (CS, DS, LOCK, REPZ etc) to be alone on a line (without a following
instruction).
• Improved sanity checks on whether the arguments to EXTERN, GLOBAL and COMMON are valid
identifiers.
• Added misc/exebin.mac to allow direct generation of .EXE files by hacking up an EXE header using DB
and DW; also added test/binexe.asm to demonstrate the use of this. Thanks to Yann Guidon for
contributing the EXE header code.
204
• ndisasm forgot to check whether the input file had been successfully opened. Now it does. Doh!
• Added the Cyrix extensions to the MMX instruction set.
• Added a hinting mechanism to allow [EAX+EBX] and [EBX+EAX] to be assembled differently. This is
important since [ESI+EBP] and [EBP+ESI] have different default base segment registers.
• Added support for the PharLap OMF extension for 4096−byte segment alignment.
C.3.3 Version 0.95 released July 1997
• Fixed yet another ELF bug. This one manifested if the user relied on the default segment, and attempted to
define global symbols without first explicitly declaring the target segment.
• Added makefiles (for NASM and the RDF tools) to build Win32 console apps under Symantec C++.
Donated by Mark Junker.
• Added ‘macros.bas’ and ‘insns.bas’, QBasic versions of the Perl scripts that convert ‘standard.mac’ to
‘macros.c’ and convert ‘insns.dat’ to ‘insnsa.c’ and ‘insnsd.c’. Also thanks to Mark Junker.
• Changed the diassembled forms of the conditional instructions so that JB is now emitted as JC, and other
similar changes. Suggested list by Ulrich Doewich.
• Added ‘@’ to the list of valid characters to begin an identifier with.
• Documentary changes, notably the addition of the ‘Common Problems’ section in nasm.doc.
• Fixed a bug relating to 32−bit PC−relative fixups in OBJ.
• Fixed a bug in perm_copy() in labels.c which was causing exceptions in cleanup_labels() on some systems.
• Positivity sanity check in TIMES argument changed from a warning to an error following a further
complaint.
• Changed the acceptable limits on byte and word operands to allow things like ‘~10111001b’ to work.
• Fixed a major problem in the preprocessor which caused seg−faults if macro definitions contained blank
lines or comment−only lines.
• Fixed inadequate error checking on the commas separating the arguments to ‘db’, ‘dw’ etc.
• Fixed a crippling bug in the handling of macros with operand counts defined with a ‘+’ modifier.
• Fixed a bug whereby object file formats which stored the input file name in the output file (such as OBJ
and COFF) weren’t doing so correctly when the output file name was specified on the command line.
• Removed [INC] and [INCLUDE] support for good, since they were obsolete anyway.
• Fixed a bug in OBJ which caused all fixups to be output in 16−bit (old−format) FIXUPP records, rather
than putting the 32−bit ones in FIXUPP32 (new−format) records.
• Added, tentatively, OS/2 object file support (as a minor variant on OBJ).
• Updates to Fox Cutter’s Borland C makefile, Makefile.bc2.
• Removed a spurious second fclose() on the output file.
• Added the ‘−s’ command line option to redirect all messages which would go to stderr (errors, help text) to
stdout instead.
• Added the ‘−w’ command line option to selectively suppress some classes of assembly warning messages.
• Added the ‘−p’ pre−include and ‘−d’ pre−define command−line options.
• Added an include file search path: the ‘−i’ command line option.
205
• Fixed a silly little preprocessor bug whereby starting a line with a ‘%!’ environment−variable reference
caused an ‘unknown directive’ error.
• Added the long−awaited listing file support: the ‘−l’ command line option.
• Fixed a problem with OBJ format whereby, in the absence of any explicit segment definition, non−global
symbols declared in the implicit default segment generated spurious EXTDEF records in the output.
• Added the NASM environment variable.
• From this version forward, Win32 console−mode binaries will be included in the DOS distribution in
addition to the 16−bit binaries. Added Makefile.vc for this purpose.
• Added ‘return 0;’ to test/objlink.c to prevent compiler warnings.
• Added the __NASM_MAJOR__ and __NASM_MINOR__ standard defines.
• Added an alternative memory−reference syntax in which prefixing an operand with ‘&’ is equivalent to
enclosing it in square brackets, at the request of Fox Cutter.
• Errors in pass two now cause the program to return a non−zero error code, which they didn’t before.
• Fixed the single−line macro cycle detection, which didn’t work at all on macros with no parameters
(caused an infinite loop). Also changed the behaviour of single−line macro cycle detection to work like
cpp, so that macros like ‘extrn’ as given in the documentation can be implemented.
• Fixed the implementation of WRT, which was too restrictive in that you couldn’t do ‘mov ax,[di+abc wrt
dgroup]’ because (di+abc) wasn’t a relocatable reference.
C.3.4 Version 0.94 released April 1997
• Major item: added the macro processor.
• Added undocumented instructions SMI, IBTS, XBTS and LOADALL286. Also reorganised CMPXCHG
instruction into early−486 and Pentium forms. Thanks to Thobias Jones for the information.
• Fixed two more stupid bugs in ELF, which were causing ‘ld’ to continue to seg−fault in a lot of non−trivial
cases.
• Fixed a seg−fault in the label manager.
• Stopped FBLD and FBSTP from _requiring_ the TWORD keyword, which is the only option for BCD
loads/stores in any case.
• Ensured FLDCW, FSTCW and FSTSW can cope with the WORD keyword, if anyone bothers to provide
it. Previously they complained unless no keyword at all was present.
• Some forms of FDIV/FDIVR and FSUB/FSUBR were still inverted: a vestige of a bug that I thought had
been fixed in 0.92. This was fixed, hopefully for good this time...
• Another minor phase error (insofar as a phase error can _ever_ be minor) fixed, this one occurring in code
of the form
rol ax,forward_reference
forward_reference equ 1
• The number supplied to TIMES is now sanity−checked for positivity, and also may be greater than 64K
(which previously didn’t work on 16−bit systems).
• Added Watcom C makefiles, and misc/pmw.bat, donated by Dominik Behr.
• Added the INCBIN pseudo−opcode.
206
• Due to the advent of the preprocessor, the [INCLUDE] and [INC] directives have become obsolete. They
are still supported in this version, with a warning, but won’t be in the next.
• Fixed a bug in OBJ format, which caused incorrect object records to be output when absolute labels were
made global.
• Updates to RDOFF subdirectory, and changes to outrdf.c.
C.3.5 Version 0.93 released January 1997
This release went out in a great hurry after semi−crippling bugs were found in 0.92.
• Really did fix the stack overflows this time. *blush*
• Had problems with EA instruction sizes changing between passes, when an offset contained a forward
reference and so 4 bytes were allocated for the offset in pass one; by pass two the symbol had been defined
and happened to be a small absolute value, so only 1 byte got allocated, causing instruction size mismatch
between passes and hence incorrect address calculations. Fixed.
• Stupid bug in the revised ELF section generation fixed (associated string−table section for .symtab was
hard−coded as 7, even when this didn’t fit with the real section table). Was causing ‘ld’ to seg−fault under
Linux.
• Included a new Borland C makefile, Makefile.bc2, donated by Fox Cutter <[email protected]>.
C.3.6 Version 0.92 released January 1997
• The FDIVP/FDIVRP and FSUBP/FSUBRP pairs had been inverted: this was fixed. This also affected the
LCC driver.
• Fixed a bug regarding 32−bit effective addresses of the form [other_register+ESP].
• Documentary changes, notably documentation of the fact that Borland Win32 compilers use ‘obj’ rather
than ‘win32’ object format.
• Fixed the COMENT record in OBJ files, which was formatted incorrectly.
• Fixed a bug causing segfaults in large RDF files.
• OBJ format now strips initial periods from segment and group definitions, in order to avoid complications
with the local label syntax.
• Fixed a bug in disassembling far calls and jumps in NDISASM.
• Added support for user−defined sections in COFF and ELF files.
• Compiled the DOS binaries with a sensible amount of stack, to prevent stack overflows on any arithmetic
expression containing parentheses.
• Fixed a bug in handling of files that do not terminate in a newline.
C.3.7 Version 0.91 released November 1996
• Loads of bug fixes.
• Support for RDF added.
• Support for DBG debugging format added.
• Support for 32−bit extensions to Microsoft OBJ format added.
• Revised for Borland C: some variable names changed, makefile added.
• LCC support revised to actually work.
207
• JMP/CALL NEAR/FAR notation added.
• ‘a16’, ‘o16’, ‘a32’ and ‘o32’ prefixes added.
• Range checking on short jumps implemented.
• MMX instruction support added.
• Negative floating point constant support added.
• Memory handling improved to bypass 64K barrier under DOS.
• $ prefix to force treatment of reserved words as identifiers added.
• Default−size mechanism for object formats added.
• Compile−time configurability added.
• #, @, ~ and c{?} are now valid characters in labels.
• −e and −k options in NDISASM added.
C.3.8 Version 0.90 released October 1996
First release version. First support for object file output. Other changes from previous version (0.3x) too
numerous to document.
208
Index
! operator, unary 32 A16 25
!= operator 48 a16 108
$$ token 32, 83 A32 25
$ a32 108
Here token 32 A64 25
prefix 25, 28, 85 a64 108
% operator 32 a86 14, 22, 23, 24
%! 58 ABS 28
%$ and %$$ prefixes 52, 53 ABSOLUTE 66, 73
%% operator 32, 42 addition 32
%+ 38 addressing, mixed−size 107
%? 38 address−size prefixes 25
%?? 38 algebra 28
& operator 32 ALIGN 62, 63, 70, 72
&& operator 48 smart 63
* operator 32 ALIGNB 62
+ modifier 43 alignment
+ operator in bin sections 71
binary 32 in elf sections 82
unary 32 in obj sections 72
− operator in win32 sections 76
binary 32 of elf common variables 84
unary 32 ALIGNMODE 63
..@ symbol prefix 34, 42 __ALIGNMODE__ 63
/ operator 32 ALINK 88
// operator 32 alink.sourceforge.net 88
< operator 48 alloc 82
<< operator 32 alternate register names 63
<= operator 48 alt.lang.asm 14, 15
<> operator 48 altreg 63
= operator 48 ambiguity 23
== operator 48 a.out
> operator 48 BSD version 84
>= operator 48 Linux version 84
>> operator 32 aout 16, 84
? MASM syntax 26 aoutb 84, 103
^ operator 32 %arg 55
^^ operator 48 arg 95, 102
| operator 32 as86 14, 16, 85
|| operator 48 assembler directives 64
~ operator 32 assembly−time options 20
%0 parameter count 44 %assign 39
%+1 and %−1 syntax 46 ASSUME 23
16−bit mode, versus 32−bit mode 64 AT 61
64−bit displacement 111 Autoconf 15
64−bit immediate 110 autoexec.bat 15
−a option 20, 117 auto−sync 117
209
−b 116 concatenating strings 40
bin 16, 17, 70 condition codes as macro parameters 46
multisection 71 conditional assembly 47
binary 28 conditional jumps 113
binary files 26 conditional−return macro 46
bit shift 32 configure 15
BITS 64, 70 constants 28
__BITS__ 59 context stack 52, 53
bitwise AND 32 context−local labels 52
bitwise OR 32 context−local single−line macros 53
bitwise XOR 32 counting macro parameters 44
block IFs 53 CPU 68
boot loader 70 CPUID 30
boot sector 113 creating contexts 52
Borland critical expression 26, 33, 39, 66
Pascal 96 −D option 19
Win32 compilers 71 −d option 19
braces .data 82, 84, 85
after % sign 45 _DATA 93
around macro parameters 41 data 83, 86
BSD 103 data structure 95, 102
.bss 82, 84, 85 __DATE__ 59
bugs 114 __DATE_NUM__ 59
bugtracker 114 DB 26, 30
BYTE 113 dbg 86
C calling convention 93, 100 DD 26, 30
C symbol names 91 debug information 18
c16.mac 95, 98 debug information format 18
c32.mac 102 declaring structures 60
CALL FAR 33 DEFAULT 65
case sensitivity 23, 36, 37, 39, 41, 48, 73 default 83
changing sections 65 default macro parameters 43
character constant 26, 29 default name 70
character strings 29 default−WRT mechanism 75
circular references 36 %define 19, 36
CLASS 72 defining sections 65
%clear 58 %defstr 39
coff 16, 81 %depend 51
colon 25 design goals 23
.COM 70, 90 DevPac 26, 34
command−line 16, 70 disabling listing expansion 46
commas in macro parameters 43 division 32
COMMON 67, 72 DJGPP 81, 100
elf extensions to 84 djlink 88
obj extensions to 75 DLL symbols
Common Object File Format 81 exporting 74
common variables 67 importing 74
alignment in elf 84 DO 26, 30
element size 75 DOS 15, 19
comp.lang.asm.x86 14, 15 DOS archive
comp.os.linux.announce 15 DOS source archive 15
comp.os.msdos.programmer 91 DQ 26, 30
concatenating macro parameters 45 .drectve 76
210
DT 26, 30 exebin.mac 89
DUP 24, 27 exec 82
DW 26, 30 Executable and Linkable Format 82
DWORD 26 EXE_end 89
DY 26, 30 EXE_stack 89
−E option 20 %exitrep 50
−e option 20, 118 EXPORT 74
effective addresses 25, 27 export 86
element size, in common variables 75 exporting symbols 67
ELF 16, 82 expressions 20, 32
shared libraries 83 extension 16, 70
16−bit code and 84 EXTERN 67
elf, debug formats and 84 obj extensions to 74
elf, elf32, and elf64 82 rdf extensions to 86
%elif 47, 48 extracting substrings 40
%elifctx 48 −F option 18
%elifdef 47 −f option 17, 70
%elifempty 50 far call 24
%elifid 49 far common variables 75
%elifidn 49 far pointer 33
%elifidni 49 FARCODE 96, 98
%elifmacro 48 %fatal 56
%elifn 47, 48 __FILE__ 59
%elifnctx 48 FLAT 73
%elifndef 47 flat memory model 100
%elifnempty 50 flat−form binary 70
%elifnid 49 FLOAT 68
%elifnidn 49 __FLOAT__ 69
%elifnidni 49 __float128h__ 30
%elifnmacro 48 __float128l__ 30
%elifnnum 49 __float16__ 30
%elifnstr 49 __float32__ 30
%elifntoken 50 __float64__ 30
%elifnum 49 __float8__ 30
%elifstr 49 __float80e__ 30
%eliftoken 50 __float80m__ 30
%else 47 __FLOAT_DAZ__ 69
e−mail 14 float−denorm 22
endproc 95, 102 floating−point
%endrep 50 constants 30, 68
ENDSTRUC 60, 66 packed BCD constants 31
environment 22 floating−point 24, 25, 26, 30
EQU 26, 27 float−overflow 21
%error 56 __FLOAT_ROUND__ 69
error 21 float−toolong 22
error messages 19 float−underflow 22
error reporting format 18 follows= 71
escape sequences 29 format−specific directives 64
EVEN 62 frame pointer 93, 97, 100
exact matches 46 FreeBSD 84, 103
.EXE 71, 88 FreeLink 88
EXE2BIN 90 ftp.kernel.org 15
EXE_begin 89 ftp.simtel.net 88
211
function 83, 86 %ifnstr 49
functions %ifntoken 50
C calling convention 93, 100 %ifnum 49
Pascal calling convention 97 %ifstr 49
−g option 18 %iftoken 50
gas 14 %imacro 40
gcc 14 IMPORT 74
GLOBAL 67 import library 74
aoutb extensions to 83 importing symbols 67
elf extensions to 83 INCBIN 26, 30
rdf extensions to 86 %include 19, 51
global offset table 103 include search path 19
_GLOBAL_OFFSET_TABLE_ 83 including other files 51
gnu−elf−extensions 21 inefficient code 113
..got 83 infinite loop 32
GOT relocations 104 __Infinity__ 31
GOT 83, 103 infinity 31
..gotoff 83 informational section 76
GOTOFF relocations 104 INSTALL 15
..gotpc 83 installing 15
GOTPC relocations 104 instances of structures 61
graphics 26 instruction list 119
greedy macro parameters 42 Intel number formats 31
GROUP 73 internal 83
groups 33 ISTRUC 61
−h 116 iterating over macro parameters 44
hex 28 %ixdefine 37
hidden 83 Jcc NEAR 113
hybrid syntaxes 23 JMP DWORD 107
−I option 19 jumps, mixed−size 107
−i option 19, 117 −k 118
%iassign 39 −l option 17
ibiblio.org 15 label prefix 34
%idefine 36 ld86 85
%idefstr 39 LIBRARY 85
IEND 61 license 14
%if 47, 48 %line 57
%ifctx 48, 53 __LINE__ 59
%ifdef 47 linker, free 88
%ifempty 50 Linux
%ifid 49 a.out 84
%ifidn 48 as86 85
%ifidni 48 ELF 82
%ifmacro 47 listing file 17
%ifn 47, 48 little−endian 29
%ifnctx 48 %local 56
%ifndef 47 local labels 34
%ifnempty 50 logical AND 48
%ifnid 49 logical negation 32
%ifnidn 49 logical OR 48
%ifnidni 49 logical XOR 48
%ifnmacro 48 −M option 17
%ifnnum 49 mac osx 82
212
mach object file format 82 nasm−devel 15
macho 16, 82 NASMENV 22
%macro 40 nasm.exe 15
macro library 19 nasm −hf 17
macro processor 36 __NASM_MAJOR__ 58
macro−defaults 21 __NASM_MINOR__ 58
macro−local labels 42 nasm.out 16
macro−params 21 ___NASM_PATCHLEVEL__ 58
macros 27 __NASM_SNAPSHOT__ 58
macro−selfref 21 __NASM_SUBMINOR__ 58
make 15 __NASM_VER__ 58
makefile dependencies 17 __NASM_VERSION_ID__ 58
makefiles 15 nasm−XXX−dos.zip 15
man pages 15 nasm−XXX.tar.gz 15
map files 71 nasm−XXX−win32.zip 15
MASM 14 nasm−XXX.zip 15
MASM 22, 27, 71 ndisasm 116
−MD option 17 ndisasm.1 15
memory models 24, 92 ndisasm.exe 15
memory operand 26 near call 24
memory references 23, 27 near common variables 75
−MF option 17 NetBSD 84, 103
−MG option 17 new releases 15
Microsoft OMF 71 noalloc 82
minifloat 31 nobits 71, 82
Minix 85 noexec 82
misc subdirectory 89, 95, 102 .nolist 46
mixed−language program 91 ‘nowait’ 24
mixed−size addressing 107 nowrite 82
mixed−size instruction 107 number−overflow 21
MMX registers numeric constants 26, 28
ModR/M byte −O option 20
MODULE 85 −o option 16, 116
modulo operators 32 O16 25
−MP option 18 o16 108
−MQ option 18 O32 25
MS−DOS 70 o32 109
MS−DOS device drivers 91 O64 25
−MT option 18 .OBJ 88
multi−line macros 21, 40 obj 16, 71
multipass optimization 20 object 83, 86
multiple section names 70 octal 28
multiplication 32 OF_DBG 86
multipush macro 44 OF_DEFAULT 17
Multisection 71 OFFSET 23
__NaN__ 31 OMF 71
NaN 31 omitted parameters 43
NASM version 58 one’s complement 32
nasm version history 185 OpenBSD 84, 103
nasm version id 58 operands 25
nasm version string 58 operand−size prefixes 25
nasm.1 15 operating system 70
__NASMDEFSEG 71 writing 107
213
operators 32 protected 83
ORG 70, 90, 91, 113 pseudo−instructions 26
orphan−labels 21, 25 PUBLIC 67, 72
OS/2 71, 73 pure binary 70
osabi 82 %push 52
other preprocessor directives 57 __QNaN__ 31
out of range, jumps 113 quick start 22
output file format 17 QWORD 26
output formats 70 −r 116
__OUTPUT_FORMAT__ 59 rdf 16, 85
overlapping segments 33 rdoff subdirectory 15, 85
OVERLAY 72 redirecting errors 19
overloading REL 28, 65
multi−line macros 41 relational operators 48
single−line macros 37 Relocatable Dynamic Object File Format 85
−P option 19 relocations, PIC−specific 83
−p option 19, 51 removing contexts 52
paradox 34 renaming contexts 53
PASCAL 98 %rep 27, 50
Pascal calling convention 97 repeating 27, 50
__PASS__ 60 %repl 53
passes, assembly reporting bugs 114
PATH 15 RESB 24, 26
%pathsearch 19, 51 RESD 26
period 34 RESO 26
Perl 15 RESQ 26
perverse 19 REST 26
PharLap 72 RESW 26
PIC 83, 84, 103 RESY 26
..plt 83 %rotate 44
PLT relocations 83, 105, 106 rotating macro parameters 44
plt relocations 106 −s option 19, 117
%pop 52 searching for include files 51
position−independent code 83, 84, 103 __SECT__ 65, 66
−−postfix 22 SECTION 65
precedence 32 elf extensions to 82
pre−defining macros 19, 37 win32 extensions to 76
preferred 32 section alignment
−−prefix 22 in bin 71
pre−including files 19 in elf 82
preprocess−only mode 20 in obj 72
preprocessor 20, 27, 32, 36 in win32 76
preprocessor expressions 20 section, bin extensions to 70
preprocessor loops 50 SEG 32, 72
preprocessor variables 39 SEGMENT 65
primitive directives 64 elf extensions to 72
PRIVATE 72 segment address 32
proc 86, 95, 102 segment alignment
procedure linkage table 83, 105, 106 in bin 71
processor mode 64 in obj 72
progbits 71, 82 segment names, Borland Pascal 98
program entry point 74, 88 segment override 23, 25
program origin 70
214
segments 32 TASM 14, 21
groups of 73 tasm 22, 71
separator character 22 TBYTE 24
shared libraries 84, 103 test subdirectory 88
shared library 83 testing
shift command 44 arbitrary numeric expressions 48
SIB byte context stack 48
signed division 32 exact text identity 48
signed modulo 32 multi−line macro existence 47
single−line macros 36 single−line macro existence 47
size, of symbols 83 token types 49
smartalign 63 .text 82, 84, 85
__SNaN__ 31 _TEXT 93
Solaris x86 82 __TIME__ 59
−soname 106 __TIME_NUM__ 59
sound 26 TIMES 26, 27, 34, 113, 114
source code 15 TLINK 90
source−listing file 17 trailing colon 25
square brackets 23, 27 TWORD 24, 26
STACK 72 type, of symbols 83
stack relative preprocessor directives 55 −U option 20
%stacksize 55 −u option 20, 116
standard macro packages 63 unary operators 32
standard macros 58 %undef 20, 39
standardized section names 65, 76, 82, 84, 85 undefining macros 20
..start 74, 88 underscore, in C symbols 91
start= 71 Unicode 29, 30
stderr 19 uninitialized 26
stdout 19 uninitialized storage 24
%strcat 40 Unix 15
STRICT 33 SCO 82
string constant 26 source archive 15
string constants 30 System V 82
string length 40 UnixWare 82
string manipulation in macros 39 %unmacro 46
strings 29 unrolled loops 27
%strlen 40 unsigned division 32
STRUC 60, 66, 95, 102 unsigned modulo 32
stub preprocessor 20 UPPERCASE 23, 73
%substr 40 %use 52, 63
subtraction 32 __USE_*__ 60
suppressible warning 21 USE16 65, 73
suppressing preprocessing 20 USE32 65, 73
switching between sections 65 user 22
..sym 83 user−defined errors 56
symbol sizes, specifying 83 user−level assembler directives 58
symbol types, specifying 83 user−level directives 64
symbols __UTC_DATE__ 59
exporting from DLLs 74 __UTC_DATE_NUM__ 59
importing from DLLs 74 __UTC_TIME__ 59
synchronisation 117 __UTC_TIME_NUM__ 59
.SYS 70, 91 UTF−16 30
−t 21 UTF−32 30
215
UTF−8 29
__utf16__ 30
__utf32__ 30
−v option 22
VAL 88
valid characters 25
variable types 23
version 22
version number of NASM 58
vfollows= 71
Visual C++ 76
vstart= 71
−w option 21
%warning 56
warnings 21
[warning *warning−name] 22
[warning +warning−name] 22
[warning −warning−name] 22
win64 78, 110
Win64 16, 71, 76, 100
Windows 88
Windows 95
Windows NT
write 82
writing operating systems 107
WRT 32, 72, 83, 85
WRT ..got 104
WRT ..gotoff 104
WRT ..gotpc 104
WRT ..plt 106
WRT ..sym 105
WWW page 14
www.cpan.org 15
www.delorie.com 88
www.pcorner.com 88
−X option 18
x2ftp.oulu.fi 88
%xdefine 37
−y option 22
−Z option 19
216