CSCI 240 Assembly Language Programming MASM & Intel Docs C15 TECH DOC 15 6.1 REFERENCE MANUAL
C15_TECH_DOC_15%20MASM%206.1%20REFERENCE%20MANUAL
C15_TECH_DOC_15%20MASM%206.1%20REFERENCE%20MANUAL
C15_TECH_DOC_15%20MASM%206.1%20REFERENCE%20MANUAL
User Manual:
Open the PDF directly: View PDF .
Page Count: 210
Download | |
Open PDF In Browser | View PDF |
CSCI 240 - Assembly Language Programming - MASM & Intel Docs Microsoft MASM 6.1 Reference Guide Title Page Copyright Page Table of Contents Introduction Ch. 1 - Tools Ch. 2 - Directives Ch. 3 - Symbols and Operators Ch. 4 - Processor Ch. 5 - Coprocessor Ch. 6 - Macros Ch. 7 - Tables file:///D|/Kip/AsmBookRelated/MASM_Manuals_PDF/ReferenceGuide.htm [9/8/2002 11:24:03 AM] Reference Microsoft MASM ® Assembly-Language Development System Version 6.1 For MS-DOS® and Windows™ Operating System Microsoft Corporation Filename: LMARFTTL.DOC Project: Template: FRONTA1.DOT Author: Launi Lockard Last Saved By: Mike Eddy Revision #: 4 Page: 1 of 1 Printed: 10/02/00 04:17 PM Information in this document is subject to change without notice. Companies, names, and data used in examples herein are fictitious unless otherwise noted. No part of this document may be reproduced or transmitted in any form or by any means, electronic or mechanical, for any purpose, without the express written permission of Microsoft Corporation. © 1987, 1991, 1992 Microsoft Corporation. All rights reserved. Microsoft, MS, MS-DOS, XENIX, CodeView, and QuickC are registered trademarks and Windows and Windows NT are trademarks of Microsoft Corporation in the USA and other countries. U.S. Patent No. 4955066 IBM is a registered trademark of International Business Machines Corporation. Intel is a registered trademark and 386, 387, 486 are trademarks of Intel Corporation. Timings and encodings in this manual are used with permission of Intel and come from the following publications: Intel Corporation, iAPX 86, 88, 186, and 188 User’s Manual, Programmer’s Reference. Santa Clara, Calif. 1985. Intel Corporation, iAPX 286 Programmer’s Reference Manual including the iAPX 286 Numeric Supplement. Santa Clara, Calif. 1985. Intel Corporation. 80386 Programmer’s Reference Manual. Santa Clara, Calif. 1986. Intel Corporation. 80387 80-bit CHMOS III Numeric Processor Extension. Santa Clara, Calif. 1987. Intel Corporation. i486 Microprocessor Data Sheet. Santa Clara, Calif. 1989. Document No. DB35749-1292 Printed in the United States of America. Filename: LMARFCPY.DOC Project: Template: FRONTA1.DOT Author: Launi Lockard Last Saved By: Launi Lockard Revision #: 3 Page: 2 of 1 Printed: 10/02/00 04:16 PM iii Contents Introduction ........................................................... ix Document Conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x Chapter 1 Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Microsoft® CodeView® Debugger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 CVPACK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 EXEHDR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 EXP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 HELPMAKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 H2INC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 IMPLIB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 LIB. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 LINK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 MASM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 ML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 NMAKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 PWB (Programmer’s WorkBench) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 PWBRMAKE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 QuickHelp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 RM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 UNDEL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Chapter 2 Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Topical Cross-reference for Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Chapter 3 Symbols and Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Topical Cross-reference for Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Topical Cross-reference for Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Predefined Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Run-Time Operators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 40 41 43 44 48 Chapter 4 Processor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Topical Cross-reference for Processor Instructions . . . . . . . . . . . . . . . . . . . . . . . . Interpreting Processor Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Flags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 50 53 53 Filename: LMARFTOC.DOC Project: Template: FRONTA1.DOT Author: Launi Lockard Last Saved By: Launi Lockard Revision #: 4 Page: 3 of 1 Printed: 10/02/00 04:13 PM iv Contents Clock Speeds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Timings on the 8088 and 8086 Processors . . . . . . . . . . . . . . . . . . . . . . . . . . Timings on the 80286–80486 Processors . . . . . . . . . . . . . . . . . . . . . . . . . . . Interpreting Encodings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Interpreting 80386/486 Encoding Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16-Bit Encoding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32-Bit Encoding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Address-Size Prefix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operand-Size Prefix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Encoding Differences for 32-Bit Operations . . . . . . . . . . . . . . . . . . . . . . . . Scaled Index Base Byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AAA ASCII Adjust After Addition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AAD ASCII Adjust Before Division . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AAM ASCII Adjust After Multiply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AAS ASCII Adjust After Subtraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ADC Add With Carry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ADD Add. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . AND Logical AND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ARPL Adjust Requested Privilege Level . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BOUND Check Array Bounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BSF/BSR Bit Scan. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BSWAP Byte Swap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BT/BTC/BTR/BTS Bit Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CALL Call Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CBW Convert Byte to Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CDQ Convert Double to Quad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CLC Clear Carry Flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CLD Clear Direction Flag. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CLI Clear Interrupt Flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CLTS Clear Task Switched Flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CMC Complement Carry Flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CMP Compare Two Operands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CMPS/CMPSB/CMPSW/CMPSD Compare String . . . . . . . . . . . . . . . . . . . . . CMPXCHG Compare and Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CWD Convert Word to Double . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CWDE Convert Word to Extended Double . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DAA Decimal Adjust After Addition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DAS Decimal Adjust After Subtraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DEC Decrement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Filename: LMARFTOC.DOC Project: Template: FRONTA1.DOT Author: Launi Lockard Last Saved By: Launi Lockard Revision #: 4 Page: 4 of 2 Printed: 10/02/00 04:13 PM 54 55 56 56 59 60 60 60 60 60 61 64 64 64 65 65 66 67 68 69 69 70 71 72 73 74 75 75 76 76 76 77 77 79 80 80 81 81 82 82 Contents v DIV Unsigned Divide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 ENTER Make Stack Frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 HLT Halt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 IDIV Signed Divide. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 IMUL Signed Multiply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 IN Input from Port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 INC Increment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 INS/INSB/INSW/INSD Input from Port to String. . . . . . . . . . . . . . . . . . . . . . . 89 INT Interrupt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 INTO Interrupt on Overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 INVD Invalidate Data Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 INVLPG Invalidate TLB Entry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 IRET/IRETD Interrupt Return. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Jcondition Jump Conditionally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 JCXZ/JECXZ Jump if CX is Zero. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 JMP Jump Unconditionally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 LAHF Load Flags into AH Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 LAR Load Access Rights. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 LDS/LES/LFS/LGS/LSS Load Far Pointer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 LEA Load Effective Address . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 LEAVE High Level Procedure Exit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 LES/LFS/LGS Load Far Pointer to Extra Segment . . . . . . . . . . . . . . . . . . . . . . 99 LGDT/LIDT/LLDT Load Descriptor Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 LMSW Load Machine Status Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 LOCK Lock the Bus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 LODS/LODSB/LODSW/LODSD Load Accumulator from String . . . . . . . 101 LOOP/LOOPW/LOOPD Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 LOOPcondition/LOOPconditionW/LOOPconditionD Loop Conditionally . 102 LSL Load Segment Limit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 LSS Load Far Pointer to Stack Segment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 LTR Load Task Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 MOV Move Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 MOV Move to/from Special Registers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 MOVS/MOVSB/MOVSW/MOVSD Move String Data . . . . . . . . . . . . . . . . . 108 MOVSX Move with Sign-Extend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 MOVZX Move with Zero-Extend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 MUL Unsigned Multiply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 NEG Two’s Complement Negation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 NOP No Operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 NOT One’s Complement Negation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Filename: LMARFTOC.DOC Project: Template: FRONTA1.DOT Author: Launi Lockard Last Saved By: Launi Lockard Revision #: 4 Page: 5 of 3 Printed: 10/02/00 04:13 PM vi Contents OR Inclusive OR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . OUT Output to Port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . OUTS/OUTSB/OUTSW/OUTSD Output String to Port . . . . . . . . . . . . . . . . POP Pop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . POPA/POPAD Pop All . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . POPF/POPFD Pop Flags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PUSH/PUSHW/PUSHD Push . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PUSHA/PUSHAD Push All . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PUSHF/PUSHFD Push Flags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . RCL/RCR/ROL/ROR Rotate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . REP Repeat String. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . REPcondition Repeat String Conditionally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . RET/RETN/RETF Return from Procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . ROL/ROR Rotate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SAHF Store AH into Flags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SAL/SAR Shift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SBB Subtract with Borrow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SCAS/SCASB/SCASW/SCASD Scan String Flags . . . . . . . . . . . . . . . . . . . . . SETcondition Set Conditionally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SGDT/SIDT/SLDT Store Descriptor Table . . . . . . . . . . . . . . . . . . . . . . . . . . . SHL/SHR/SAL/SAR Shift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SHLD/SHRD Double Precision Shift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SMSW Store Machine Status Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . STC Set Carry Flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . STD Set Direction Flag. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . STI Set Interrupt Flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . STOS/STOSB/STOSW/STOSD Store String Data . . . . . . . . . . . . . . . . . . . . . STR Store Task Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SUB Subtract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . TEST Logical Compare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . VERR/VERW Verify Read or Write . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WAIT Wait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WBINVD Write Back and Invalidate Data Cache . . . . . . . . . . . . . . . . . . . . . . XADD Exchange and Add . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XCHG Exchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XLAT/XLATB Translate. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XOR Exclusive OR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 113 113 114 115 116 116 117 118 118 120 122 123 124 124 125 125 126 127 128 129 131 133 134 134 134 135 136 136 137 138 139 140 140 141 141 142 Chapter 5 Coprocessor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 Topical Cross-reference for Coprocessor Instructions . . . . . . . . . . . . . . . . . . . . . 146 Filename: LMARFTOC.DOC Project: Template: FRONTA1.DOT Author: Launi Lockard Last Saved By: Launi Lockard Revision #: 4 Page: 6 of 4 Printed: 10/02/00 04:13 PM Contents vii Interpreting Coprocessor Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 F2XM1 2X–1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 FABS Absolute Value. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 FADD/FADDP/FIADD Add. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 FBLD Load BCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 FBSTP Store BCD and Pop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 FCHS Change Sign . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 FCLEX/FNCLEX Clear Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 FCOM/FCOMP/FCOMPP/FICOM/FICOMP Compare . . . . . . . . . . . . . . . . 152 FCOS Cosine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 FDECSTP Decrement Stack Pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 FDISI/FNDISI Disable Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 FDIV/FDIVP/FIDIV Divide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 FDIVR/FDIVRP/FIDIVR Divide Reversed. . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 FENI/FNENI Enable Interrupts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 FFREE Free Register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 FIADD/FISUB/FISUBR/FIMUL/FIDIV/FIDIVR Integer Arithmetic . . . . . 157 FICOM/FICOMP Compare Integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 FILD Load Integer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 FINCSTP Increment Stack Pointer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 FINIT/FNINIT Initialize Coprocessor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 FIST/FISTP Store Integer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 FLD/FILD/FBLD Load . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 FLD1/FLDZ/FLDPI/FLDL2E/FLDL2T/FLDLG2/FLDLN2 Load Constant159 FLDCW Load Control Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 FLDENV/FLDENVW/FLDENVD Load Environment State . . . . . . . . . . . . 161 FMUL/FMULP/FIMUL Multiply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 FNinstruction No-Wait Instructions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 FNOP No Operation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 FPATAN Partial Arctangent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 FPREM Partial Remainder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 FPREM1 Partial Remainder (IEEE Compatible) . . . . . . . . . . . . . . . . . . . . . . . 164 FPTAN Partial Tangent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 FRNDINT Round to Integer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 FRSTOR/FRSTORW/FRSTORD Restore Saved State . . . . . . . . . . . . . . . . . 166 FSAVE/FSAVEW/FSAVED/FNSAVE/FNSAVEW/FNSAVED Save Coprocessor State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 FSCALE Scale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 FSETPM Set Protected Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 FSIN Sine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 Filename: LMARFTOC.DOC Project: Template: FRONTA1.DOT Author: Launi Lockard Last Saved By: Launi Lockard Revision #: 4 Page: 7 of 5 Printed: 10/02/00 04:13 PM viii Contents FSINCOS Sine and Cosine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FSQRT Square Root . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FST/FSTP/FIST/FISTP/FBSTP Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FSTCW/FNSTCW Store Control Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FSTENV/FSTENVW/FSTENVD/FNSTENV/FNSTENVW/FNSTENVD Store Environment State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FSTSW/FNSTSW Store Status Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FSUB/FSUBP/FISUB Subtract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FSUBR/FSUBRP/FISUBR Subtract Reversed . . . . . . . . . . . . . . . . . . . . . . . . . FTST Test for Zero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FUCOM/FUCOMP/FUCOMPP Unordered Compare . . . . . . . . . . . . . . . . . . FWAIT Wait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FXAM Examine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FXCH Exchange Registers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FXTRACT Extract Exponent and Significand . . . . . . . . . . . . . . . . . . . . . . . . . . FYL2X Y log2(X) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FYL2XP1 Y log2(X+1) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 169 169 170 Chapter 6 Macros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIOS.INC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CMACROS.INC, CMACROS.NEW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MS-DOS.INC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MACROS.INC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROLOGUE.INC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WIN.INC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 180 180 180 183 184 185 185 Chapter 7 Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ASCII Codes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Key Codes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MS-DOS Program Segment Prefix (PSP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Color Display Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hexadecimal-Binary-Decimal Conversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 188 190 192 193 194 Filename: LMARFTOC.DOC Project: Template: FRONTA1.DOT Author: Launi Lockard Last Saved By: Launi Lockard Revision #: 4 Page: 8 of 6 Printed: 10/02/00 04:13 PM 170 171 171 172 173 173 174 175 176 176 176 177 ix Introduction This Microsoft ® Macro Assembler Reference lists all MASM instructions, directives, statements, and operators. It also serves as a quick reference to the Programmer’s WorkBench commands, and the commands for Microsoft utilities such as LINK and LIB. This book documents features of MASM version 6.1, and is part of a complete MASM documentation set. Other titles in the set are: Getting Started — Explains how to perform all the tasks necessary to install and begin running MASM 6.1 on your system. Environment and Tools — Describes the development tools that are included with MASM 6.1: the Programmer’s WorkBench, CodeView debugger, LINK, EXEHDR, NMAKE, LIB, and other tools and utilities. A detailed tutorial on the Programmer’s WorkBench teaches the basics of creating and debugging MASM code in this full-featured programming environment. A complete list of utilities and error messages generated by ML is also included. Programmer’s Guide — Provides information for experienced assemblylanguage programmers on the features of the MASM 6.1 language. The appendixes cover the differences between MASM 5.1, MASM 6.0, and MASM 6.1, and the Backus-Naur Form for grammar notation to use in determining the syntax for any MASM language component. Filename: LMARFINT.DOC Template: MSGRIDA1.DOT Revision #: 16 Page: 9 of 2 Project: Author: Terri Sharkey Last Saved By: Launi Lockard Printed: 10/02/00 04:14 PM x Reference Document Conventions The following document conventions are used throughout this book: Example Description SAMPLE 2ASM Uppercase letters indicate filenames, segment names, registers and terms used at the command line. KEY TERMS Bold type indicates text that must be typed exactly as shown. This includes assembly-language instructions, directives, symbols, operators, and keywords in other languages. placeholders Italics indicate variable information supplied by the user. Examples This typeface indicates example programs, user input, and screen output. [[optional items]] Double brackets indicate that the enclosed item is optional. {choice1 | choice2} Braces and a vertical bar indicate a choice between two or more items. You must choose one of the items unless double square brackets surround the braces. Repeating elements... Three dots following an item indicate that you may type more items having the same form. SHIFT+F1 Small capital letters indicate key names. Filename: LMARFINT.DOC Project: Template: MSGRIDA1.DOT Author: Terri Sharkey Last Saved By: Launi Lockard Revision #: 16 Page: 10 of 2 Printed: 10/02/00 04:14 PM 1 C H A P T E R 1 Tools CodeView. . . . CVPACK . . . . EXEHDR . . . . EXP . . . . . . . . HELPMAKE . H2INC . . . . . . IMPLIB . . . . . LIB . . . . . . . . LINK . . . . . . . MASM . . . . . . ML. . . . . . . . . NMAKE . . . . . PWB . . . . . . . PWBRMAKE . QuickHelp. . . . RM . . . . . . . . UNDEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 1 of 1 Printed: 10/02/00 04:13 PM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 3 4 4 6 7 7 8 11 12 14 16 17 18 19 20 2 Reference Microsoft CodeView Debugger ® ® The Microsoft® CodeView® debugger runs the assembled or compiled program while simultaneously displaying the program source code, program variables, memory locations, processor registers, and other pertinent information. Syntax CV [[options]] executablefile [[arguments]] CVW [[options]] executablefile [[arguments]] Options Environment Variables Option Action /2 Permits the use of two monitors. /8 Uses 8514/a as Windows display, and VGA as debugger display (CVW only). /25 Starts in 25-line mode. /43 Starts in 43-line mode. /50 Starts in 50-line mode. /B Starts in black-and-white mode. /Ccommands Executes commands on startup. /F Exchanges screens by flipping between video pages (CV only). /G Eliminates refresh snow on CGA monitors. /I[[0 | 1]] Turns nonmaskable-interrupt and 8259-interrupt trapping on ( / I1) or off ( / I0). /Ldllfile Loads DLL dllfile for debugging (CVW only). /K Disables installation of keyboard monitors for the program being debugged (CV only). /M Disables CodeView use of the mouse. Use this option when debugging an application that supports the mouse. /N[[0 | 1]] /N0 tells CodeView to trap nonmaskable interrupts; /N1 tells it not to trap. /R Enables 80386/486 debug registers (CV only). /S Exchanges screens by changing buffers (primarily for use with graphics programs) (CV only). /TSF Toggles TOOLS.INI entry to read/not read the CURRENT.STS file. Variable Description HELPFILES Specifies path of help files or list of help filenames. INIT Specifies path for TOOLS.INI and CURRENT.STS files. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 2 of 2 Printed: 10/02/00 04:13 PM Error! Style not defined. 3 CVPACK The CVPACK utility reduces the size of an executable file that contains CodeView debugging information. Syntax CVPACK [[options]] exefile Options Option Action /HELP Calls QuickHelp for help on CVPACK. /P Packs the file to the smallest possible size. /? Displays a summary of CVPACK command-line syntax. EXEHDR The EXEHDR utility displays and modifies the contents of an executable-file header. S yntax EXEHDR [[options]] filenames Options Option Action /HEA:number Option name: /HEA[[P]]. Sets the heap allocation field to number bytes for segmented-executable files. /HEL Option name: /HEL[[P]]. Calls QuickHelp for help on EXEHDR. /MA:number Option name: /MA[[X]]. Sets the maximum memory allocation to number paragraphs for DOS executable files. /MI:number Option name: /MI[[N]]. Sets the minimum memory allocation to number paragraphs for DOS executable files. /NE Option name: /NE[[WFILES]]. Enables support for HPFS. /NO Option name: /NO[[LOGO]]. Suppresses the EXEHDR copyright message. /PM:type Option name: /PM[[TYPE]]. Sets the application type for Microsoft Windows®, where type is one of the following: PM (or WINDOWAPI), VIO (or WINDOWCOMPAT), or NOVIO (or NOTWINDOWCOMPAT). /R Option name: /R[[ESETERROR]]. Clears the error bit in the header of a Windows executable file. /S:number Option name: /S[[TACK]]. Sets the stack allocation to number bytes. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 3 of 3 Printed: 10/02/00 04:13 PM 4 EXP Option Action /V Option name: /V[[ERBOSE]]. Provides more information about segmented-executable files, including the default flags in the segment table, all run-time relocations, and additional fields from the header. /? Option name: /?. Displays a summary of EXEHDR commandline syntax. EXP The EXP utility deletes all files in the hidden DELETED subdirectory of the current or specified directory. EXP is used with RM and UNDEL to manage backup files. Syntax EXP [[options]] [[directories]] Options Option Action /HELP Calls QuickHelp for help on EXP. /Q Suppresses display of deleted files. /R Recurses into subdirectories of the current or specified directory. /? Displays a summary of EXP command-line syntax. HELPMAKE The HELPMAKE utility creates help files and customizes the help files supplied with Microsoft language products. Syntax HELPMAKE {/ E[[n]] | / D[[c]] | / H | /?} [[options]] sourcefiles Options Option Action /Ac Specifies c as an application-specific control character for the help database, marking a line that contains special information for internal use by the application. /C Indicates that the context strings are case sensitive so that at run time all searches for help topics are case sensitive. /D Fully decodes the help database. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 4 of 4 Printed: 10/02/00 04:13 PM Error! Style not defined. 5 Option Action /DS Splits the concatenated, compressed help database into its components, using their original names. No decompression occurs. /DU Decompresses the database and removes all screen formatting and cross-references. /E[[n]] Creates (“encodes”) a help database from a specified text file (or files). The optional n indicates the amount of compression to take place. The value of n can range from 0 to 15. /H[[ELP]] Calls the QuickHelp utility. If HELPMAKE cannot find QuickHelp or the help file, it displays a summary of HELPMAKE command-line syntax. /Kfilename Specifies a file containing word-separator characters. This file must contain a single line of characters that separate words. ASCII characters from 0 to 32 (including the space) and character 127 are always separators. If the /K option is not specified, the following characters are also considered separators: !”#&’( )*+-,/:;<=>?@[\]^_`{\}~ /L Locks the generated file so that it cannot be decoded by HELPMAKE at a later time. /NOLOGO Suppresses the HELPMAKE copyright message. /Ooutfile Specifies outfile as the name of the help database. The name outfile is optional with the /D option. /Sn Specifies the type of input file, according to the following values for n: /S1 Rich Text Format /S2 QuickHelp Format /S3 Minimally Formatted ASCII /T During encoding, translates dot commands to applicationspecific commands. During decoding, translates application commands to dot commands. The /T option forces /A:. /V[[n]] Sets the verbosity of the diagnostic and informational output, depending on the value of n. The value of n can range from 0 to 6. /Wwidth Sets the fixed width of the resulting help text in number of characters. The value of width can range from 11 to 255. /? Displays a summary of HELPMAKE command-line syntax. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 5 of 5 Printed: 10/02/00 04:13 PM 6 H2INC H2INC The H2INC utility converts C header (.H) files into MASM-compatible include (.INC) files. It translates declarations and prototypes, but does not translate code. Syntax H2INC [[options]] filename.H Options Option* Action /C Passes comments in the .H file to the .INC file. /Fa[[filename]] Specifies that the output file contain only equivalent MASM statements. This is the default. /Fc[[filename]] Specifies that the output file contain equivalent MASM statements plus original C statements converted to comment lines. /HELP Calls QuickHelp for help on H2INC. /Ht Enables generation of text equates. By default, text items are not translated. /Mn Instructs H2INC to explicitly declare the distances for all pointers and functions. /Ni Suppresses the expansion of nested include files. /Zn string Adds string to all names generated by H2INC. Used to eliminate name conflicts with other H2INC-generated include files. /Zu Makes all structure and union tag names unique. /? Displays a summary of H2INC command-line syntax. *H2INC also supports the following options from Microsoft C, version 6.0 and higher: /AC, /AH, /AL, /AM, /AS, /AT, / D, / F, / Fi, /G0, /G1, /G2, /G3, /G4, /Gc, /Gd, /Gr, / I, /J, / Tc, /U, /u, / W0, / W1, / W2, / W3, / W4, / X, / Za, / Zc, / Ze, / Zp1, / Zp2, / Zp4. Environment Variables Variable Description CL Specifies default command-line options. H2INC Specifies default command-line options. Appended after the CL environment variable. INCLUDE Specifies search path for include files. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 6 of 6 Printed: 10/02/00 04:13 PM Error! Style not defined. 7 IMPLIB The IMPLIB utility creates import libraries used by LINK to link dynamic-link libraries with applications. Syntax IMPLIB [[options]] implibname {dllfile... | deffile...} Options Option Action /H Option name: /H[[ELP]]. Calls QuickHelp for help on IMPLIB. /NOI Option name: /NOI[[GNORECASE]]. Preserves case for entry names in DLLs. /NOL Option name: /NOL[[OGO]]. Suppresses the IMPLIB copyright message. /? Option name: /?. Displays a summary of IMPLIB commandline syntax. LIB The LIB utility helps create, organize, and maintain run-time libraries. Syntax LIB inlibrary [[options]] [[commands]] [[, [[listfile]] [[, [[outlibrary]] ]] ]] [[;]] Options Option Action /H Option name: /H[[ELP]]. Calls QuickHelp for help on LIB. /I Option name: /I[[GNORECASE]]. Tells LIB to ignore case when comparing symbols (the default). Use to combine a library marked /NOI with an unmarked library to create a new case-insensitive library. /NOE Option name: NOE[[XTDICTIONARY]]. Prevents LIB from creating an extended dictionary. /NOI Option name: /NOI[[GNORECASE]]. Tells LIB to preserve case when comparing symbols. When combining libraries, if any library is marked /NOI, the output library is case sensitive, unless /IGN is specified. /NOL Option name: /NOL[[OGO]]. Suppresses the LIB copyright message. Option Action /P:number Option name: /P[[AGESIZE]]. Specifies the page size (in bytes) of a new library or changes the page size of an existing library. The default for a new library is 16. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 7 of 7 Printed: 10/02/00 04:13 PM 8 LINK Commands /? Option name: /?. Displays a summary of LIB command-line syntax. Operator Action +name Appends an object file or library file. –name Deletes a module. –+name Replaces a module by deleting it and appending an object file with the same name. *name Copies a module to a new object file. –*name Moves a module out of the library by copying it to a new object file and then deleting it. LINK The LINK utility combines object files into a single executable file or dynamiclink library. Syntax LINK objfiles [[, [[exefile]] [[, [[mapfile]] [[, [[libraries]] [[, [[deffile]] ]] ]] ]] ]] [[;]] Options Option Action /A:size Option name: /A[[LIGNMENT]]. Directs LINK to align segment data in a segmented-executable file along the boundaries specified by size bytes, where size must be a power of two. /B Option name: /B[[ATCH]]. Suppresses prompts for library or object files not found. /CO Option name: /CO[[DEVIEW]]. Adds symbolic data and line numbers needed by the Microsoft CodeView debugger. This option is incompatible with the /EXEPACK option. /CP:number Option name: /CP[[ARMAXALLOC]]. Sets the program’s maximum memory allocation to number of 16-byte paragraphs. /DO Option name: /DO[[SSEG]]. Orders segments in the default order used by Microsoft high-level languages. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 8 of 8 Printed: 10/02/00 04:13 PM Error! Style not defined. 9 Option Action /DS Option name: /DS[[ALLOCATE]]. Directs LINK to load all data starting at the high end of the data segment. The /DSALLOC option is for assembly-language programs that create MS-DOS .EXE files. /E Option name: /E[[XEPACK]]. Packs the executable file. The /EXEPACK option is incompatible with /INCR and /CO. Do not use /EXEPACK on a Windows-based application. /F Option name: /F[[ARCALLTRANSLATION]]. Optimizes far calls. The /FARCALL option is automatically on when using /TINY. The /PACKC option is not recommended with /FARCALL when linking a Windows-based program. /HE Option name: /HE[[LP]]. Calls QuickHelp for help on LINK. /HI Option name: /HI[[GH]]. Places the executable file as high in memory as possible. Use /HIGH with the /DSALLOC option. This option is for assembly-language programs that create MSDOS .EXE files. /INC Option name: /INC[[REMENTAL]]. Prepares for incremental linking with ILINK. This option is incompatible with /EXEPACK and /TINY. /INF Option name: /INF[[ORMATION]]. Displays to the standard output the phase of linking and names of object files being linked. /LI Option name: /LI[[NENUMBERS]]. Adds source file line numbers and associated addresses to the map file. The object file must be created with line numbers. This option creates a map file even if mapfile is not specified. /M Option name: /M[[AP]]. Adds public symbols to the map file. /NOD[[:libraryname]] Option name: /NOD[[EFAULTLIBRARYSEARCH]]. Ignores the specified default library. Specify without libraryname to ignore all default libraries. /NOE Option name: /NOE[[XTDICTIONARY]]. Prevents LINK from searching extended dictionaries in libraries. Use /NOE when redefinition of a symbol causes error L2044. /NOF Option name: /NOF[[ARCALLTRANSLATION]]. Turns off far-call optimization. /NOI Option name: /NOI[[GNORECASE]]. Preserves case in identifiers. /NOL Option name: /NOL[[OGO]]. Suppresses the LINK copyright message. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 9 of 9 Printed: 10/02/00 04:13 PM 10 LINK Option Action /NON Option name: /NON[[ULLSDOSSEG]]. Orders segments as with the /DOSSEG option, but with no additional bytes at the beginning of the _TEXT segment (if defined). This option overrides /DOSSEG. /NOP Option name: /NOP[[ACKCODE]]. Turns off code segment packing. /PACKC[[:number]] Option name: /PACKC[[ODE]]. Packs neighboring code segments together. Specify number bytes to set the maximum size for physical segments formed by /PACKC. /PACKD[[:number]] Option name: /PACKD[[ATA]]. Packs neighboring data segments together. Specify number bytes to set the maximum size for physical segments formed by /PACKD. This option is for Windows only. /PAU Option name: /PAU[[SE]]. Pauses during the link session for disk changes. /PM:type Option name: /PM[[TYPE]]. Specifies the type of Windowsbased application where type is one of the following: PM (or WINDOWAPI), VIO (or WINDOWCOMPAT), or NOVIO (or NOTWINDOWCOMPAT). /ST:number Option name: /ST[[ACK]]. Sets the stack size to number bytes, from 1 byte to 64K. /T Option name: /T[[INY]]. Creates a tiny-model MS-DOS program with a .COM extension instead of .EXE. Incompatible with /INCR. /? Option name: /?. Displays a summary of LINK command-line syntax. Note Several rarely used options not listed here are described in Help. Environment Variables Variable Description INIT Specifies path for the TOOLS.INI file. LIB Specifies search path for library files. LINK Specifies default command-line options. TMP Specifies path for the VM.TMP file. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 10 of 10 Printed: 10/02/00 04:13 PM Error! Style not defined. 11 MASM The MASM program converts command-line options from MASM style to ML style, adds options to maximize compatibility, and calls ML.EXE. Note MASM.EXE is provided to maintain compatibility with old makefiles. For new makefiles, use the more powerful ML driver. Syntax MASM [[options]] sourcefile [[, [[objectfile]] [[, [[listingfile]] [[, [[crossreferencefile]] ]] ]] ]] [[;]] Options Option Action /A Orders segments alphabetically. Results in a warning. Ignored. /B Sets internal buffer size. Ignored. /C Creates a cross-reference file. Translated to /FR. /D Creates a Pass 1 listing.Translated to F1/ST. /Dsymbol[[=value]] Defines a symbol. Unchanged. /E Emulates floating-point instructions. Translated to /FPi. /H Lists command-line arguments. Translated to /help. /HELP Calls QuickHelp for help on the MASM driver. /I pathname Specifies an include path. Unchanged. /L Creates a normal listing. Translated to /Fl. /LA Lists all. Translated to /Fl and /Sa. /ML Treats names as case sensitive. Translated to /Cp. /MU Converts names to uppercase. Translated to /Cu. /MX Preserves case on nonlocal names. Translated to /Cx. /N Suppresses table in listing file. Translated to /Sn. /P Checks for impure code. Use OPTION READONLY. Ignored. /S Orders segments sequentially. Results in a warning. Ignored. /T Enables terse assembly. Translated to /NOLOGO. /V Enables verbose assembly. Ignored. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 11 of 11 Printed: 10/02/00 04:13 PM 12 ML Environment Variables Option Action /Wlevel Sets warning level, where level = 0, 1, or 2. /X Lists false conditionals. Translated to /Sx. /Z Displays error lines on screen. Ignored. /ZD Generates line numbers for CodeView. Translated to /Zd. /ZI Generates symbols for CodeView. Translated to /Zi. Variable Description INCLUDE Specifies default path for .INC files. MASM Specifies default command-line options. TMP Specifies path for temporary files. ML The ML program assembles and links one or more assembly-language source files. The command-line options are case sensitive. Syntax ML [[options]] filename [[ [[options]] filename]]... [[/ link linkoptions]] Options Option Action /AT Enables tiny-memory-model support. Enables error messages for code constructs that violate the requirements for .COM format files. Note that this is not equivalent to the .MODEL TINY directive. /Bl filename Selects an alternate linker. /c Assembles only. Does not link. /Cp Preserves case of all user identifiers. /Cu Maps all identifiers to uppercase (default). /Cx Preserves case in public and extern symbols. /Dsymbol[[=value]] Defines a text macro with the given name. If value is missing, it is blank. Multiple tokens separated by spaces must be enclosed in quotation marks. /EP Generates a preprocessed source listing (sent to STDOUT). See /Sf. /Fhexnum Sets stack size to hexnum bytes (this is the same as /link /STACK:number). The value must be expressed in hexadecimal notation. There must be a space between /F and hexnum. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 12 of 12 Printed: 10/02/00 04:13 PM Error! Style not defined. 13 Option Action /Fefilename Names the executable file. /Fl[[filename]] Generates an assembled code listing. See /Sf. /Fm[[filename]] Creates a linker map file. /Fofilename Names an object file. /FPi Generates emulator fixups for floating-point arithmetic (mixedlanguage only). /Fr[[filename]] Generates a Source Browser .SBR file. /FR[[filename]] Generates an extended form of a Source Browser .SBR file. /Gc Specifies use of FORTRAN- or Pascal-style function calling and naming conventions. Same as OPTION LANGUAGE:PASCAL. /Gd Specifies use of C-style function calling and naming conventions. Same as OPTION LANGUAGE:C. /H number Restricts external names to number significant characters. The default is 31 characters. /help Calls QuickHelp for help on ML. /I pathname Sets path for include file. A maximum of 10 /I options is allowed. /nologo Suppresses messages for successful assembly. /Sa Turns on listing of all available information. /Sc Adds instruction timings to listing file. /Sf Adds first-pass listing to listing file. /Sg Turns on listing of assembly-generated code. /Sl width Sets the line width of source listing in characters per line. Range is 60 to 255 or 0. Default is 0. Same as PAGE width. /Sn Turns off symbol table when producing a listing. /Sp length Sets the page length of source listing in lines per page. Range is 10 to 255 or 0. Default is 0. Same as PAGE length. /Ss text Specifies text for source listing. Same as SUBTITLE text. /St text Specifies title for source listing. Same as TITLE text. /Sx Turns on false conditionals in listing. /Ta filename Assembles source file whose name does not end with the .ASM extension. /w Same as /W0. /Wlevel Sets the warning level, where level = 0, 1, 2, or 3. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 13 of 13 Printed: 10/02/00 04:13 PM 14 NMAKE QuickAssembler Support Environment Variables Option Action /WX Returns an error code if warnings are generated. /Zd Generates line-number information in object file. /Zf Makes all symbols public. /Zi Generates CodeView information in object file. /Zm Enables M510 option for maximum compatibility with MASM 5.1. /Zp[[alignment]] Packs structures on the specified byte boundary. The alignment may be 1, 2, or 4. /Zs Performs a syntax check only. /? Displays a summary of ML command-line syntax. For compatibility with QuickAssembler makefiles, ML recognizes these options: Option Action /a Orders segments alphabetically in QuickAssembler. MASM 6.1 uses the .ALPHA directive for alphabetical ordering and ignores /a. /Cl Equivalent to /Cp. /Ez Prints the source for error lines to the screen. MASM 6.1 ignores this option. /P1 Performs one-pass assembly. MASM 6.1 ignores this option. /P2 Performs two-pass assembly. MASM 6.1 ignores this option. /s Orders segments sequentially. MASM 6.1 uses the .SEQ directive for sequential ordering and ignores /s. /Sq Equivalent to /Sl0 /Sp0. Variable Description INCLUDE Specifies search path for include files. ML Specifies default command-line options. TMP Specifies path for temporary files. NMAKE The NMAKE utility automates the process of compiling and linking project files. Syntax NMAKE [[options]] [[macros]] [[targets]] Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 14 of 14 Printed: 10/02/00 04:13 PM Error! Style not defined. Options Environment Variable 15 Option Action /A Executes all commands even if targets are not out-of-date. /C Suppresses the NMAKE copyright message and prevents nonfatal error or warning messages from being displayed. /D Displays the modification time of each file when the times of targets and dependents are checked. /E Causes environment variables to override macro definitions within description files. /F filename Specifies filename as the name of the description file to use. If a dash (–) is entered instead of a filename, NMAKE reads the description file from the standard input device. If /F is not specified, NMAKE uses MAKEFILE as the description file. If MAKEFILE does not exist, NMAKE builds command-line targets using inference rules. /HELP Calls QuickHelp for help on NMAKE. /I Ignores exit codes from commands in the description file. NMAKE continues executing the rest of the description file despite the errors. /N Displays but does not execute commands from the description file. /NOLOGO Suppresses the NMAKE copyright message. /P Displays all macro definitions, inference rules, target descriptions, and the .SUFFIXES list. /Q Checks modification times of command-line targets (or first target in the description file if no command-line targets are specified). NMAKE returns a zero exit code if all such targets are up-to-date and a nonzero exit code if any target is out-of-date. Only preprocessing commands in the description file are executed. /R Ignores inference rules and macros that are predefined or defined in the TOOLS.INI file. /S Suppresses display of commands as they are executed. /T Changes modification times of command-line targets (or first target in the description file if no command-line targets are specified) to the current time. Only preprocessing commands in the description file are executed. The contents of target files are not modified. /X filename Sends all error output to filename, which can be either a file or a device. If a dash (–) is entered instead of a filename, the error output is sent to the standard output device. /Z Internal option for use by the Microsoft Programmer’s WorkBench (PWB). /? Displays a summary of NMAKE command-line syntax. Variable Description INIT Specifies path for TOOLS.INI file, which may contain macros, inference rules, and description blocks. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 15 of 15 Printed: 10/02/00 04:13 PM 16 PWB (Programmer’s WorkBench) PWB (Programmer’s WorkBench) The Microsoft Programmer’s WorkBench (PWB) provides an integrated environment for developing programs in assembly language. The command-line options are case sensitive. Syntax PWB [[options]] [[files]] Options Option Action /D[[init]] Prevents PWB from examining initialization files, where init is one or more of the following characters: A Disable autoload extensions (including languagespecific extensions and Help). S Ignore CURRENT.STS. T Ignore TOOLS.INI. If the /D option does not include an init character, it is equivalent to specifying /DAST (all files and extensions ignored). /e cmdstr Executes the command or sequence of commands at start-up. The entire cmdstr argument must be placed in double quotation marks if it contains a space. If cmdstr contains literal double quotation marks, place a backslash ( \) in front of each double quotation mark. To include a literal backslash in the command string, use double backslashes ( \\). /m mark Moves the cursor to the specified mark instead of moving it to the last known position. The mark can be a line number. /P[[init]] Specifies a program list for PWB to read, where init can be: /r Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 16 of 16 Printed: 10/02/00 04:13 PM Ffile Read a foreign program list (one not created using PWB). L Read the last program list. Use this option to start PWB in the same state you left it. Pfile Read a PWB program list. Starts PWB in no-edit mode. Functions that modify files are disallowed. Error! Style not defined. 17 Option Action [[/t]] file... Loads the specified file at startup. The file specification can contain wildcards. If multiple files are specified, PWB loads only the first file. When the Exit function is invoked, PWB saves the current file and loads the next file in the list. Files specified with /t are temporary; PWB does not add them to the file history on the File menu. No other options can follow /t on the command line. Each temporary file must be specified in a separate /t option. Environment Variables /? Displays a summary of PWB command-line syntax. Variable Description HELPFILES Specifies path of help files or list of help filenames. INIT Specifies path for TOOLS.INI and CURRENT.STS files. TMP Specifies path for temporary files. PWBRMAKE PWBRMAKE converts the .SBR files created by the assembler into database .BSC files that can be read by the Microsoft Programmer’s WorkBench (PWB) Source Browser. The command-line options are case sensitive. Syntax PWBRMAKE [[options]] sbrfiles Options Option Action /Ei filename /Ei (filename...) Excludes the contents of the specified include files from the database. To specify multiple filenames, separate them with spaces and enclose the list in parentheses. /Em Excludes symbols in the body of macros. Use /Em to include only macro names. /Es Excludes from the database every include file specified with an absolute path or found in an absolute path specified in the INCLUDE environment variable. /HELP Calls QuickHelp for help on PWBRMAKE. /Iu Includes unreferenced symbols. /n Forces a nonincremental build and prevents truncation of .SBR files. /o filename Specifies a name for the database file. /v Displays verbose output. /? Displays a summary of PWBRMAKE command-line syntax. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 17 of 17 Printed: 10/02/00 04:13 PM 18 QuickHelp QuickHelp The QuickHelp utility displays Help files. All MASM reserved words and error messages can be used for topic. Syntax QH [[options]] [[topic]] Options Option Action /d filename Specifies either a specific database name or a path where the databases are found. /lnumber Specifies the number of lines the QuickHelp window should occupy. /mnumber Changes the screen mode to display the specified number of lines, where number is in the range 25 to 60. /p filename Sets the name of the paste file. /pa[[filename]] Specifies that pasting operations are appended to the current paste file (rather than overwriting the file). /q Prevents the version box from being displayed when QuickHelp is installed as a keyboard monitor. /r command Specifies the command that QuickHelp should execute when the right mouse button is pressed. The command can be one of the following letters: /s Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 18 of 18 Printed: 10/02/00 04:13 PM l Display last topic i Display history of help topics w Hide window b Display previous topic e Find next topic t Display contents Specifies that clicking the mouse above or below the scroll box causes QuickHelp to scroll by lines rather than pages. Error! Style not defined. Option Action /t name Directs QuickHelp to copy the specified section of the given topic to the current paste file and exit. The name may be: All Paste the entire topic Syntax Paste the syntax only Example Paste the example only If the topic is not found, QuickHelp returns an exit code of 1. Environment Variables /u Specifies that QuickHelp is being run by a utility. If the topic specified on the command line is not found, QuickHelp immediately exits with an exit code of 3. Variable Description HELPFILES Specifies path of help files or list of help filenames. QH Specifies default command-line options. TMP Specifies directory of default paste file. RM The RM utility moves a file to a hidden DELETED subdirectory of the directory containing the file. Use the UNDEL utility to recover the file and the EXP utility to mark the hidden file for deletion. Syntax RM [[options]] [[files]] Options Option Action /F Deletes read-only files without prompting. /HELP Calls QuickHelp for help on RM. /I Inquires for permission before removing each file. /K Keeps read-only files without prompting. /R directory Recurses into subdirectories of the specified directory. /? Displays a summary of RM command-line syntax. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 19 of 19 Printed: 10/02/00 04:13 PM 19 20 UNDEL UNDEL The UNDEL utility moves a file from a hidden DELETED subdirectory to the parent directory. UNDEL is used along with EXP and RM to manage backup files. Syntax UNDEL [[{option | files}]] Options Option Action /HELP Calls QuickHelp for help on UNDEL. /? Displays a summary of UNDEL command-line syntax. Filename: LMARFC01.DOC Project: MASM 6.1 Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 54 Page: 20 of 20 Printed: 10/02/00 04:13 PM 21 C H A P T E R 2 Directives Topical Cross-reference for Directives. . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Directives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 21 of 1 Printed: 10/02/00 04:14 PM 22 Reference Topical Cross-reference for Directives Code Labels ALIGN EVEN LABEL ORG Conditional Assembly ELSE ELSEIF ELSEIF2 ENDIF IF IF2 IFB/IFNB IFE IFDEF/IFNDEF IFIDN/IFIDNI IFDIF/IFDIFI Conditional Control Flow .BREAK .ELSEIF .IF .UNTILCXZ .CONTINUE .ENDIF .REPEAT .WHILE .ELSE .ENDW .UNTIL/ .ERR2 .ERRDIF/.ERRDIFI .ERRNB .ERRB .ERRE .ERRNDEF BYTE/SBYTE FWORD QWORD REAL10 DWORD/SDWORD LABEL REAL4 TBYTE Conditional Error .ERR .ERRDEF .ERRIDN/.ERRIDNI .ERRNZ Data Allocation ALIGN EVEN ORG REAL8 WORD/SWORD Equates = EQU TEXTEQU Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 22 of 2 Printed: 10/02/00 04:14 PM Directives Listing Control .CREF .LIST .LISTALL .LISTIF .LISTMACRO .LISTMACROALL .NOCREF .NOLIST .NOLISTIF .NOLISTMACRO PAGE SUBTITLE .TFCOND TITLE Macros ENDM EXITM GOTO LOCAL MACRO PURGE COMMENT INCLUDE POPCONTEXT ECHO INCLUDELIB PUSHCONTEXT INVOKE USES PROC .286 .386 .486 .8087 .286P .386P .486P .NO87 FOR REPEAT FORC WHILE EXTERN PUBLIC EXTERNDEF Miscellaneous ASSUME END OPTION .RADIX Procedures ENDP PROTO Processor .186 .287 .387 .8086 Repeat Blocks ENDM GOTO Scope COMM INCLUDELIB Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 23 of 3 Printed: 10/02/00 04:14 PM 23 24 Reference Segment .ALPHA ASSUME .DOSSEG END ENDS GROUP SEGMENT .SEQ Simplified Segment .CODE .CONST .DATA .DATA? .DOSSEG .EXIT .FARDATA .FARDATA? .MODEL .STACK .STARTUP String CATSTR SIZESTR INSTR SUBSTR Structure and Record ENDS TYPEDEF Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 24 of 4 Printed: 10/02/00 04:14 PM RECORD UNION STRUCT Directives 25 Directives name = expression Assigns the numeric value of expression to name. The symbol may be redefined later. .186 Enables assembly of instructions for the 80186 processor; disables assembly of instructions introduced with later processors. Also enables 8087 instructions. .286 Enables assembly of nonprivileged instructions for the 80286 processor; disables assembly of instructions introduced with later processors. Also enables 80287 instructions. .286P Enables assembly of all instructions (including privileged) for the 80286 processor; disables assembly of instructions introduced with later processors. Also enables 80287 instructions. .287 Enables assembly of instructions for the 80287 coprocessor; disables assembly of instructions introduced with later coprocessors. .386 Enables assembly of nonprivileged instructions for the 80386 processor; disables assembly of instructions introduced with later processors. Also enables 80387 instructions. .386P Enables assembly of all instructions (including privileged) for the 80386 processor; disables assembly of instructions introduced with later processors. Also enables 80387 instructions. .387 Enables assembly of instructions for the 80387 coprocessor. .486 Enables assembly of nonprivileged instructions for the 80486 processor. .486P Enables assembly of all instructions (including privileged) for the 80486 processor. .8086 Enables assembly of 8086 instructions (and the identical 8088 instructions); disables assembly of instructions introduced with later processors. Also enables 8087 instructions. This is the default mode for processors. Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 25 of 5 Printed: 10/02/00 04:14 PM 26 Reference .8087 Enables assembly of 8087 instructions; disables assembly of instructions introduced with later coprocessors. This is the default mode for coprocessors. ALIGN [[number]] Aligns the next variable or instruction on a byte that is a multiple of number. .ALPHA Orders segments alphabetically. ASSUME segregister:name [[, segregister:name]]... ASSUME dataregister:type [[, dataregister:type]]... ASSUME register:ERROR [[, register:ERROR]]... ASSUME [[register:]] NOTHING [[, register:NOTHING]]... Enables error-checking for register values. After an ASSUME is put into effect, the assembler watches for changes to the values of the given registers. ERROR generates an error if the register is used. NOTHING removes register error-checking. You can combine different kinds of assumptions in one statement. .BREAK [[.IF condition]] Generates code to terminate a .WHILE or .REPEAT block if condition is true. [[name]] BYTE initializer [[, initializer]] ... Allocates and optionally initializes a byte of storage for each initializer. Can also be used as a type specifier anywhere a type is legal. name CATSTR [[textitem1 [[, textitem2]] ...]] Concatenates text items. Each text item can be a literal string, a constant preceded by a %, or the string returned by a macro function. .CODE [[name]] When used with .MODEL, indicates the start of a code segment called name (the default segment name is _TEXT for tiny, small, compact, and flat models, or module_TEXT for other models). COMM definition [[, definition]] ... Creates a communal variable with the attributes specified in definition. Each definition has the following form: [[langtype]] [[NEAR | FAR]] label:type[[:count]] The label is the name of the variable. The type can be any type specifier (BYTE, WORD, and so on) or an integer specifying the number of bytes. The count specifies the number of data objects (one is the default). COMMENT delimiter [[text]] [[text]] [[text]] delimiter [[text]] Treats all text between or on the same line as the delimiters as a comment. Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 26 of 6 Printed: 10/02/00 04:14 PM Directives 27 .CONST When used with .MODEL, starts a constant data segment (with segment name CONST). This segment has the read-only attribute. .CONTINUE [[.IF condition]] Generates code to jump to the top of a .WHILE or .REPEAT block if condition is true. .CREF Enables listing of symbols in the symbol portion of the symbol table and browser file. .DATA When used with .MODEL, starts a near data segment for initialized data (segment name _DATA). .DATA? When used with .MODEL, starts a near data segment for uninitialized data (segment name _BSS). .DOSSEG Orders the segments according to the MS-DOS segment convention: CODE first, then segments not in DGROUP, and then segments in DGROUP. The segments in DGROUP follow this order: segments not in BSS or STACK, then BSS segments, and finally STACK segments. Primarily used for ensuring CodeView support in MASM stand-alone programs. Same as DOSSEG. DOSSEG Identical to .DOSSEG, which is the preferred form. DB Can be used to define data like BYTE. DD Can be used to define data like DWORD. DF Can be used to define data like FWORD. DQ Can be used to define data like QWORD. DT Can be used to define data like TBYTE. DW Can be used to define data like WORD. [[name]] DWORD initializer [[, initializer]]... Allocates and optionally initializes a doubleword (4 bytes) of storage for each initializer. Can also be used as a type specifier anywhere a type is legal. Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 27 of 7 Printed: 10/02/00 04:14 PM 28 Reference ECHO message Displays message to the standard output device (by default, the screen). Same as %OUT. .ELSE See .IF. ELSE Marks the beginning of an alternate block within a conditional block. See IF. ELSEIF Combines ELSE and IF into one statement. See IF. ELSEIF2 ELSEIF block evaluated on every assembly pass if OPTION:SETIF2 is TRUE. END [[address]] Marks the end of a module and, optionally, sets the program entry point to address. .ENDIF See .IF. ENDIF See IF. ENDM Terminates a macro or repeat block. See MACRO, FOR, FORC, REPEAT, or WHILE. name ENDP Marks the end of procedure name previously begun with PROC. See PROC. name ENDS Marks the end of segment, structure, or union name previously begun with SEGMENT, STRUCT, UNION, or a simplified segment directive. .ENDW See .WHILE. name EQU expression Assigns numeric value of expression to name. The name cannot be redefined later. name EQUAssigns specified text to name. The name can be assigned a different text later. See TEXTEQU. .ERR [[message]] Generates an error. Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 28 of 8 Printed: 10/02/00 04:14 PM Directives 29 .ERR2 [[message]] .ERR block evaluated on every assembly pass if OPTION:SETIF2 is TRUE. .ERRB [[, message]] Generates an error if textitem is blank. .ERRDEF name [[, message]] Generates an error if name is a previously defined label, variable, or symbol. .ERRDIF[[I]] , [[, message]] Generates an error if the text items are different. If I is given, the comparison is case insensitive. .ERRE expression [[, message]] Generates an error if expression is false (0). .ERRIDN[[I]] , [[, message]] Generates an error if the text items are identical. If I is given, the comparison is case insensitive. .ERRNB [[, message]] Generates an error if textitem is not blank. .ERRNDEF name [[, message]] Generates an error if name has not been defined. .ERRNZ expression [[, message]] Generates an error if expression is true (nonzero). EVEN Aligns the next variable or instruction on an even byte. .EXIT [[expression]] Generates termination code. Returns optional expression to shell. EXITM [[textitem]] Terminates expansion of the current repeat or macro block and begins assembly of the next statement outside the block. In a macro function, textitem is the value returned. EXTERN [[langtype]] name [[(altid)]] :type [[, [[langtype]] name [[(altid)]] :type]]... Defines one or more external variables, labels, or symbols called name whose type is type. The type can be ABS, which imports name as a constant. Same as EXTRN. EXTERNDEF [[langtype]] name:type [[, [[langtype]] name:type]]... Defines one or more external variables, labels, or symbols called name whose type is type. If name is defined in the module, it is treated as PUBLIC. If name is referenced in the module, it is treated as EXTERN. If name is not referenced, it is ignored. The type can be ABS, which imports name as a constant. Normally used in include files. Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 29 of 9 Printed: 10/02/00 04:14 PM 30 Reference EXTRN See EXTERN. .FARDATA [[name]] When used with .MODEL, starts a far data segment for initialized data (segment name FAR_DATA or name). .FARDATA? [[name]] When used with .MODEL, starts a far data segment for uninitialized data (segment name FAR_BSS or name). FOR parameter [[:REQ | :=default]] , statements ENDM Marks a block that will be repeated once for each argument, with the current argument replacing parameter on each repetition. Same as IRP. FORC parameter, statements ENDM Marks a block that will be repeated once for each character in string, with the current character replacing parameter on each repetition. Same as IRPC. [[name]] FWORD initializer [[, initializer]]... Allocates and optionally initializes 6 bytes of storage for each initializer. Also can be used as a type specifier anywhere a type is legal. GOTO macrolabel Transfers assembly to the line marked :macrolabel. GOTO is permitted only inside MACRO, FOR, FORC, REPEAT, and WHILE blocks. The label must be the only directive on the line and must be preceded by a leading colon. name GROUP segment [[, segment]]... Add the specified segments to the group called name. .IF condition1 statements [[.ELSEIF condition2 statements]] [[.ELSE statements]] .ENDIF Generates code that tests condition1 (for example, AX > 7) and executes the statements if that condition is true. If an .ELSE follows, its statements are executed if the original condition was false. Note that the conditions are evaluated at run time. Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 30 of 10 Printed: 10/02/00 04:14 PM Directives IF expression1 ifstatements [[ELSEIF expression2 elseifstatements]] [[ELSE elsestatements]] ENDIF Grants assembly of ifstatements if expression1 is true (nonzero) or elseifstatements if expression1 is false (0) and expression2 is true. The following directives may be substituted for ELSEIF: ELSEIFB, Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 31 of 11 Printed: 10/02/00 04:14 PM 31 32 Reference ELSEIFDEF, ELSEIFDIF, ELSEIFDIFI, ELSEIFE, ELSEIFIDN, ELSEIFIDNI, ELSEIFNB, and ELSEIFNDEF. Optionally, assembles elsestatements if the previous expression is false. Note that the expressions are evaluated at assembly time. IF2 expression IF block is evaluated on every assembly pass if OPTION:SETIF2 is TRUE. See IF for complete syntax. IFB textitem Grants assembly if textitem is blank. See IF for complete syntax. IFDEF name Grants assembly if name is a previously defined label, variable, or symbol. See IF for complete syntax. IFDIF[[I]] textitem1, textitem2 Grants assembly if the text items are different. If I is given, the comparison is case insensitive. See IF for complete syntax. IFE expression Grants assembly if expression is false (0). See IF for complete syntax. IFIDN[[I]] textitem1, textitem2 Grants assembly if the text items are identical. If I is given, the comparison is case insensitive. See IF for complete syntax. IFNB textitem Grants assembly if textitem is not blank. See IF for complete syntax. IFNDEF name Grants assembly if name has not been defined. See IF for complete syntax. INCLUDE filename Inserts source code from the source file given by filename into the current source file during assembly. The filename must be enclosed in angle brackets if it includes a backslash, semicolon, greater-than symbol, less-than symbol, single quotation mark, or double quotation mark. INCLUDELIB libraryname Informs the linker that the current module should be linked with libraryname. The libraryname must be enclosed in angle brackets if it includes a backslash, semicolon, greater-than symbol, less-than symbol, single quotation mark, or double quotation mark. name INSTR [[position,]] textitem1, textitem2 Finds the first occurrence of textitem2 in textitem1. The starting position is optional. Each text item can be a literal string, a constant preceded by a %, or the string returned by a macro function. Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 32 of 12 Printed: 10/02/00 04:14 PM Directives 33 INVOKE expression [[, arguments]] Calls the procedure at the address given by expression, passing the arguments on the stack or in registers according to the standard calling conventions of the language type. Each argument passed to the procedure may be an expression, a register pair, or an address expression (an expression preceded by ADDR). IRP See FOR. IRPC See FORC. name LABEL type Creates a new label by assigning the current location-counter value and the given type to name. name LABEL [[NEAR | FAR | PROC]] PTR [[type]] Creates a new label by assigning the current location-counter value and the given type to name. .LALL See .LISTMACROALL. .LFCOND See .LISTIF. .LIST Starts listing of statements. This is the default. .LISTALL Starts listing of all statements. Equivalent to the combination of .LIST, .LISTIF, and .LISTMACROALL. .LISTIF Starts listing of statements in false conditional blocks. Same as .LFCOND. .LISTMACRO Starts listing of macro expansion statements that generate code or data. This is the default. Same as .XALL. .LISTMACROALL Starts listing of all statements in macros. Same as .LALL. LOCAL localname [[, localname]]... Within a macro, LOCAL defines labels that are unique to each instance of the macro. LOCAL label [[ [count ] ]] [[:type]] [[, label [[ [count] ]] [[type]]]]... Within a procedure definition (PROC), LOCAL creates stack-based variables that exist for the duration of the procedure. The label may be a simple variable or an array containing count elements. Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 33 of 13 Printed: 10/02/00 04:14 PM 34 Reference name MACRO [[parameter [[:REQ | :=default | :VARARG]]]]... statements ENDM [[value]] Marks a macro block called name and establishes parameter placeholders for arguments passed when the macro is called. A macro function returns value to the calling statement. .MODEL memorymodel [[, langtype]] [[, stackoption]] Initializes the program memory model. The memorymodel can be TINY, SMALL, COMPACT, MEDIUM, LARGE, HUGE, or FLAT. The langtype can be C, BASIC, FORTRAN, PASCAL, SYSCALL, or STDCALL. The stackoption can be NEARSTACK or FARSTACK. NAME modulename Ignored. .NO87 Disallows assembly of all floating-point instructions. .NOCREF [[name[[, name]]...]] Suppresses listing of symbols in the symbol table and browser file. If names are specified, only the given names are suppressed. Same as .XCREF. .NOLIST Suppresses program listing. Same as .XLIST. .NOLISTIF Suppresses listing of conditional blocks whose condition evaluates to false (0). This is the default. Same as .SFCOND. .NOLISTMACRO Suppresses listing of macro expansions. Same as .SALL. OPTION optionlist Enables and disables features of the assembler. Available options include CASEMAP, DOTNAME, NODOTNAME, EMULATOR, NOEMULATOR, EPILOGUE, EXPR16, EXPR32, LANGUAGE, LJMP, NOLJMP, M510, NOM510, NOKEYWORD, NOSIGNEXTEND, OFFSET, OLDMACROS, NOOLDMACROS, OLDSTRUCTS, NOOLDSTRUCTS, PROC, PROLOGUE, READONLY, NOREADONLY, SCOPED, NOSCOPED, SEGMENT, and SETIF2. ORG expression Sets the location counter to expression. %OUT See ECHO. PAGE [[[[length]], width]] Sets line length and character width of the program listing. If no arguments are given, generates a page break. Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 34 of 14 Printed: 10/02/00 04:14 PM Directives 35 PAGE + Increments the section number and resets the page number to 1. POPCONTEXT context Restores part or all of the current context (saved by the PUSHCONTEXT directive). The context can be ASSUMES, RADIX, LISTING, CPU, or ALL. label PROC [[distance]] [[langtype]] [[visibility]] [[ ]] [[USES reglist]] [[, parameter [[:tag]]]]... statements label ENDP Marks start and end of a procedure block called label. The statements in the block can be called with the CALL instruction or INVOKE directive. label PROTO [[distance]] [[langtype]] [[, [[parameter]]:tag]]... Prototypes a function. PUBLIC [[langtype]] name [[, [[langtype]] name]]... Makes each variable, label, or absolute symbol specified as name available to all other modules in the program. PURGE macroname [[, macroname]]... Deletes the specified macros from memory. PUSHCONTEXT context Saves part or all of the current context: segment register assumes, radix value, listing and cref flags, or processor/coprocessor values. The context can be ASSUMES, RADIX, LISTING, CPU, or ALL. [[name]] QWORD initializer [[, initializer]]... Allocates and optionally initializes 8 bytes of storage for each initializer. Also can be used as a type specifier anywhere a type is legal. .RADIX expression Sets the default radix, in the range 2 to 16, to the value of expression. name REAL4 initializer [[, initializer]]... Allocates and optionally initializes a single-precision (4-byte) floating-point number for each initializer. name REAL8 initializer [[, initializer]]... Allocates and optionally initializes a double-precision (8-byte) floating-point number for each initializer. name REAL10 initializer [[, initializer]]... Allocates and optionally initializes a 10-byte floating-point number for each initializer. Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 35 of 15 Printed: 10/02/00 04:14 PM 36 Reference recordname RECORD fieldname:width [[= expression]] [[, fieldname:width [[= expression]]]]... Declares a record type consisting of the specified fields. The fieldname names the field, width specifies the number of bits, and expression gives its initial value. .REPEAT statements .UNTIL condition Generates code that repeats execution of the block of statements until condition becomes true. .UNTILCXZ, which becomes true when CX is zero, may be substituted for .UNTIL. The condition is optional with .UNTILCXZ. REPEAT expression statements ENDM Marks a block that is to be repeated expression times. Same as REPT. REPT See REPEAT. .SALL See .NOLISTMACRO. name SBYTE initializer [[, initializer]]... Allocates and optionally initializes a signed byte of storage for each initializer. Can also be used as a type specifier anywhere a type is legal. name SDWORD initializer [[, initializer]]... Allocates and optionally initializes a signed doubleword (4 bytes) of storage for each initializer. Also can be used as a type specifier anywhere a type is legal. name SEGMENT [[READONLY]] [[align]] [[combine]] [[use]] [['class']] statements name ENDS Defines a program segment called name having segment attributes align (BYTE, WORD, DWORD, PARA, PAGE), combine (PUBLIC, STACK, COMMON, MEMORY, AT address, PRIVATE), use (USE16, USE32, FLAT), and class. .SEQ Orders segments sequentially (the default order). .SFCOND See .NOLISTIF. name SIZESTR textitem Finds the size of a text item. Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 36 of 16 Printed: 10/02/00 04:14 PM Directives 37 .STACK [[size]] When used with .MODEL, defines a stack segment (with segment name STACK). The optional size specifies the number of bytes for the stack (default 1,024). The .STACK directive automatically closes the stack statement. .STARTUP Generates program start-up code. STRUC See STRUCT. name STRUCT [[alignment]] [[, NONUNIQUE]] fielddeclarations name ENDS Declares a structure type having the specified fielddeclarations. Each field must be a valid data definition. Same as STRUC. name SUBSTR textitem, position [[, length]] Returns a substring of textitem, starting at position. The textitem can be a literal string, a constant preceded by a %, or the string returned by a macro function. SUBTITLE text Defines the listing subtitle. Same as SUBTTL. SUBTTL See SUBTITLE. name SWORD initializer [[, initializer]]... Allocates and optionally initializes a signed word (2 bytes) of storage for each initializer. Can also be used as a type specifier anywhere a type is legal. [[name]] TBYTE initializer [[, initializer]]... Allocates and optionally initializes 10 bytes of storage for each initializer. Can also be used as a type specifier anywhere a type is legal. name TEXTEQU [[textitem]] Assigns textitem to name. The textitem can be a literal string, a constant preceded by a %, or the string returned by a macro function. .TFCOND Toggles listing of false conditional blocks. TITLE text Defines the program listing title. name TYPEDEF type Defines a new type called name, which is equivalent to type. Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 37 of 17 Printed: 10/02/00 04:14 PM 38 Reference name UNION [[alignment]] [[, NONUNIQUE]] fielddeclarations [[name]] ENDS Declares a union of one or more data types. The fielddeclarations must be valid data definitions. Omit the ENDS name label on nested UNION definitions. .UNTIL See .REPEAT. .UNTILCXZ See .REPEAT. .WHILE condition statements .ENDW Generates code that executes the block of statements while condition remains true. WHILE expression statements ENDM Repeats assembly of block statements as long as expression remains true. [[name]] WORD initializer [[, initializer]]... Allocates and optionally initializes a word (2 bytes) of storage for each initializer. Can also be used as a type specifier anywhere a type is legal. .XALL See .LISTMACRO. .XCREF See .NOCREF. .XLIST See .NOLIST. Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 38 of 18 Printed: 10/02/00 04:14 PM Directives Filename: LMARFC02.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 24 Page: 39 of 19 Printed: 10/02/00 04:14 PM 39 39 C H A P T E R 3 Symbols and Operators Topical Cross-reference for Symbols . . Topical Cross-reference for Operators . Predefined Symbols . . . . . . . . . . . . . . Operators . . . . . . . . . . . . . . . . . . . . . Run-Time Operators . . . . . . . . . . . . . Filename: LMARFC03.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 22 Page: 39 of 1 Printed: 10/02/00 04:15 PM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 41 43 44 48 40 Reference Topical Cross-reference for Symbols Date and Time Information @Date @Time Environment Information @Cpu @Environ @Interface @Version File Information @FileCur @FileName @Line Macro Functions @CatStr @InStr @SizeStr @SubStr Miscellaneous $ @B ? @F @@: @CodeSize @DataSize @Model @CurSeg @fardata @stack Segment Information @code @data @fardata? @WordSize Filename: LMARFC03.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 22 Page: 40 of 2 Printed: 10/02/00 04:15 PM Symbols and Operators Topical Cross-reference for Operators Arithmetic * + - . / [] ! != & && == || < > <= >= NOT SHR OR XOR % <> & “” ; OVERFLOW? ZERO? : CARRY? PARITY? GE LT GT NE MOD Control Flow Logical and Shift AND SHL Macro ! ;; Miscellaneous ’’ :: DUP SIGN? Record MASK WIDTH Relational EQ LE Filename: LMARFC03.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 22 Page: 41 of 3 Printed: 10/02/00 04:15 PM 41 42 Reference Segment : LROFFSET OFFSET SEG Type HIGH HIGHWORD LENGTH LENGTHOF LOW LOWWORD OPATTR SIZE TYPE PTR SIZEOF SHORT THIS Filename: LMARFC03.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 22 Page: 42 of 4 Printed: 10/02/00 04:15 PM Symbols and Operators 43 Predefined Symbols $ The current value of the location counter. ? In data declarations, a value that the assembler allocates but does not initialize. @@: Defines a code label recognizable only between label1 and label2, where label1 is either start of code or the previous @@: label, and label2 is either end of code or the next @@: label. See @B and @F. @B The location of the previous @@: label. @CatStr( string1 [[, string2...]] ) Macro function that concatenates one or more strings. Returns a string. @code The name of the code segment (text macro). @CodeSize 0 for TINY, SMALL, COMPACT, and FLAT models, and 1 for MEDIUM, LARGE, and HUGE models (numeric equate). @Cpu A bit mask specifying the processor mode (numeric equate). @CurSeg The name of the current segment (text macro). @data The name of the default data group. Evaluates to DGROUP for all models except FLAT. Evaluates to FLAT under the FLAT memory model (text macro). @DataSize 0 for TINY, SMALL, MEDIUM, and FLAT models, 1 for COMPACT and LARGE models, and 2 for HUGE model (numeric equate). @Date The system date in the format mm/dd/yy (text macro). @Environ( envvar ) Value of environment variable envvar (macro function). @F The location of the next @@: label. @fardata The name of the segment defined by the .FARDATA directive (text macro). Filename: LMARFC03.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 22 Page: 43 of 5 Printed: 10/02/00 04:15 PM 44 Reference @fardata? The name of the segment defined by the .FARDATA? directive (text macro). @FileCur The name of the current file (text macro). @FileName The base name of the main file being assembled (text macro). @InStr( [[position]], string1, string2 ) Macro function that finds the first occurrence of string2 in string1, beginning at position within string1. If position does not appear, search begins at start of string1. Returns a position integer or 0 if string2 is not found. @Interface Information about the language parameters (numeric equate). @Line The source line number in the current file (numeric equate). @Model 1 for TINY model, 2 for SMALL model, 3 for COMPACT model, 4 for MEDIUM model, 5 for LARGE model, 6 for HUGE model, and 7 for FLAT model (numeric equate). @SizeStr( string ) Macro function that returns the length of the given string. Returns an integer. @SubStr( string, position [[, length]] ) Macro function that returns a substring starting at position. @stack DGROUP for near stacks or STACK for far stacks (text macro). @Time The system time in 24-hour hh:mm:ss format (text macro). @Version 610 in MASM 6.1 (text macro). @WordSize Two for a 16-bit segment or 4 for a 32-bit segment (numeric equate). Operators expression1 + expression2 Returns expression1 plus expression2. expression1 – expression2 Returns expression1 minus expression2. expression1 * expression2 Returns expression1 times expression2. Filename: LMARFC03.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 22 Page: 44 of 6 Printed: 10/02/00 04:15 PM Symbols and Operators 45 expression1 / expression2 Returns expression1 divided by expression2. –expression Reverses the sign of expression. expression1 [expression2] Returns expression1 plus [expression2]. segment: expression Overrides the default segment of expression with segment. The segment can be a segment register, group name, segment name, or segment expression. The expression must be a constant. expression. field [[. field]]... Returns expression plus the offset of field within its structure or union. [register]. field [[. field]]... Returns value at the location pointed to by register plus the offset of field within its structure or union. Treats text as a single literal element. “text” Treats “text” as a string. ’text’ Treats ’text’ as a string. !character Treats character as a literal character rather than as an operator or symbol. ;text Treats text as a comment. ;;text Treats text as a comment in a macro that appears only in the macro definition. The listing does not show text where the macro is expanded. %expression Treats the value of expression in a macro argument as text. ¶meter& Replaces parameter with its corresponding argument value. ABS See the EXTERNDEF directive. ADDR See the INVOKE directive. expression1 AND expression2 Returns the result of a bitwise AND operation for expression1 and expression2. Filename: LMARFC03.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 22 Page: 45 of 7 Printed: 10/02/00 04:15 PM 46 Reference count DUP (initialvalue [[, initialvalue]]...) Specifies count number of declarations of initialvalue. expression1 EQ expression2 Returns true (–1) if expression1 equals expression2, or returns false (0) if it does not. expression1 GE expression2 Returns true (–1) if expression1 is greater-than-or-equal-to expression2, or returns false (0) if it is not. expression1 GT expression2 Returns true (–1) if expression1 is greater than expression2, or returns false (0) if it is not. HIGH expression Returns the high byte of expression. HIGHWORD expression Returns the high word of expression. expression1 LE expression2 Returns true (–1) if expression1 is less than or equal to expression2, or returns false (0) if it is not. LENGTH variable Returns the number of data items in variable created by the first initializer. LENGTHOF variable Returns the number of data objects in variable. LOW expression Returns the low byte of expression. LOWWORD expression Returns the low word of expression. LROFFSET expression Returns the offset of expression. Same as OFFSET, but it generates a loader resolved offset, which allows Windows to relocate code segments. expression1 LT expression2 Returns true (–1) if expression1 is less than expression2, or returns false (0) if it is not. MASK {recordfieldname | record} Returns a bit mask in which the bits in recordfieldname or record are set and all other bits are cleared. expression1 MOD expression2 Returns the integer value of the remainder (modulo) when dividing expression1 by expression2. Filename: LMARFC03.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 22 Page: 46 of 8 Printed: 10/02/00 04:15 PM Symbols and Operators 47 expression1 NE expression2 Returns true (–1) if expression1 does not equal expression2, or returns false (0) if it does. NOT expression Returns expression with all bits reversed. OFFSET expression Returns the offset of expression. OPATTR expression Returns a word defining the mode and scope of expression. The low byte is identical to the byte returned by .TYPE. The high byte contains additional information. expression1 OR expression2 Returns the result of a bitwise OR operation for expression1 and expression2. type PTR expression Forces the expression to be treated as having the specified type. [[distance]] PTR type Specifies a pointer to type. SEG expression Returns the segment of expression. expression SHL count Returns the result of shifting the bits of expression left count number of bits. SHORT label Sets the type of label to short. All jumps to label must be short (within the range –128 to +127 bytes from the jump instruction to label). expression SHR count Returns the result of shifting the bits of expression right count number of bits. SIZE variable Returns the number of bytes in variable allocated by the first initializer. SIZEOF {variable | type} Returns the number of bytes in variable or type. THIS type Returns an operand of specified type whose offset and segment values are equal to the current location-counter value. .TYPE expression See OPATTR. TYPE expression Returns the type of expression. Filename: LMARFC03.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 22 Page: 47 of 9 Printed: 10/02/00 04:15 PM 48 Reference WIDTH {recordfieldname | record} Returns the width in bits of the current recordfieldname or record. expression1 XOR expression2 Returns the result of a bitwise XOR operation for expression1 and expression2. Run-Time Operators The following operators are used only within .IF, .WHILE, or .REPEAT blocks and are evaluated at run time, not at assembly time: expression1 == expression2 Is equal to. expression1 != expression2 Is not equal to. expression1 > expression2 Is greater than. expression1 >= expression2 Is greater than or equal to. expression1 < expression2 Is less than. expression1 <= expression2 Is less than or equal to. expression1 || expression2 Logical OR. expression1 && expression2 Logical AND. expression1 & expression2 Bitwise AND. !expression Logical negation. CARRY? Status of carry flag. OVERFLOW? Status of overflow flag. PARITY? Status of parity flag. SIGN? Status of sign flag. ZERO? Status of zero flag. Filename: LMARFC03.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 22 Page: 48 of 10 Printed: 10/02/00 04:15 PM Symbols and Operators Filename: LMARFC03.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 22 Page: 49 of 11 Printed: 10/02/00 04:15 PM 49 49 C H A P T E R 4 Processor Topical Cross-reference for Processor Instructions . Interpreting Processor Instructions . . . . . . . . . . . . Flags . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clock Speeds . . . . . . . . . . . . . . . . . . . . . . . . . Timings on the 8088 and 8086 Processors . . Timings on the 80286-80486 Processors . . . Interpreting Encodings . . . . . . . . . . . . . . . . . . . . . Interpreting 80386–80486 Encoding Extensions . . . 16-bit Encoding. . . . . . . . . . . . . . . . . . . . . . . . 32-bit Encoding. . . . . . . . . . . . . . . . . . . . . . . . Address-Size Prefix . . . . . . . . . . . . . . . . . . Operand-Size Prefix . . . . . . . . . . . . . . . . . . Encoding Differences for 32-Bit Operations . Scaled Index Base Byte . . . . . . . . . . . . . . . Instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 49 of 1 Printed: 10/02/00 04:15 PM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 53 53 54 54 54 55 56 56 59 60 60 60 60 60 61 64 50 Reference Topical Cross-reference for Processor Instructions Arithmetic ADC ADD DEC DIV IDIV IMUL INC MUL NEG SBB SUB XADD# AAD DAA AAM DAS BSF§ BTC§ NOT RCR SAR SHR BSR§ BTR§ OR ROL SHL/SAL SHRD§ BTC§ CMP TEST BTR§ CMPS SETA/SETNBE§ SETBE/SETNA§ SETG/SETNLE§ SETLE/SETNG§ SETNO§ SETO§ SETAE/SETNB§ SETC§ SETGE/SETNL§ SETNC§ SETNP/SETPO§ SETP/SETPE§ SETB/SETNAE § SETE/SETZ§ SETL/SETNGE§ SETNE/SETNZ§ SETNS§ SETS§ * 80186–80486 only. § 80386–80486 only. † 80286–80486 only. # 80486 only. BCD Conversion AAA AAS Bit Operations AND BT § BTS§ RCL ROR SHLD§ XOR Compare BT § BTS§ CMPXCHG# Conditional Set Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 50 of 2 Printed: 10/02/00 04:15 PM Processor Conditional Transfer BOUND* INTO JA/JNBE JAE/JNB JB/JNAE JBE/JNA JC JCXZ/JECXZ JE/JZ JG/JNLE JGE/JNL JL/JNGE JLE/JNG JNC JNE/JNZ JNO JNP/JPO JNS JO JP/JPE JS CMPXCHG# LFS/LGS/LSS§ MOVS STOS XLAT/XLATB LDS/LES LODS MOVSX§ XADD# CLD LAHF SAHF STI CLI POPF STC Data Transfer BSWAP# LEA MOV MOVZX§ XCHG Flag CLC CMC PUSHF STD Input/Output IN OUT INS* OUTS* Loop JCXZ/JECXZ LOOPE/LOOPZ LOOP LOOPNE/LOOPNZ * 80186–80486 only. § 80386–80486 only. † 80286–80486 only. # 80486 only. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 51 of 3 Printed: 10/02/00 04:15 PM 51 52 Reference Process Control ARPL† CLTS† LAR† LGDT/LIDT/LLDT† LMSW† LSL† LTR† SGDT/SIDT/SLDT† SMSW† VERR† VERW† INVD# INVLPG# STR† MOV special § WBINVD# Processor Control HLT NOP LOCK WAIT Stack PUSH PUSHAD* POPA* LEAVE* PUSHF POP POPAD* PUSHA* POPF ENTER* LODS CMPS REP STOS INS* REPE/REPZ String MOVS SCAS OUTS* REPNE/REPNZ Type Conversion CBW CWDE§ BSWAP# CWD CDQ§ Unconditional Transfer CALL RET INT RETN/RETF * 80186–80486 only. § 80386–80486 only. † 80286–80486 only. # 80486 only. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 52 of 4 Printed: 10/02/00 04:15 PM IRET JMP Processor 53 Interpreting Processor Instructions The following sections explain the format of instructions for the 8086, 8088, 80286, 80386, and 80486 processors. Those instructions begin on page 64. Flags Only the flags common to all processors are shown. If none of the flags is affected by the instruction, the flag line says No change. If flags can be affected, a two-line entry is shown. The first line shows flag abbreviations as follows: Abbreviation Flag O Overflow D Direction I Interrupt T Trap S Sign Z Zero A Auxiliary carry P Parity C Carry The second line has codes indicating how the flag can be affected: Code Effect 1 Sets the flag 0 Clears the flag ? May change the flag, but the value is not predictable blank No effect on the flag ± Modifies according to the rules associated with the flag Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 53 of 5 Printed: 10/02/00 04:15 PM 54 Reference Syntax Each encoding variation may have different syntaxes corresponding to different addressing modes. The following abbreviations are used: reg A general-purpose register of any size. segreg One of the segment registers: DS, ES, SS, or CS (also FS or GS on the 80386–80486). accum An accumulator register of any size: AL or AX (also EAX on the 80386–80486). mem A direct or indirect memory operand of any size. label A labeled memory location in the code segment. src,dest immed A source or destination memory operand used in a string operation. A constant operand. In some cases abbreviations have numeric suffixes to specify that the operand must be a particular size. For example, reg16 means that only a 16-bit (word) register is accepted. Examples One or more examples are shown for each syntax. Their position is not related to the clock speeds in the right column. Clock Speeds Column 3 shows the clock speeds for each processor. Sometimes an instruction may have more than one clock speed. Multiple speeds are separated by commas. If several speeds are part of an expression, they are enclosed in parentheses. The following abbreviations are used to specify variations: EA Effective address. This applies only to the 8088 and 8086 processors, as described in the next section. b,w,d pm Byte, word, or doubleword operands. Protected mode. n Iterations. Repeated instructions may have a base number of clocks plus a number of clocks for each iteration. For example, 8+4n means 8 clocks plus 4 clocks for each iteration. noj No jump. For conditional jump instructions, noj indicates the speed if the condition is false and the jump is not taken. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 54 of 6 Printed: 10/02/00 04:15 PM Processor 55 m Next instruction components. Some control transfer instructions take different times depending on the length of the next instruction executed. On the 8088 and 8086, m is never a factor. On the 80286, m is the number of bytes in the instruction. On the 80386–80486, m is the number of components. Each byte of encoding is a component, and the displacement and data are separate components. W88,88 8088 exceptions. See “Timings on the 8088 and 8086 Processors,” following. Clocks can be converted to nanoseconds by dividing 1 microsecond by the number of megahertz (MHz) at which the processor is running. For example, on a processor running at 8 MHz, 1 clock takes 125 nanoseconds (1000 MHz per nanosecond / 8 MHz). The clock counts are for best-case timings. Actual timings vary depending on wait states, alignment of the instruction, the status of the prefetch queue, and other factors. Timings on the 8088 and 8086 Processors Because of its 8-bit data bus, the 8088 always requires two fetches to get a 16bit operand. Therefore, instructions that work on 16-bit memory operands take longer on the 8088 than on the 8086. Separate 8088 timings are shown in parentheses following the main timing. For example, 9 (W88=13) means that the 8086 with any operands or the 8088 with byte operands take 9 clocks, but the 8088 with word operands takes 13 clocks. Similarly, 16 (88=24) means that the 8086 takes 16 clocks, but the 8088 takes 24 clocks. On the 8088 and 8086, the effective address (EA) value must be added for instructions that operate on memory operands. A displacement is any direct memory or constant operand, or any combination of the two. The following shows the number of clocks to add for the effective address: Components EA Clocks Examples Displacement 6 mov mov ax,stuff ax,stuff+2 Base or index 5 mov mov ax,[bx] ax,[di] Displacement plus base or index 9 mov mov ax,[bp+8] ax,stuff[di] Base plus index (BP+DI, BX+SI) 7 mov mov ax,[bx+si] ax,[bp+di] Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 55 of 7 Printed: 10/02/00 04:15 PM 56 Reference Components EA Clocks Examples Base plus index (BP+SI, BX+DI) 8 mov mov ax,[bx+di] ax,[bp+si] Base plus index plus displacement (BP+DI+disp, BX+SI+disp) 11 mov mov ax,stuff[bx+si] ax,[bp+di+8] Base plus index plus displacement (BP+SI+disp, BX+DI+disp) 12 mov mov ax,stuff[bx+di] ax,[bp+si+20] Segment override EA+2 mov mov ax,es:stuff ax,ds:[bp+10] Timings on the 80286–80486 Processors On the 80286–80486 processors, the effective address calculation is handled by hardware and is therefore not a factor in clock calculations except in one case. If a memory operand includes all three possible elements — a displacement, a base register, and an index register — then add one clock. On the 80486, the extra clock is not always used. Examples are shown in the following. mov ax,[bx+di] ;No extra mov ax,array[bx+di] ;One extra mov ax,[bx+di+6] ;One extra Note 80186 and 80188 timings are different from 8088, 8086, and 80286 timings. They are not shown in this manual. Timings are also not shown for protected-mode transfers through gates or for the virtual 8086 mode available on the 80386–80486 processors. Interpreting Encodings Encodings are shown for each variation of the instruction. This section describes encoding for all processors except the 80386–80486. The encodings take the form of boxes filled with 0s and 1s for bits that are constant for the instruction variation, and abbreviations (in italics) for the following variable bits or bitfields: d Direction bit. If set, do memory to register; the reg field is the destination. If clear, do register to memory or register to register; the reg field is the source. a Accumulator direction bit. If set, move accumulator register to memory. If clear, move memory to accumulator register. w Word/byte bit. If set, use 16-bit or 32-bit operands. If clear, use 8-bit operands. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 56 of 8 Printed: 10/02/00 04:15 PM Processor s 57 Sign bit. If set, sign-extend 8-bit immediate data to 16 bits. mod Mode. This 2-bit field gives the register/memory mode with displacement. The possible values are shown below: mod Meaning 00 This value can have two meanings: If r/m is 110, a direct memory operand is used. If r/m is not 110, the displacement is 0 and an indirect memory operand is used. The operand must be based, indexed, or based indexed. 01 An indirect memory operand is used with an 8-bit displacement. 10 An indirect memory operand is used with a 16-bit displacement. 11 A two-register instruction is used; the reg field specifies the destination and the r/m field specifies the source. reg Register. This 3-bit field specifies one of the general-purpose registers: reg 16/32-bit if w=1 8-bit if w=0 000 AX/EAX AL 001 CX/ECX CL 010 DX/EDX DL 011 BX/EBX BL 100 SP/ESP AH 101 BP/EBP CH 110 SI/ESI DH 111 DI/EDI BH The reg field is sometimes used to specify encoding information rather than a register. sreg Segment register. This field specifies one of the segment registers: sreg Register 000 ES 001 CS 010 SS 011 DS 100 FS 101 GS Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 57 of 9 Printed: 10/02/00 04:15 PM 58 Reference r/m Register/memory. This 3-bit field specifies a register or memory r/m operand. If the mod field is 11, r/m specifies the source register using the reg field codes. Otherwise, the field has one of the following values: r/m Operand Address 000 DS:[BX+SI+disp] 001 DS:[BX+DI+disp] 010 SS:[BP+SI+disp] 011 SS:[BP+DI+disp] 100 DS:[SI+disp] 101 DS:[DI+disp] 110 SS:[BP+disp]* 111 DS:[BX+disp] * If mod is 00 and r/m is 110, then the operand is treated as a direct memory operand. This means that the operand [BP] is encoded as [BP+0] rather than having a short-form like other register indirect operands. Encoding [BX] takes one byte, but encoding [BP] takes two. disp Displacement. These bytes give the offset for memory operands. The possible lengths (in bytes) are shown in parentheses. data Data. These bytes give the actual value for constant values. The possible lengths (in bytes) are shown in parentheses. If a memory operand has a segment override, the entire instruction has one of the following bytes as a prefix: Prefix Segment 00101110 (2Eh) CS 00111110 (3Eh) DS 00100110 (26h) ES 00110110 (36h) SS 01100100 (64h) FS 01100101 (65h) GS Example As an example, assume you want to calculate the encoding for the following statement (where warray is a 16-bit variable): add warray[bx+di], -3 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 58 of 10 Printed: 10/02/00 04:15 PM Processor 59 First look up the encoding for the immediate-to-memory syntax of the ADD instruction: 100000sw mod,000,r/m disp (0, 1, or 2) data (0, 1, or 2) Since the destination is a word operand, the w bit is set. The 8-bit immediate data must be sign-extended to 16 bits to fit into the operand, so the s bit is also set. The first byte of the instruction is therefore 10000011 (83h). Since the memory operand can be anywhere in the segment, it must have a 16bit offset (displacement). Therefore the mod field is 10. The reg field is 000, as shown in the encoding. The r/m coding for [bx+di+disp] is 001. The second byte is 10000001 (81h). The next two bytes are the offset of warray. The low byte of the offset is stored first and the high byte second. For this example, assume that warray is located at offset 10EFh. The last byte of the instruction is used to store the 8-bit immediate value –3 (FDh). This value is encoded as 8 bits (but sign-extended to 16 bits by the processor). The encoding is shown here in hexadecimal: 83 81 EF 10 FD You can confirm this by assembling the instruction and looking at the resulting assembly listing. Interpreting 80386–80486 Encoding Extensions This book shows 80386–80486 encodings for instructions that are available only on the 80386–80486 processors. For other instructions, encodings are shown only for the 16-bit subset available on all processors. This section tells how to convert the 80286 encodings shown in the book to 80386–80486 encodings that use extensions such as 32-bit registers and memory operands. The extended 80386–80486 encodings differ in that they can have additional prefix bytes, a Scaled Index Base (SIB) byte, and 32-bit displacement and immediate bytes. Use of these elements is closely tied to the segment word size. The use type of the code segment determines whether the instructions are processed in 32-bit mode (USE32) or 16-bit mode (USE16). Current versions of MS-DOS® and Microsoft® Windows™ use 16-bit mode only. Windows NT uses 32-bit mode. The bytes that can appear in an instruction encoding are: Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 59 of 11 Printed: 10/02/00 04:15 PM 60 Reference 16-Bit Encoding Opcode mod-reg-r/m disp immed (1-2) (0-1) (0-2) (0-2) 32-Bit Encoding AddressSize (67h) OperandSize (66h) (0-1) (0-1) Opcode mod-regr/m Scaled Index Base disp immed (1-2) (0-1) (0-1) (0-4) (0-4) Additional bytes may be added for a segment prefix, a repeat prefix, or the LOCK prefix. Address-Size Prefix The address-size prefix determines the segment word size of the operation. It can override the default size for calculating the displacement of memory addresses. The address prefix byte is 67h. The assembler automatically inserts this byte where appropriate. In 32-bit mode (USE32 or FLAT code segment), displacements are calculated as 32-bit addresses. The effective address-size prefix must be used for any instructions that must calculate addresses as 16-bit displacements. In 16-bit mode, the defaults are reversed. The prefix must be used to specify calculation of 32-bit displacements. Operand-Size Prefix The operand-size prefix determines the size of operands. It can override the default size of registers or memory operands. The operand-size prefix byte is 66h. The assembler automatically inserts this byte where appropriate. In 32-bit mode, the default sizes for operands are 8 bits and 32 bits (depending on the w bit). For most instructions, the operand-size prefix must be used for any instructions that use 16-bit operands. In 16-bit mode, the default sizes are 8 bits and 16 bits. The prefix must be used for any instructions that use 32-bit operands. Some instructions use 16-bit operands, regardless of mode. Encoding Differences for 32-Bit Operations When 32-bit operations are performed, the meaning of certain bits or fields is different from their meaning in 16-bit operations. The changes may affect default operations in 32-bit mode, or 16-bit mode operations in which the address-size prefix or the operand-size prefix is used. The following fields may Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 60 of 12 Printed: 10/02/00 04:15 PM Processor 61 have a different meaning for 32-bit operations from their meaning as described in the “Interpreting Encodings” section: w Word/byte bit. If set, use 32-bit operands. If clear, use 8-bit operands. s Sign bit. If set, sign-extend 8-bit and 16-bit immediate data to 32 bits. mod Mode. This field indicates the register/memory mode. The value 11 still indicates a register-to-register operation with r/m containing the code for a 32-bit source register. However, other codes have different meanings as shown in the tables in the next section. reg Register. The codes for 16-bit registers are extended to 32-bit registers. For example, if the reg field is 000, EAX is used instead of AX. Use of 8-bit registers is unchanged. sreg Segment register. The 80386 has the following additional segment registers: sreg Register 100 FS 101 GS r/m Register/memory. If the r/m field is used for the source register, 32-bit registers are used as for the reg field. If the field is used for memory operands, the meaning is completely different from the meaning used for 16-bit operations, as shown in the tables in the next section. disp Displacement. This field is 4 bytes for 32-bit addresses. data Data. Immediate data can be up to 4 bytes. Scaled Index Base Byte Many 80386–80486 extended memory operands are too complex to be represented by a single mod-reg-r/m byte. For these operands, a value of 100 in the r/m field signals the presence of a second encoding byte called the Scaled Index Base (SIB) byte. The SIB byte is made up of the following fields: ss index base ss Scaling Field. This two-bit field specifies one of the following scaling factors: ss Scale 00 1 01 2 10 4 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 61 of 13 Printed: 10/02/00 04:15 PM 62 Reference 11 8 index Index Register. This three-bit field specifies one of the following index registers: index Register 000 EAX 001 ECX 010 EDX 011 EBX 100 no index 101 EBP 110 ESI 111 EDI Note ESP cannot be an index register. If the index field is 100, the ss field must be 00. base Base Register. This 3-bit field combines with the mod field to specify the base register and the displacement. Note that the base field only specifies the base when the r/m field is 100. Otherwise, the r/m field specifies the base. The possible combinations of the mod, r/m, scale, index, and base fields are as follows: Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 62 of 14 Printed: 10/02/00 04:15 PM Processor 63 If a memory operand has a segment override, the entire instruction has one of the prefixes discussed in the preceding section, “Interpreting Encodings,” or one of the following prefixes for the segment registers available only on the 80386– 80486: Prefix Segment 01100100 (64h) FS 01100101 (65h) GS Example Assume you want to calculate the encoding for the following statement (where warray is a 16-bit variable). Assume that the instruction is used in 16-bit mode. add warray[eax+ecx*2], -3 First look up the encoding for the immediate-to-memory syntax of the ADD instruction: 100000sw mod,000,r/m disp (0, 1, or 2) data (1 or 2) This encoding must be expanded to account for 80386–80486 extensions. Note that the instruction operates on 16-bit data in a 16-bit mode program. Therefore, the operand-size prefix is not needed. However, the instruction does use 32-bit Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 63 of 15 Printed: 10/02/00 04:15 PM 64 Reference registers to calculate a 32-bit effective address. Thus the first byte of the encoding must be the effective address-size prefix, 01100111 (67h). The opcode byte is the same (83h) as for the 80286 example described in the “Interpreting Encodings” section. The mod-reg-r/m byte must specify a based indexed operand with a scaling factor of two. This operand cannot be specified with a single byte, so the encoding must also use the SIB byte. The value 100 in the r/m field specifies an SIB byte. The reg field is 000, as shown in the encoding. The mod field is 10 for operands that have base and scaled index registers and a 32-bit displacement. The combined mod, reg, and r/m fields for the second byte are 10000100 (84h). The SIB byte is next. The scaling factor is 2, so the ss field is 01. The index register is ECX, so the index field is 001. The base register is EAX, so the base field is 000. The SIB byte is 01001000 (48h). The next 4 bytes are the offset of warray. The low bytes are stored first. For this example, assume that warray is located at offset 10EFh. This offset only requires 2 bytes, but 4 must be supplied because of the addressing mode. A 32bit address can be safely used in 16-bit mode as long as the upper word is 0. The last byte of the instruction is used to store the 8-bit immediate value –3 (FDh). The encoding is shown here in hexadecimal: 67 83 84 48 00 00 EF 10 FD Instructions This section provides an alphabetical reference to the instructions for the 8086, 8088, 80286, 80386, and 80486 processors. AAA ASCII Adjust After Addition Adjusts the result of an addition to a decimal digit (0–9). The previous addition instruction should place its 8-bit sum in AL. If the sum is greater than 9h, AH is incremented and the carry and auxiliary carry flags are set. Otherwise, the carry and auxiliary carry flags are cleared. Flags O D I ? T S Z A P C ? ? ± ? ± Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 64 of 16 Printed: 10/02/00 04:15 PM AAD ASCII Adjust Before Division Encoding 00110111 Syntax Examples CPU Clock Cycles AAA aaa 88/86 286 386 486 8 3 4 3 AAD ASCII Adjust Before Division Converts unpacked BCD digits in AH (most significant digit) and AL (least significant digit) to a binary number in AX. This instruction is often used to prepare an unpacked BCD number in AX for division by an unpacked BCD digit in an 8-bit register. Flags O D I ? Encoding 11010101 T S Z A P C ± ± ? ± ? 00001010 Syntax Examples CPU Clock Cycles AAD aad 88/86 286 386 486 60 14 19 14 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 65 of 17 Printed: 10/02/00 04:15 PM 65 66 AAM ASCII Adjust After Multiply AAM ASCII Adjust After Multiply Converts an 8-bit binary number less than 100 decimal in AL to an unpacked BCD number in AX. The most significant digit goes in AH and the least significant in AL. This instruction is often used to adjust the product after a MUL instruction that multiplies unpacked BCD digits in AH and AL. It is also used to adjust the quotient after a DIV instruction that divides a binary number less than 100 decimal in AX by an unpacked BCD number. Flags O D I ? Encoding 11010100 T S Z A P C ± ± ? ± ? 00001010 Syntax Examples CPU Clock Cycles AAM aam 88/86 286 386 486 83 16 17 15 AAS ASCII Adjust After Subtraction Adjusts the result of a subtraction to a decimal digit (0–9). The previous subtraction instruction should place its 8-bit result in AL. If the result is greater than 9h, AH is decremented and the carry and auxiliary carry flags are set. Otherwise, the carry and auxiliary carry flags are cleared. Flags O D I ? Encoding 00111111 T S Z A P C ? ? ± ? ± Syntax Examples CPU Clock Cycles AAS aas 88/86 286 386 486 8 3 4 3 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 66 of 18 Printed: 10/02/00 04:15 PM ADC Add with Carry 67 ADC Add with Carry Adds the source operand, the destination operand, and the value of the carry flag. The result is assigned to the destination operand. This instruction is used to add the more significant portions of numbers that must be added in multiple registers. Flags O D I ± Encoding 000100dw Encoding Encoding T S Z A P C ± ± ± ± ± mod,reg,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles ADC reg,reg adc dx,cx 88/86 286 386 486 3 2 2 1 ADC mem,reg adc WORD PTR m32[2],dx 88/86 286 386 486 16+EA (W88=24+EA) 7 7 3 ADC reg,mem adc dx,WORD PTR m32[2] 88/86 286 386 486 9+EA (W88=13+EA) 7 6 2 100000sw mod, 010,r/m disp (0, 1, or 2) data (1 or 2) Syntax Examples CPU Clock Cycles ADC reg,immed adc dx,12 88/86 286 386 486 4 3 2 1 ADC mem,immed adc WORD PTR m32[2],16 88/86 286 386 486 17+EA (W88=23+EA) 7 7 3 0001010w data (1 or 2) Syntax Examples CPU Clock Cycles ADC accum,immed adc 88/86 286 386 486 4 3 2 1 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 67 of 19 Printed: 10/02/00 04:15 PM ax,5 68 ADD Add ADD Add Adds the source and destination operands and puts the sum in the destination operand. Flags O D I ± Encoding 000000dw Encoding Encoding T S Z A P C ± ± ± ± ± mod,reg,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles ADD reg,reg add ax,bx 88/86 286 386 486 3 2 2 1 ADD mem, reg add add total, cx array[bx+di], dx 88/86 286 386 486 16+EA (W88=24+EA) 7 7 3 ADD reg,mem add add cx,incr dx,[bp+6] 88/86 286 386 486 9+EA (W88=13+EA) 7 6 2 100000sw mod, 000,r/m disp (p,1, or2) data (1or2) Syntax Examples CPU Clock Cycles ADD reg,immed add bx,6 88/86 286 386 486 4 3 2 1 ADD mem,immed add add amount,27 pointers[bx][si],6 88/86 286 386 486 17+EA (W88=23+EA) 7 7 3 0000010w data (1 or 2) Syntax Examples CPU Clock Cycles ADD accum,immed add 88/86 286 386 486 4 3 2 1 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 68 of 20 Printed: 10/02/00 04:15 PM ax,10 AND Logical AND 69 AND Logical AND Performs a bitwise AND operation on the source and destination operands and stores the result in the destination operand. For each bit position in the operands, if both bits are set, the corresponding bit of the result is set. Otherwise, the corresponding bit of the result is cleared. Flags O D I 0 Encoding 001000dw Encoding Encoding T S Z A P C ± ± ? ± 0 mod,reg,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles AND reg,reg and dx,bx 88/86 286 386 486 3 2 2 1 AND mem,reg and and bitmask,bx [bp+2],dx 88/86 286 386 486 16+EA (W88=24+EA) 7 7 3 AND reg,mem and and bx,masker dx,marray[bx+di] 88/86 286 386 486 9+EA (W88=13+EA) 7 6 2 100000sw mod, 100, r/m disp (0, 1, or 2) data (1 or 2) Syntax Examples CPU Clock Cycles AND reg,immed and dx,0F7h 88/86 286 386 486 4 3 2 1 AND mem,immed and masker, 100lb 88/86 286 386 486 17+EA(W88=24+EA) 7 7 3 0010010w data (1 or 2) Syntax Examples CPU Clock Cycles AND accum,immed and 88/86 286 386 486 4 3 2 1 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 69 of 21 Printed: 10/02/00 04:15 PM ax,0B6h 70 ARPL Adjust Requested Privilege Level ARPL Adjust Requested Privilege Level 80286–80486 Protected Only Verifies that the destination Requested Privilege Level (RPL) field (bits 0 and 1 of a selector value) is less than the source RPL field. If it is not, ARPL adjusts the destination RPL to match the source RPL. The destination operand should be a 16-bit memory or register operand containing the value of a selector. The source operand should be a 16-bit register containing the test value. The zero flag is set if the destination is adjusted; otherwise, the flag is cleared. ARPL is useful only in 80286–80486 protected mode. See Intel documentation for details on selectors and privilege levels. Flags O D I Encoding 01100011 T S Z A P C ± mod,reg,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles ARPL reg,reg arpl ax,cx 88/86 286 386 486 — 10 20 9 ARPL mem,reg arpl selector,dx 88/86 286 386 486 — 11 21 9 BOUND Check Array Bounds 80286–80486 Only Verifies that a signed index value is within the bounds of an array. The destination operand can be any 16-bit register containing the index to be checked. The source operand must then be a 32-bit memory operand in which the low and high words contain the starting and ending values, respectively, of the array. (On the 80386–80486 processors, the destination operand can be a 32-bit register; in this case, the source operand must be a 64bit operand made up of 32-bit bounds.) If the source operand is less than the first bound or greater than the last bound, an interrupt 5 is generated. The instruction pointer pushed by the interrupt (and returned by IRET) points to the BOUND instruction rather than to the next instruction. Flags No change Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 70 of 22 Printed: 10/02/00 04:15 PM BSF/BSR Bit Scan Encoding 01100010 mod,reg, r/m 71 disp (2) Syntax Examples CPU Clock Cycles BOUND reg16,mem32 BOUND reg32,mem64* bound 88/86 286 386 486 — noj=13† noj=10† noj=7 di,base-4 * 80386–80486 only. † See INT for timings if interrupt 5 is called. BSF/BSR Bit Scan 80386–80486 Only Scans an operand to find the first set bit. If a set bit is found, the zero flag is cleared and the destination operand is loaded with the bit index of the first set bit encountered. If no set bit is found, the zero flag is set. BSF (Bit Scan Forward) scans from bit 0 to the most significant bit. BSR (Bit Scan Reverse) scans from the most significant bit of an operand to bit 0. Flags O D I Encoding 00001111 T S Z A P C ± 10111100 mod, reg, r/m disp (0, 1, 2, or 4) Syntax Examples CPU Clock Cycles BSF reg16,reg16 BSF reg32,reg32 bsf cx,bx 88/86 286 386 486 — — 10+3n* 6–42† BSF reg16,mem16 BSF reg32,mem32 bsf ecx,bitmask 88/86 286 386 486 — — 10+3n* 7–43§ Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 71 of 23 Printed: 10/02/00 04:15 PM 72 BSWAP Byte Swap Encoding 00001111 10111101 mod, reg, r/m disp (0, 1, 2, or 4) Syntax Examples CPU Clock Cycles BSR reg16,reg16 BSR reg32,reg32 bsr cx,dx 88/86 286 386 486 — — 10+3n* 103 – 3n# BSR reg16,mem16 BSR reg32,mem32 bsr eax,bitmask 88/86 286 386 486 — — 10+3n* 104 – 3n# * n = bit position from 0 to 31. clocks = 6 if second operand equals 0. † Clocks = 8 + 4 for each byte scanned + 3 for each nibble scanned + 3 for each bit scanned in last nibble or 6 if second operand equals 0. § Same as footnote above, but add 1 clock. # n = bit position from 0 to 31. clocks = 7 if second operand equals 0. BSWAP Byte Swap 80486 Only Takes a single 32-bit register as operand and exchanges the first byte with the fourth, and the second byte with the third. This instruction does not alter any bit values within the bytes and is useful for quickly translating between 8086-family byte storage and storage schemes in which the high byte is stored first. Flags No change Encoding 00001111 11001 reg Syntax Examples CPU Clock Cycles BSWAP reg32 bswap bswap 88/86 286 386 486 — — — 1 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 72 of 24 Printed: 10/02/00 04:15 PM eax ebx BT/BTC/BTR/BTS Bit Tests 73 BT/BTC/BTR/BTS Bit Tests 80386–80486 Only Copies the value of a specified bit into the carry flag, where it can be tested by a JC or JNC instruction. The destination operand specifies the value in which the bit is located; the source operand specifies the bit position. BT simply copies the bit to the flag. BTC copies the bit and complements (toggles) it in the destination. BTR copies the bit and resets (clears) it in the destination. BTS copies the bit and sets it in the destination. Flags O D I Encoding 00001111 Encoding T S Z A P C ± 10111010 mod, BBB*,r/m disp (0, 1, 2, or 4) data (1) Syntax Examples CPU Clock Cycles BT reg16,immed8† bt ax,4 88/86 286 386 486 — — 3 3 BTC reg16,immed8† BTR reg16,immed8† BTS reg16,immed8† bts btr btc ax,4 bx,17 edi,4 88/86 286 386 486 — — 6 6 BT mem16,immed8† btr DWORD PTR [si],27 btc color[di],4 88/86 286 386 486 — — 6 3 BTC mem16,immed8† BTR mem16,immed8† BTS mem16,immed8† btc DWORD PTR [bx],27 btc maskit,4 btr color[di],4 88/86 286 386 486 — — 8 8 00001111 10BBB011* mod, reg, r/m disp (0, 1, 2, or 4) Syntax Examples CPU Clock Cycles BT reg16,reg16† bt ax,bx 88/86 286 386 486 — — 3 3 BTC reg16,reg16† BTR reg16,reg16† BTS reg16,reg16† btc bts btr eax,ebx bx,ax cx,di 88/86 286 386 486 — — 6 6 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 73 of 25 Printed: 10/02/00 04:15 PM 74 CALL Call Procedure Syntax Examples CPU Clock Cycles BT mem16,reg16† bt [bx],dx 88/86 286 386 486 — — 12 8 BTC mem16,reg16† BTR mem16,reg16† BTS mem16,reg16† bts btr btc flags[bx],cx rotate,cx [bp+8],si 88/86 286 386 486 — — 13 13 * BBB is 100 for BT, 111 for BTC, 110 for BTR, and 101 for BTS. † Operands also can be 32 bits (reg32 and mem32). CALL Call Procedure Calls a procedure. The instruction pushes the address of the next instruction onto the stack and jumps to the address specified by the operand. For NEAR calls, the offset (IP) is pushed and the new offset is loaded into IP. For FAR calls, the segment (CS) is pushed and the new segment is loaded into CS. Then the offset (IP) is pushed and the new offset is loaded into IP. A subsequent RET instruction can pop the address so that execution continues with the instruction following the call. Flags No change Encoding 11101000 Encoding disp (2) Syntax Examples CPU Clock Cycles CALL label call 88/86 286 386 486 19 (88=23) 7+m 7+m 3 10011010 upcase disp (4) Syntax Examples CPU Clock Cycles CALL label call call 88/86 286 386 486 28 (88=36) 13+m,pm=26+m* 17+m,pm=34+m* 18,pm=20* Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 74 of 26 Printed: 10/02/00 04:15 PM FAR PTR job distant CBW Convert Byte to Word Encoding Encoding 11111111 75 mod,010,r/m Syntax Examples CPU Clock Cycles CALL reg call ax 88/86 286 386 486 16 (88=20) 7+m 7+m 5 CALL mem16 call pointer 88/86 21+EA (88=29+EA) CALL mem32† call [bx] 286 386 486 11+m 10+m 5 11111111 mod,011,r/m Syntax Examples CPU Clock Cycles CALL mem32 call far_table[di] 88/86 37+EA (88=53+EA) CALL mem48† call DWORD PTR [bx] 286 386 486 16+m,pm=29+m* 22+m,pm=38+m* 17,pm=20* * Timings for calls through call and task gates are not shown, since they are used primarily in operating systems. † 80386–80486 32-bit addressing mode only. CBW Convert Byte to Word Converts a signed byte in AL to a signed word in AX by extending the sign bit of AL into all bits of AH. Flags No change Encoding 10011000* Syntax Examples CPU Clock Cycles CBW cbw 88/86 286 386 486 2 2 3 3 * CBW and CWDE have the same encoding with two exceptions: in 32-bit mode, CBW is preceded by the operand-size byte (66h) but CWDE is not; in 16-bit mode, CWDE is preceded by the operand-size byte but CBW is not. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 75 of 27 Printed: 10/02/00 04:15 PM 76 CDQ Convert Double to Quad CDQ Convert Double to Quad 80386–80486 Only Converts the signed doubleword in EAX to a signed quadword in the EDX:EAX register pair by extending the sign bit of EAX into all bits of EDX. Flags No change Encoding 10011001* Syntax Examples CPU Clock Cycles CDQ cdq 88/86 286 386 486 — — 2 3 * CWD and CDQ have the same encoding with two exceptions: in 32-bit mode, CWD is preceded by the operand-size byte (66h) but CDQ is not; in 16-bit mode, CDQ is preceded by the operand-size byte but CWD is not. CLC Clear Carry Flag Clears the carry flag. Flags O D I Encoding 11111000 T S Z A P C 0 Syntax Examples CPU Clock Cycles CLC clc 88/86 286 386 486 2 2 2 2 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 76 of 28 Printed: 10/02/00 04:15 PM CLTS Clear Task-Switched Flag 77 CLD Clear Direction Flag Clears the direction flag. All subsequent string instructions will process up (from low addresses to high addresses) by increasing the appropriate index registers. Flags O D I 0 Encoding 11111100 T S Z A P C Syntax Examples CPU Clock Cycles CLD cld 88/86 286 386 486 2 2 2 2 CLI Clear Interrupt Flag Clears the interrupt flag. When the interrupt flag is cleared, maskable interrupts are not recognized until the flag is set again with the STI instruction. In protected mode, CLI clears the flag only if the current task’s privilege level is less than or equal to the value of the IOPL flag. Otherwise, a general-protection fault occurs. Flags O D I T S Z A P C 0 Encoding 11111010 Syntax Examples CPU Clock Cycles CLI cli 88/86 286 386 486 2 3 3 5 CLTS Clear Task-Switched Flag 80286–80486 Privileged Only Clears the task-switched flag in the Machine Status Word (MSW) of the 80286, or the CR0 register of the 80386–80486. This instruction can be used only in system software executing at privilege level Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 77 of 29 Printed: 10/02/00 04:15 PM 78 CMC Complement Carry Flag 0. See Intel documentation for details on the task-switched flag and other privileged-mode concepts. Flags No change Encoding 00001111 00000110 Syntax Examples CPU Clock Cycles CLTS clts 88/86 286 386 486 — 2 5 7 CMC Complement Carry Flag Complements (toggles) the carry flag. Flags O D I Encoding 11110101 T S Z A P C ± Syntax Examples CPU Clock Cycles CMC cmc 88/86 286 386 486 2 2 2 2 CMP Compare Two Operands Compares two operands as a test for a subsequent conditional-jump or set instruction. CMP does this by subtracting the source operand from the destination operand and setting the flags according to the result. CMP is the same as the SUB instruction, except that the result is not stored. Flags O D I ± T S Z A P C ± ± ± ± ± Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 78 of 30 Printed: 10/02/00 04:15 PM CMP Compare Two Operands Encoding Encoding Encoding 001110dw mod, reg, r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles CMP reg,reg cmp cmp di,bx dl,cl 88/86 286 386 486 3 2 2 1 CMP mem,reg cmp cmp maximum,dx array[si],bl 88/86 286 386 486 9+EA (W88=13+EA) 7 5 2 CMP reg,mem cmp cmp dx,minimum bh,array[si] 88/86 286 386 486 9+EA (W88=13+EA) 6 6 2 100000sw mod, 111,r/m disp (0, 1, or 2) data (1 or 2) Syntax Examples CPU Clock Cycles CMP reg,immed cmp bx,24 88/86 286 386 486 4 3 2 1 CMP mem,immed cmp cmp WORD PTR [di],4 tester,4000 88/86 286 386 486 10+EA (W88=14+EA) 6 5 2 0011110w data (1 or 2) Syntax Examples CPU Clock Cycles CMP accum,immed cmp 88/86 286 386 486 4 3 2 1 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 79 of 31 Printed: 10/02/00 04:15 PM ax,1000 79 80 CMPS/CMPSB/CMPSW/CMPSD Compare String CMPS/CMPSB/CMPSW/CMPSD Compare String Compares two strings. DS:SI must point to the source string and ES:DI must point to the destination string (even if operands are given). For each comparison, the destination element is subtracted from the source element and the flags are updated to reflect the result (although the result is not stored). DI and SI are adjusted according to the size of the operands and the status of the direction flag. They are increased if the direction flag has been cleared with CLD, or decreased if the direction flag has been set with STD. If the CMPS form of the instruction is used, operands must be provided to indicate the size of the data elements to be processed. A segment override can be given for the source (but not for the destination). If CMPSB (bytes), CMPSW (words), or CMPSD (doublewords on the 80386–80486 only) is used, the instruction determines the size of the data elements to be processed. CMPS and its variations are normally used with repeat prefixes. REPNE (or REPNZ) is used to find the first match between two strings. REPE (or REPZ) is used to find the first mismatch. Before the comparison, CX should contain the maximum number of elements to compare. After a REPNE CMPS, the zero flag is clear if no match was found. After a REPE CMPS, the zero flag is set if no mismatch was found. When the instruction finishes, ES:DI and DS:SI point to the element that follows (if the direction flag is clear) or precedes (if the direction flag is set) the match or mismatch. If CX decrements to 0, ES:DI and DS:SI point to the element that follows or precedes the last comparison. The zero flag is set or clear according to the result of the last comparison, not according to the value of CX. Flags O D I ± Encoding 1010011w T S Z A P C ± ± ± ± ± Syntax Examples CPU Clock Cycles CMPS [[segreg:]] src, [[ES:]] dest CMPSB [[[[segreg:[[ src, ]]ES:]] dest]] CMPSW [[[[segreg:[[ src, ]]ES:]] dest]] CMPSD [[[[segreg:[[ src, ]]ES:]] dest]] cmps repne repe repne 88/86 286 386 486 22 (W88=30) 8 10 8 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 80 of 32 Printed: 10/02/00 04:15 PM source,es:dest cmpsw cmpsb cmpsd CWD Convert Word to Double 81 CMPXCHG Compare and Exchange 80486 Only Compares the destination operand to the accumulator (AL, AX, or EAX). If equal, the source operand is copied to the destination. Otherwise, the destination is copied to the accumulator. The instruction sets flags according to the result of the comparison. Flags O D I ± Encoding 00001111 T S Z A P C ± ± ± ± ± 1011000b mod, reg, r/m Syntax Examples CMPXCHG mem,reg cmpxchg cmpxchg CMPXCHG reg,reg cmpxchg cmpxchg disp (0, 1, or 2) CPU Clock Cycles warr[bx],cx string,bl 88/86 286 386 486 — — — 7–10 dl,cl bx,dx 88/86 286 386 486 — — — 6 CWD Convert Word to Double Converts the signed word in AX to a signed doubleword in the DX:AX register pair by extending the sign bit of AX into all bits of DX. Flags O D I ± Encoding 10011001* T S Z A P C ± ± ± ± ± Syntax Examples CPU Clock Cycles CWD cwd 88/86 286 386 486 5 2 2 3 * CWD and CDQ have the same encoding with two exceptions: in 32-bit mode, CWD is preceded by the operand-size byte (66h) but CDQ is not; in 16-bit mode, CDQ is preceded by the operand-size byte but CWD is not. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 81 of 33 Printed: 10/02/00 04:15 PM 82 CWDE Convert Word to Extended Double CWDE Convert Word to Extended Double 80386–80486 Only Converts a signed word in AX to a signed doubleword in EAX by extending the sign bit of AX into all bits of EAX. Flags No change Encoding 10011000* Syntax Examples CPU Clock Cycles CWDE cwde 88/86 286 386 486 — — 3 3 * CBW and CWDE have the same encoding with two exceptions: in 32-bit mode, CBW is preceded by the operand-size byte (66h) but CWDE is not; in 16-bit mode, CWDE is preceded by the operand-size byte but CBW is not. DAA Decimal Adjust After Addition Adjusts the result of an addition to a packed BCD number (less than 100 decimal). The previous addition instruction should place its 8-bit binary sum in AL. DAA converts this binary sum to packed BCD format with the least significant decimal digit in the lower four bits and the most significant digit in the upper four bits. If the sum is greater than 99h after adjustment, the carry and auxiliary carry flags are set. Otherwise, the carry and auxiliary carry flags are cleared. Flags O D I ? Encoding 00100111 T S Z A P C ± ± ± ± ± Syntax Examples CPU Clock Cycles DAA daa 88/86 286 386 486 4 3 4 2 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 82 of 34 Printed: 10/02/00 04:15 PM DEC Decrement 83 DAS Decimal Adjust After Subtraction Adjusts the result of a subtraction to a packed BCD number (less than 100 decimal). The previous subtraction instruction should place its 8-bit binary result in AL. DAS converts this binary sum to packed BCD format with the least significant decimal digit in the lower four bits and the most significant digit in the upper four bits. If the sum is greater than 99h after adjustment, the carry and auxiliary carry flags are set. Otherwise, the carry and auxiliary carry flags are cleared. Flags O D I ? Encoding 00101111 T S Z A P C ± ± ± ± ± Syntax Examples CPU Clock Cycles DAS das 88/86 286 386 486 4 3 4 2 DEC Decrement Subtracts 1 from the destination operand. Because the operand is treated as an unsigned integer, the DEC instruction does not affect the carry flag. To detect any effects on the carry flag, use the SUB instruction. Flags O D I ± Encoding 1111111w T S Z A P C ± ± ± ± mod, 001,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles DEC reg8 dec cl 88/86 286 386 486 3 2 2 1 DEC mem dec counter 88/86 286 386 486 15+EA (W88=23+EA) 7 6 3 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 83 of 35 Printed: 10/02/00 04:15 PM 84 DIV Unsigned Divide Encoding 01001 reg Syntax Examples CPU Clock Cycles DEC reg16 dec 88/86 3 286 386 486 2 2 1 ax DEC reg32* * 80386–80486 only. DIV Unsigned Divide Divides an implied destination operand by a specified source operand. Both operands are treated as unsigned numbers. If the source (divisor) is 16 bits wide, the implied destination (dividend) is the DX:AX register pair. The quotient goes into AX and the remainder into DX. If the source is 8 bits wide, the implied destination operand is AX. The quotient goes into AL and the remainder into AH. On the 80386–80486, if the source is EAX, the quotient goes into EAX and the remainder into EDX. Flags O D I ? Encoding 1111011w T S Z A P C ? ? ? ? ? mod, 110,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles DIV reg div div cx dl 88/86 286 386 486 b=80–90,w=144–162 b=14,w=22 b=14,w=22,d=38 b=16,w=24,d=40 DIV mem div div [bx] fsize 88/86 (b=86–96,w=150– 168)+EA* b=17,w=25 b=17,w=25,d=41 b=16,w=24,d=40 286 386 486 * Word memory operands on the 8088 take (158–176)+EA clocks. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 84 of 36 Printed: 10/02/00 04:15 PM HLT Halt ENTER Make Stack Frame 80286-80486 Only Creates a stack frame for a procedure that receives parameters passed on the stack. When immed16 is 0, ENTER is equivalent to push bp, followed by mov bp,sp. The first operand of the ENTER instruction specifies the number of bytes to reserve for local variables. The second operand specifies the nesting level for the procedure. The nesting level should be 0 for languages that do not allow access to local variables of higherlevel procedures (such as C, Basic, and FORTRAN). See the complementary instruction LEAVE for a method of exiting from a procedure. Flags No change Encoding 11001000 data (2) data (1) Syntax Examples CPU Clock Cycles ENTER immed16,0 enter 4,0 88/86 286 386 486 — 11 10 14 ENTER immed16,1 enter 0,1 88/86 286 386 486 — 15 12 17 ENTER immed16,immed8 enter 6,4 88/86 286 386 486 — 12+4(n – 1) 15+4(n – 1) 17+3n HLT Halt Stops CPU execution until an interrupt restarts execution at the instruction following HLT. In protected mode, this instruction works only in privileged mode. Flags No change Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 85 of 37 Printed: 10/02/00 04:15 PM 85 86 HLT Halt Encoding 11110100 Syntax Examples CPU Clock Cycles HLT hlt 88/86 286 386 486 2 2 5 4 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 86 of 38 Printed: 10/02/00 04:15 PM IMUL Signed Multiply 87 IDIV Signed Divide Divides an implied destination operand by a specified source operand. Both operands are treated as signed numbers. If the source (divisor) is 16 bits wide, the implied destination (dividend) is the DX:AX register pair. The quotient goes into AX and the remainder into DX. If the source is 8 bits wide, the implied destination is AX. The quotient goes into AL and the remainder into AH. On the 80386–80486, if the source is EAX, the quotient goes into EAX and the remainder into EDX. Flags O D I ? Encoding 1111011w T S Z A P C ? ? ? ? ? mod, 111,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles IDIV reg idiv idiv 88/86 b=101–112,w= 165–184 b=17,w=25 b=19,w=27,d=43 b=19,w=27,d=43 bx dl 286 386 486 IDIV mem idiv itemp 88/86 286 386 486 (b=107–118,w=171– 190)+EA* b=20,w=28 b=22,w=30,d=46 b=20,w=28,d=44 * Word memory operands on the 8088 take (175–194)+EA clocks. IMUL Signed Multiply Multiplies an implied destination operand by a specified source operand. Both operands are treated as signed numbers. If a single 16-bit operand is given, the implied destination is AX and the product goes into the DX:AX register pair. If a single 8-bit operand is given, the implied destination is AL and the product goes into AX. On the 80386–80486, if the operand is EAX, the product goes into the EDX:EAX register pair. The carry and overflow flags are set if the product is sign-extended into DX for 16-bit operands, into AH for 8-bit operands, or into EDX for 32-bit operands. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 87 of 39 Printed: 10/02/00 04:15 PM 88 IMUL Signed Multiply Two additional syntaxes are available on the 80186–80486 processors. In the two-operand form, a 16-bit register gives one of the factors and serves as the destination for the result; a source constant specifies the other factor. In the three-operand form, the first operand is a 16-bit register where the result will be stored, the second is a 16-bit register or memory operand containing one of the factors, and the third is a constant representing the other factor. With both variations, the overflow and carry flags are set if the result is too large to fit into the 16-bit destination register. Since the low 16 bits of the product are the same for both signed and unsigned multiplication, these syntaxes can be used for either signed or unsigned numbers. On the 80386–80486, the operands can be either 16 or 32 bits wide. A fourth syntax is available on the 80386–80486. Both the source and destination operands can be given specifically. The source can be any 16- or 32bit memory operand or general-purpose register. The destination can be any general-purpose register of the same size. The overflow and carry flags are set if the product does not fit in the destination. Flags O D I ± Encoding 1111011w T S Z A P C ? ? ? ? ± mod, 101,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles IMUL reg imul dx 88/86 286 386 486 b=80–98,w=128–154 b=13,w=21 b=9–14,w=9–22,d=9–38* b=13–18,w=13–26,d=13–42 IMUL mem imul factor 88/86 286 386 486 (b=86–104,w=134–160)+EA† b=16,w=24 b=12–17,w=12–25,d=12–41* b=13–18,w=13–26, d=13–42 * The 80386–80486 processors have an early-out multiplication algorithm. Therefore, multiplying an 8-bit or 16-bit value in EAX takes the same time as multiplying the value in AL or AX. † Word memory operands on the 8088 take (138–164)+EA clocks. Encoding 011010s1 mod, reg, r/m disp (0, 1, or 2) data (1 or 2) Syntax Examples CPU Clock Cycles IMUL reg16,immed IMUL reg32,immed* imul 88/86 286 386 486 — 21 b=9–14,w=9–22,d=9–38† b=13–18,w=13–26,d=13–42 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 88 of 40 Printed: 10/02/00 04:15 PM cx,25 IMUL IMUL reg16,reg16,immed IMUL reg32,reg32,immed* Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 89 of 41 Printed: 10/02/00 04:15 PM imul dx,ax,18 88/86 286 386 486 Signed Multiply 89 — 21 b=9–14,w=9–22,d=9–38† b=13–18,w=13–26,d=13–42 90 IN Input from Port Encoding Syntax Examples CPU Clock Cycles IMUL reg16,mem16,immed IMUL reg32,mem32,immed* imul bx,[si],60 88/86 286 386 486 — 24 b=12–17,w=12–25,d=12–41† b=13–18,w=13–26,d=13–42 00001111 10101111 mod,reg,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles IMUL reg16,reg16 IMUL reg32,reg32* imul 88/86 286 386 486 — — w=9–22,d=9–38 b=13–18,w=13–26,d=13–42 IMUL reg16,mem16 IMUL reg32,mem32* imul dx,[si] 88/86 286 386 486 — — w=12–25,d=12–41 b=13–18,w=13–26,d=13–42 cx,ax * 80386–80486 only. † The variations depend on the source constant size; destination size is not a factor. IN Input from Port Transfers a byte or word (or doubleword on the 80386–80486) from a port to the accumulator register. The port address is specified by the source operand, which can be DX or an 8-bit constant. Constants can be used only for port numbers less than 255; use DX for higher port numbers. In protected mode, a general-protection fault occurs if IN is used when the current privilege level is greater than the value of the IOPL flag. Flags No change Encoding 1110010w data (1) Syntax Examples CPU Clock Cycles IN accum,immed in 88/86 286 386 486 10 (W88=14) 5 12,pm=6,26* 14,pm=9,29*† Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 90 of 42 Printed: 10/02/00 04:15 PM ax,60h INC Increment Encoding 91 1110110w Syntax Examples CPU Clock Cycles IN accum,DX in in 88/86 286 386 486 8 (W88=12) 5 13,pm=7,27* 14,pm=8,28*† ax,dx al,dx * First protected-mode timing: CPL ≤ IOPL. Second timing: CPL > IOPL. † Takes 27 clocks in virtual 8086 mode. INC Increment Adds 1 to the destination operand. Because the operand is treated as an unsigned integer, the INC instruction does not affect the carry flag. If a signed carry requires detection, use the ADD instruction. Flags O D I ± Encoding 1111111w Encoding T S Z A P C ± ± ± ± mod,000,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles INC reg8 inc cl 88/86 286 386 486 3 2 2 1 INC mem inc vpage 88/86 286 386 486 15+EA (W88=23+EA) 7 6 3 01000 reg Syntax Examples CPU Clock Cycles INC reg16 INC reg32* inc 88/86 286 386 486 3 2 2 1 * 80386–80486 only. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 91 of 43 Printed: 10/02/00 04:15 PM bx 92 INS/INSB/INSW/INSD Input from Port to String INS/INSB/INSW/INSD Input from Port to String 80286-80486 Only Receives a string from a port. The string is considered the destination and must be pointed to by ES:DI (even if an operand is given). The input port is specified in DX. For each element received, DI is adjusted according to the size of the operand and the status of the direction flag. DI is increased if the direction flag has been cleared with CLD or decreased if the direction flag has been set with STD. If the INS form of the instruction is used, a destination operand must be provided to indicate the size of the data elements to be processed, and DX must be specified as the source operand containing the port number. A segment override is not allowed. If INSB (bytes), INSW (words), or INSD (doublewords on the 80386–80486 only) is used, the instruction determines the size of the data elements to be received. INS and its variations are normally used with the REP prefix. Before the repeated instruction is executed, CX should contain the number of elements to be received. In protected mode, a general-protection fault occurs if INS is used when the current privilege level is greater than the value of the IOPL flag. Flags No change Encoding 0110110w Syntax Examples CPU Clock Cycles INS [[ES:]] dest, DX ins es:instr,dx 88/86 — INSB [[[[ES:]] dest, DX]] rep insb 286 5 INSW [[[[ES:]] dest, DX]] rep insw 386 15,pm=9,29* INSD [[[[ES:]] dest, DX]] rep insd 486 17,pm=10,32* * First protected-mode timing: CPL ≤ IOPL. Second timing: CPL > IOPL. INT Interrupt Generates a software interrupt. An 8-bit constant operand (0 to 255) specifies the interrupt procedure to be called. The call is made by indexing the interrupt number into the Interrupt Vector Table (IVT) starting at segment 0, offset 0. In real mode, the IVT contains 4-byte pointers to interrupt procedures. In privileged mode, the IVT contains 8-byte pointers. When an interrupt is called in real mode, the flags, CS, and IP are pushed onto the stack (in that order), and the trap and interrupt flags are cleared. STI can be Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 92 of 44 Printed: 10/02/00 04:15 PM INTO Interrupt on Overflow 93 used to restore interrupts. See Intel documentation and the documentation for your operating system for details on using and defining interrupts in privileged mode. To return from an interrupt, use the IRET instruction. Flags O D I T S Z A P C 0 0 Encoding 11001101 Encoding data (1) Syntax Examples CPU Clock Cycles INT immed8 int 88/86 286 386 486 51 (88=71) 23+m,pm=(40,78)+m* 37,pm=59,99* 30,pm=44,71* 25h 11001100 Syntax Examples CPU Clock Cycles INT 3 int 88/86 286 386 486 52 (88=72) 23+m,pm=(40,78)+m* 33,pm=59,99* 26,pm=44,71* 3 * The first protected-mode timing is for interrupts to the same privilege level. The second is for interrupts to a higher privilege level. Timings for interrupts through task gates are not shown. INTO Interrupt on Overflow Generates Interrupt 4 if the overflow flag is set. The default MS-DOS behavior for Interrupt 4 is to return without taking any action. For INTO to have any effect, you must define an interrupt procedure for Interrupt 4. Flags O D I T S Z A P C ± ± Encoding 11001110 Syntax Examples CPU Clock Cycles INTO into 88/86 286 53 (88=73),noj=4 24+m,noj=3,pm=(40, 78)+m* 35,noj=3,pm=59,99* 28,noj=3,pm=46,73* 386 486 * The first protected-mode timing is for interrupts to the same privilege level. The second is for interrupts to a higher privilege level. Timings for interrupts through task gates are not shown. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 93 of 45 Printed: 10/02/00 04:15 PM 94 INVD Invalidate Data Cache INVD Invalidate Data Cache 80486 Only Empties contents of the current data cache without writing changes to memory. Proper use of this instruction requires knowledge of how contents are placed in the cache. INVD is intended primarily for system programming. See Intel documentation for details. Flags No change Encoding 00001111 00001000 Syntax Examples CPU Clock Cycles INVD invd 88/86 286 386 486 — — — 4 INVLPG Invalidate TLB Entry 80486 Only Invalidates an entry in the Translation Lookaside Buffer (TLB), used by the demand-paging mechanism in virtual-memory operating systems. The instruction takes a single memory operand and calculates the effective address of the operand, including the segment address. If the resulting address is mapped by any entry in the TLB, this entry is removed. Proper use of INVLPG requires understanding the hardware-supported demand-paging mechanism. INVLPG is intended primarily for system programming. See Intel documentation for details. Flags No change Encoding 00001111 00000001 mod, reg, r/m disp (2) Syntax Examples CPU Clock Cycles INVLPG invlpg invlpg 88/86 286 386 486 — — — 12* pointer[bx] es:entry * 11 clocks if address is not mapped by any TLB entry. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 94 of 46 Printed: 10/02/00 04:15 PM Jcondition Jump Conditionally 95 IRET/IRETD Interrupt Return Returns control from an interrupt procedure to the interrupted code. In real mode, the IRET instruction pops IP, CS, and the flags (in that order) and resumes execution. See Intel documentation for details on IRET operation in privileged mode. On the 80386–80486, the IRETD instruction should be used to pop a 32-bit instruction pointer when returning from an interrupt called from a 32-bit segment. The F suffix prevents epilogue code from being generated when ending a PROC block. Use it to terminate interrupt service procedures. Flags O D I T S Z A P C ± ± ± ± ± ± ± ± ± Encoding 11001111 Syntax Examples CPU Clock Cycles IRET iret 88/86 32 (88=44) IRETD* 286 17+m,pm=(31,55)+m† IRETF 386 22,pm=38,82† IRETDF* 486 15,pm=20,36 * 80386–80486 only. † The first protected-mode timing is for interrupts to the same privilege level within a task. The second is for interrupts to a higher privilege level within a task. Timings for interrupts through task gates are not shown. Jcondition Jump Conditionally Transfers execution to the specified label if the flags condition is true. The condition is tested by checking the flags shown in the table on the following page. If condition is false, no jump is taken and program execution continues at the next instruction. On the 8086–80286 processors, the label given as the operand must be short (between –128 and +127 bytes from the instruction following the jump).* The 80386–80486 processors allow near jumps (–32,768 to +32,767 bytes). On the 80386–80486, the assembler generates the shortest jump possible, unless the jump size is explicitly specified. When the 80386–80486 processors are in FLAT memory model, short jumps range from –128 to +127 bytes and near jumps range from –2 to +2 gigabytes. There are no far jumps. Flags No change Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 95 of 47 Printed: 10/02/00 04:15 PM 96 Jcondition Encoding Encoding Jump Conditionally 0111cond disp (1) Syntax Examples CPU Clock Cycles Jcondition label jg jo jpe 88/86 286 386 486 16,noj=4 7+m,noj=3 7+m,noj=3 3,noj=1 00001111 1000cond bigger SHORT too_big p_even disp (2) Syntax Examples CPU Clock Cycles Jcondition label† je next jnae lesser js negative 88/86 286 386 486 — — 7+m,noj=3 3,noj=1 * If a source file for an 8086–80286 program contains a conditional jump outside the range of –128 to +127 bytes, the assembler emits a level 3 warning and generates two instructions (including an unconditional jump) that are the equivalent of the desired instruction. This behavior can be enabled and disabled with the OPTION LJMP and OPTION NOLJMP directives. † Near labels are only available on the 80386–80486. They are the default. Jump Conditions Opcode* Mnemonic Flags Checked Description size 0010 JB/JNAE CF=1 Jump if below/not above or equal (unsigned comparisons) size 0011 JAE/JNB CF=0 Jump if above or equal/not below (unsigned comparisons) size 0110 JBE/JNA CF=1 or ZF=1 Jump if below or equal/not above (unsigned comparisons) size 0111 JA/JNBE CF=0 and ZF=0 Jump if above/not below or equal (unsigned comparisons) size 0100 JE/JZ ZF=1 Jump if equal (zero) size 0101 JNE/JNZ ZF=0 Jump if not equal (not zero) size 1100 JL/JNGE SF_OF Jump if less/not greater or equal (signed comparisons) size 1101 JGE/JNL SF=OF Jump if greater or equal/not less (signed comparisons) size 1110 JLE/JNG ZF=1 or SF_OF Jump if less or equal/not greater (signed comparisons) size 1111 JG/JNLE ZF=0 and SF=OF Jump if greater/not less or equal (signed comparisons) size 1000 JS SF=1 Jump if sign size 1001 JNS SF=0 Jump if not sign Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 96 of 48 Printed: 10/02/00 04:15 PM JMP Jump Unconditionally Opcode* Mnemonic Flags Checked Description size 0010 JC CF=1 Jump if carry size 0011 JNC CF=0 Jump if not carry size 0000 JO OF=1 Jump if overflow size 0001 JNO OF=0 Jump if not overflow size 1010 JP/JPE PF=1 Jump if parity/parity even size 1011 JNP/JPO PF=0 Jump if no parity/parity odd 97 * The size bits are 0111 for short jumps or 1000 for 80386–80486 near jumps. JCXZ/JECXZ Jump if CX is Zero Transfers program execution to the specified label if CX is 0. On the 80386– 80486, JECXZ can be used to jump if ECX is 0. If the count register is not 0, execution continues at the next instruction. The label given as the operand must be short (between –128 and +127 bytes from the instruction following the jump). Flags No change Encoding 11100011 disp (1) Syntax Examples CPU Clock Cycles JCXZ label JECXZ label* jcxz 88/86 286 386 486 18,noj=6 8+m,noj=4 9+m,noj=5 8,noj=5 not found * 80386–80486 only. JMP Jump Unconditionally Transfers program execution to the address specified by the destination operand. Jumps are near (between –32,768 and +32,767 bytes from the instruction following the jump), or short (between –128 and +127 bytes), or far (in a different code segment). Unless a distance is explicitly specified, the assembler selects the shortest possible jump. With near and short jumps, the operand specifies a new IP address. With far jumps, the operand specifies new IP and CS addresses. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 97 of 49 Printed: 10/02/00 04:15 PM 98 JMP Jump Unconditionally When the 80386–80486 processors are in FLAT memory model, short jumps range from –128 to +127 bytes and near jumps range from –2 to +2 gigabytes. Flags No change Encoding 11101011 Encoding Encoding Encoding disp (1) Syntax Examples CPU Clock Cycles JMP label jmp 88/86 286 386 486 15 7+m 7+m 3 11101001 SHORT exit disp (2*) Syntax Examples CPU Clock Cycles JMP label jmp jmp 88/86 286 386 486 15 7+m 7+m 3 11101010 close NEAR PTR distant disp (4*) Syntax Examples CPU Clock Cycles JMP label jmp jmp 88/86 286 386 486 15 11+m,pm=23+m† 12+m,pm=27+m† 17,pm=19† 11111111 mod,100,r/m FAR PTR close distant disp (0 or 2) Syntax Examples CPU Clock Cycles JMP reg16 JMP mem32§ jmp ax 88/86 286 386 486 11 7+m 7+m 5 JMP mem16 JMP mem32§ jmp jmp jmp WORD PTR [bx] table[di] DWORD PTR [si] 88/86 286 386 486 18+EA 11+m 10+m 5 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 98 of 50 Printed: 10/02/00 04:15 PM LAR Load Access Rights Encoding 11111111 mod,101,r/m 99 disp (4*) Syntax Examples CPU Clock Cycles JMP mem32 JMP mem48§ jmp jmp jmp 88/86 286 386 486 24+EA 15+m,pm=26+m 12+m,pm=27+m 13,pm=18 fpointer[si] DWORD PTR [bx] FWORD PTR [di] * On the 80386–80486, the displacement can be 4 bytes for near jumps or 6 bytes for far jumps. † Timings for jumps through call or task gates are not shown, since they are normally used only in operating systems. § 80386–80486 only. You can use DWORD PTR to specify near register-indirect jumps or FWORD PTR to specify far register-indirect jumps. LAHF Load Flags into AH Register Transfers bits 0 to 7 of the flags register to AH. This includes the carry, parity, auxiliary carry, zero, and sign flags, but not the trap, interrupt, direction, or overflow flags. Flags No change Encoding 10011111 Syntax Examples CPU Clock Cycles LAHF lahf 88/86 286 386 486 4 2 2 3 LAR Load Access Rights 80286-80486 Protected Only Loads the access rights of a selector into a specified register. The source operand must be a register or memory operand containing a selector. The destination operand must be a register that will receive the access rights if the selector is valid and visible at the current privilege level. The zero flag is set if the access rights are transferred, or cleared if they are not. See Intel documentation for details on selectors, access rights, and other privileged-mode concepts. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 99 of 51 Printed: 10/02/00 04:15 PM 100 LDS/LES/LFS/LGS/LSS Load Far Pointer Flags O D I Encoding 00001111 T S Z A P C ± 00000010 mod, reg, r/m disp (0, 1, 2, or 4) Syntax Examples CPU Clock Cycles LAR reg16,reg16 LAR reg32,reg32* lar ax,bx 88/86 286 386 486 — 14 15 11 LAR reg16,mem16 LAR reg32,mem32* lar cx,selector 88/86 286 386 486 — 16 16 11 * 80386–80486 only. LDS/LES/LFS/LGS/LSS Load Far Pointer Reads and stores the far pointer specified by the source memory operand. The instruction moves the pointer’s segment value into DS, ES, FS, GS, or SS (depending on the instruction). Then it moves the pointer’s offset value into the destination operand. The LDS and LES instructions are available on all processors. The LFS, LGS, and LSS instructions are available only on the 80386–80486. Flags No change Encoding 11000101 Encoding mod, reg, r/m disp (2) Syntax Examples CPU Clock Cycles LDS reg,mem lds 88/86 286 386 486 16+EA (88=24+EA) 7,pm=21 7,pm=22 6,pm=12 11000100 mod, reg, r/m si,fpointer disp (2) Syntax Examples CPU Clock Cycles LES reg,mem les 88/86 286 386 486 16+EA (88=24+EA) 7,pm=21 7,pm=22 6,pm=12 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 100 of 52 Printed: 10/02/00 04:15 PM di,fpointer LEA Load Effective Address Encoding Encoding Encoding 00001111 10110100 mod, reg, r/m disp (2 or 4) Syntax Examples CPU Clock Cycles LFS reg,mem lfs 88/86 286 386 486 — — 7,pm=25 6,pm=12 00001111 10110101 edi,fpointer mod, reg, r/m disp (2 or 4) Syntax Examples CPU Clock Cycles LGS reg,mem lgs 88/86 286 386 486 — — 7,pm=25 6,pm=12 00001111 10110010 bx,fpointer mod, reg, r/m disp (2 or 4) Syntax Examples CPU Clock Cycles LSS reg,mem lss 88/86 286 386 486 — — 7,pm=22 6,pm=12 bp,fpointer LEA Load Effective Address Calculates the effective address (offset) of the source memory operand and stores the result in the destination register. If the source operand is a direct memory address, the assembler encodes the instruction in the more efficient MOV reg,immediate form (equivalent to MOV reg, OFFSET mem). Flags No change Encoding 10001101 mod, reg, r/m disp (2) Syntax Examples CPU Clock Cycles LEA reg16,mem LEA reg32,mem* lea 88/86 286 386 486 2+EA 3 2 1† * 80386–80486 only. † 2 if index register used. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 101 of 53 Printed: 10/02/00 04:15 PM bx,npointer 101 102 LEAVE High Level Procedure Exit LEAVE High Level Procedure Exit Terminates the stack frame of a procedure. LEAVE reverses the action of a previous ENTER instruction by restoring SP and BP to the values they had before the procedure stack frame was initialized. LEAVE is equivalent to mov sp,bp, followed by pop bp. Flags No change Encoding 11001001 Syntax Examples CPU Clock Cycles LEAVE leave 88/86 286 386 486 — 5 4 5 LES/LFS/LGS Load Far Pointer to Extra Segment See LDS. LGDT/LIDT/LLDT Load Descriptor Table Loads a value from an operand into a descriptor table register. LGDT loads into the Global Descriptor Table, LIDT into the Interrupt Vector Table, and LLDT into the Local Descriptor Table. These instructions are available only in privileged mode. See Intel documentation for details on descriptor tables and other protected-mode concepts. Flags No change Encoding 00001111 00000001 mod, 010,r/m disp (2) Syntax Examples CPU Clock Cycles LGDT mem48 lgdt 88/86 286 386 486 — 11 11 11 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 102 of 54 Printed: 10/02/00 04:15 PM descriptor LMSW Load Machine Status Word Encoding Encoding 00001111 00000001 mod, 011,r/m disp (2) Syntax Examples CPU Clock Cycles LIDT mem48 lidt 88/86 286 386 486 — 12 11 11 00001111 00000000 descriptor mod, 010,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles LLDT reg16 lldt ax 88/86 286 386 486 — 17 20 11 LLDT mem16 lldt selector 88/86 286 386 486 — 19 24 11 LMSW Load Machine Status Word 80286-80486 Privileged Only Loads a value from a memory operand into the Machine Status Word (MSW). This instruction is available only in privileged mode. See Intel documentation for details on the MSW and other protectedmode concepts. Flags No change Encoding 00001111 00000001 mod, 110,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles LMSW reg16 lmsw ax 88/86 286 386 486 — 3 10 13 LMSW mem16 lmsw machine 88/86 286 386 486 — 6 13 13 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 103 of 55 Printed: 10/02/00 04:15 PM 103 104 LOCK Lock the Bus LOCK Lock the Bus Locks out other processors during execution of the next instruction. This instruction is a prefix. It must precede an instruction that accesses a memory location that another processor might attempt to access at the same time. See Intel documentation for details on multiprocessor environments. Flags No change Encoding 11110000 Syntax Examples CPU Clock Cycles LOCK instruction lock 88/86 286 386 486 2 0 0 1 xchg ax,sem LODS/LODSB/LODSW/LODSD Load Accumulator from String LODS/LODSB/LODSW/LODSD Accumulator from String Loads the accumulator register with anLoad element from a string in memory. DS:SI must point to the source element, even if an operand is given. For each source element loaded, SI is adjusted according to the size of the operand and the status of the direction flag. SI is incremented if the direction flag has been cleared with CLD or decremented if the direction flag has been set with STD. If the LODS form of the instruction is used, an operand must be provided to indicate the size of the data elements to be processed. A segment override can be given. If LODSB (bytes), LODSW (words), or LODSD (doublewords on the 80386–80486 only) is used, the instruction determines the size of the data elements to be processed and whether the element will be loaded to AL, AX, or EAX. LODS and its variations are not used with repeat prefixes, since there is no reason to repeatedly load memory values to a register. Flags No change Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 104 of 56 Printed: 10/02/00 04:15 PM LOOPcondition/LOOPconditionW/LOOPconditionD Loop Conditionally Encoding 105 1010110w Syntax Examples CPU Clock Cycles LODS [[segreg:]]src LODSB [[[[segreg:]]src]] LODSW[[[[segreg:]]src]] LODSD [[[[segreg:]]src]] lods es:source lodsw 88/86 286 386 486 12 (W88=16) 5 5 5 LOOP/LOOPW/LOOPD Loop Loops repeatedly to a specified label. LOOP decrements CX (without changing any flags) and, if the result is not 0, transfers execution to the address specified by the operand. On the 80386–80486, LOOP uses the 16-bit CX in 16-bit mode and the 32-bit ECX in 32-bit mode. The default can be overridden with LOOPW (CX) or LOOPD (ECX). If CX is 0 after being decremented, execution continues at the next instruction. The operand must specify a short label (between –128 and +127 bytes from the instruction following the LOOP instruction). Flags No change Encoding 11100010 disp (1) Syntax Examples CPU Clock Cycles LOOP label LOOPW label* LOOPD label* loop 88/86 286 386 486 17,noj=5 8+m,noj=4 11+m 7,noj=6 wend * 80386–80486 only. LOOPcondition/LOOPconditionW/LOOPconditionD Loop Conditionally Loops repeatedly to a specified label if condition is met and if CX is not 0. On the 80386–80486, these instructions use the 16-bit CX in 16-bit mode and the 32-bit ECX in 32-bit mode. This default can be overridden with the W (CX) or D (ECX) forms of the instruction. The instruction decrements CX (without changing any flags) and tests whether the zero flag was set by a previous instruction (such as CMP). With LOOPE and LOOPZ (they are synonyms), Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 105 of 57 Printed: 10/02/00 04:15 PM 106 LSL Load Segment Limit execution is transferred to the label if the zero flag is set and CX is not 0. With LOOPNE and LOOPNZ (they are synonyms), execution is transferred to the label if the zero flag is cleared and CX is not 0. Execution continues at the next instruction if the condition is not met. Before entering the loop, CX should be set to the maximum number of repetitions desired. Flags No change Encoding 11100001 Encoding disp (1) Syntax Examples CPU Clock Cycles LOOPE label LOOPEW label* LOOPED label* LOOPZ label LOOPZW label* LOOPZD label* loopz 88/86 286 386 486 18,noj=6 8+m,noj=4 11+m 9,noj=6 11100000 again disp (1) Syntax Examples CPU Clock Cycles LOOPNE label LOOPNEW label* LOOPNED label* LOOPNZ label LOOPNZW label* LOOPNZD label* loopnz 88/86 286 386 486 19,noj=5 8,noj=4 11+m 9,noj=6 for_next * 80386–80486 only. LSL Load Segment Limit 80286-80486 Protected Only Loads the segment limit of a selector into a specified register. The source operand must be a register or memory operand containing a selector. The destination operand must be a register that will receive the segment limit if the selector is valid and visible at the current privilege level. The zero flag is set if the segment limit is transferred, or cleared if it is not. See Intel documentation for details on selectors, segment limits, and other protectedmode concepts. Flags O D I T S Z A P C ± Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 106 of 58 Printed: 10/02/00 04:15 PM LTR Load Task Register Encoding 00001111 00000011 mod, reg, r/m 107 disp (0, 1, or 2) Syntax Examples CPU Clock Cycles LSL reg16,reg16 LSL reg32,reg32* lsl ax,bx 88/86 286 386 486 — 14 20,25† 10 LSL reg16,mem16 LSL reg32,mem32* lsl cx,seg_lim 88/86 286 386 486 — 16 21,26† 10 * 80386–80486 only. † The first value is for byte granular; the second is for page granular. LSS Load Far Pointer to Stack Segment See LDS. LTR Load Task Register 80286-80486 Protected Only Loads a value from the specified operand to the current task register. LTR is available only in privileged mode. See Intel documentation for details on task registers and other protected-mode concepts. Flags No change Encoding 00001111 00000000 mod, 011,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles LTR reg16 ltr ax 88/86 286 386 486 — 17 23 20 LTR mem16 ltr task 88/86 286 386 486 — 19 27 20 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 107 of 59 Printed: 10/02/00 04:15 PM 108 MOV Move Data MOV Move Data Moves the value in the source operand to the destination operand. If the destination operand is SS, interrupts are disabled until the next instruction is executed (except on early versions of the 8088 and 8086). Flags No change Encoding 100010dw Encoding Encoding mod, reg, r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles MOV reg,reg mov mov mov dh,bh dx,cx bp,sp 88/86 286 386 486 2 2 2 1 MOV mem,reg mov mov array[di],bx count,cx 88/86 286 386 486 9+EA (W88=13+EA) 3 2 1 MOV reg,mem mov mov bx,pointer dx,matrix[bx+di] 88/86 286 386 486 8+EA (W88=12+EA) 5 4 1 1100011w mod, 000,r/m disp (0, 1, or 2) data (1 or 2) Syntax Examples CPU Clock Cycles MOV mem,immed mov mov 88/86 286 386 486 10+EA (W88=14+EA) 3 2 1 1011w reg [bx],15 color,7 data (1 or 2) Syntax Examples CPU Clock Cycles MOV reg,immed mov mov 88/86 286 386 486 4 2 2 1 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 108 of 60 Printed: 10/02/00 04:15 PM cx,256 dx,OFFSET string MOV Move to/from Special Registers Encoding Encoding 101000aw disp (2) Syntax Examples CPU Clock Cycles MOV mem,accum mov total,ax 88/86 286 386 486 10 (W88=14) 3 2 1 MOV accum,mem mov al,string 88/86 286 386 486 10 (W88=14) 5 4 1 100011d0 109 mod,sreg, r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles MOV segreg,reg16 mov ds,ax 88/86 286 386 486 2 2,pm=17 2,pm=18 3,pm=9 MOV segreg,mem16 mov es,psp 88/86 286 386 486 8+EA (88=12+EA) 5,pm=19 5,pm=19 3,pm=9 MOV reg16,segreg mov ax,ds 88/86 286 386 486 2 2 2 3 MOV mem16,segreg mov stack_save,ss 88/86 286 386 486 9+EA (88=13+EA) 3 2 3 MOV Move to/from Special Registers 80386–80486 Only Moves a value from a special register to or from a 32-bit general-purpose register. The special registers include the control registers CR0, CR2, and CR3; the debug registers DR0, DR1, DR2, DR3, DR6, and DR7; and the test registers TR6 and TR7. On the 80486, the test registers TR3, TR4, and TR5 are also available. See Intel documentation for details on special registers. Flags O D I ? T S Z A P C ? ? ? ? ? Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 109 of 61 Printed: 10/02/00 04:15 PM 110 MOV Move to/from Special Registers Encoding Encoding Encoding 00001111 001000d0 11, reg*, r/m Syntax Examples CPU Clock Cycles MOV reg32, controlreg mov eax,cr2 88/86 286 386 486 — — 6 4 MOV controlreg,reg32 mov cr0,ebx 88/86 286 386 486 — — CR0=10,CR2=4,CR3= 5 4,CR0=16 00001111 001000d1 11, reg*, r/m Syntax Examples CPU Clock Cycles MOV reg32,debugreg mov edx,dr3 88/86 286 386 486 — — DR0–3=22,DR6–7=14 10 MOV debugreg,reg32 mov dr0,ecx 88/86 286 386 486 — — DR0–3=22,DR6–7=16 11 00001111 001001d0 11,reg*, r/m Syntax Examples CPU Clock Cycles MOV reg32,testreg mov edx,tr6 88/86 286 386 486 — — 12 4,TR3=3 MOV testreg, reg32 mov tr7,eax 88/86 286 386 486 — — 12 4,TR3=6 * The reg field contains the register number of the special register (for example, 000 for CR0, 011 for DR7, or 111 for TR7). Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 110 of 62 Printed: 10/02/00 04:15 PM MOVSX Move with Sign-Extend 111 MOVS/MOVSB/MOVSW/MOVSD Move String Data Moves a string from one area of memory to another. DS:SI must point to the source string and ES:DI to the destination address, even if operands are given. For each element moved, DI and SI are adjusted according to the size of the operands and the status of the direction flag. They are increased if the direction flag has been cleared with CLD, or decreased if the direction flag has been set with STD. If the MOVS form of the instruction is used, operands must be provided to indicate the size of the data elements to be processed. A segment override can be given for the source operand (but not for the destination). If MOVSB (bytes), MOVSW (words), or MOVSD (doublewords on the 80386–80486 only) is used, the instruction determines the size of the data elements to be processed. MOVS and its variations are normally used with the REP prefix. Flags No change Encoding 1010010w Syntax Examples CPU Clock Cycles MOVS [[ES:]]dest,[[segreg:]]src MOVSB [[[[ES:]]dest,[[segreg:]]src]] MOVSW [[[[ES:]]dest,[[segreg:]]src]] MOVSD [[[[ES:]]dest,[[segreg:]]src]] rep movs 88/86 286 386 486 18 (W88=26) 5 7 7 movsb dest,es:source MOVSX Move with Sign-Extend 80386–80486 Only Moves and sign-extends the value of the source operand to the destination register. MOVSX is used to copy a signed 8-bit or 16-bit source operand to a larger 16-bit or 32-bit destination register. Flags No change Encoding 00001111 1011111w mod, reg, r/m disp (0, 1, 2, or 4) Syntax Examples CPU Clock Cycles MOVSX reg,reg movsx movsx movsx 88/86 286 386 486 — — 3 3 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 111 of 63 Printed: 10/02/00 04:15 PM eax,bx ecx,bl bx,al 112 MOVZX Move with Zero-Extend Syntax Examples CPU Clock Cycles MOVSX reg,mem movsx movsx movsx 88/86 286 386 486 — — 6 3 cx,bsign edx,wsign eax,bsign MOVZX Move with Zero-Extend 80386–80486 Only Moves and zero-extends the value of the source operand to the destination register. MOVZX is used to copy an unsigned 8-bit or 16-bit source operand to a larger 16-bit or 32-bit destination register. Flags No change Encoding 00001111 1011011w mod, reg, r/m disp (0, 1, 2, or 4) Syntax Examples CPU Clock Cycles MOVZX reg,reg movzx movzx movzx eax,bx ecx,bl bx,al 88/86 286 386 486 — — 3 3 MOVZX reg,mem movzx movzx movzx cx,bunsign edx,wunsign eax,bunsign 88/86 286 386 486 — — 6 3 MUL Unsigned Multiply Multiplies an implied destination operand by a specified source operand. Both operands are treated as unsigned numbers. If a single 16-bit operand is given, the implied destination is AX and the product goes into the DX:AX register pair. If a single 8-bit operand is given, the implied destination is AL and the product goes into AX. On the 80386–80486, if the operand is EAX, the product goes into the EDX:EAX register pair. The carry and overflow flags are set if DX is not 0 for 16-bit operands or if AH is not 0 for 8-bit operands. Flags O D I ± T S Z A P C ? ? ? ? ± Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 112 of 64 Printed: 10/02/00 04:15 PM NEG Two’s Complement Negation Encoding 1111011w mod, 100, r/m 113 disp (0, 1, or 2) Syntax Examples CPU Clock Cycles MUL reg mul mul bx dl 88/86 286 386 486 b=70–77,w=118–133 b=13,w=21 b=9–14,w=9–22,d=9–38* b=13–18,w=13–26,d=13–42 MUL mem mul mul factor WORD PTR [bx] 88/86 286 386 486 (b=76–83,w=124–139)+EA† b=16,w=24 b=12–17,w=12–25,d=12–41* b=13–18,w=13–26,d=13–42 * The 80386–80486 processors have an early-out multiplication algorithm. Therefore, multiplying an 8-bit or 16-bit value in EAX takes the same time as multiplying the value in AL or AX. † Word memory operands on the 8088 take (128–143)+EA clocks. NEG Two’s Complement Negation Replaces the operand with its two’s complement. NEG does this by subtracting the operand from 0. If the operand is 0, the carry flag is cleared. Otherwise, the carry flag is set. If the operand contains the maximum possible negative value (– 128 for 8-bit operands or –32,768 for 16-bit operands), the value does not change, but the overflow and carry flags are set. Flags O D I ± Encoding 1111011w T S Z A P C ± ± ± ± ± mod, 011, r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles NEG reg neg ax 88/86 286 386 486 3 2 2 1 NEG mem neg balance 88/86 286 386 486 16+EA (W88=24+EA) 7 6 3 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 113 of 65 Printed: 10/02/00 04:15 PM 114 NOP No Operation NOP No Operation Performs no operation. NOP can be used for timing delays or alignment. Flags No change Encoding 10010000* Syntax Examples CPU Clock Cycles NOP nop 88/86 286 386 486 3 3 3 3 * The encoding is the same as XCHG AX,AX. NOT One’s Complement Negation Toggles each bit of the operand by clearing set bits and setting cleared bits. Flags No change Encoding 1111011w mod, 010, r/m disp (0,1,or2) Syntax Examples CPU Clock Cycles NOT reg not ax 88/86 286 386 486 3 2 2 1 NOT mem not masker 88/86 286 386 486 16+EA (W88=24+EA) 7 6 3 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 114 of 66 Printed: 10/02/00 04:15 PM OR Inclusive OR 115 OR Inclusive OR Performs a bitwise OR operation on the source and destination operands and stores the result to the destination operand. For each bit position in the operands, if either or both bits are set, the corresponding bit of the result is set. Otherwise, the corresponding bit of the result is cleared. Flags O D I 0 Encoding 000010dw Encoding Encoding T S Z A P C ± ± ? ± 0 mod, reg, r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles OR reg,reg or ax,dx 88/86 286 386 486 3 2 2 1 OR mem,reg or or bits,dx [bp+6],cx 88/86 286 386 486 16+EA (W88=24+EA) 7 7 3 OR reg,mem or or bx,masker dx,color[di] 88/86 286 386 486 9+EA (W88=13+EA) 7 6 2 100000sw mod,001, r/m disp (0, 1, or 2) data (1 or 2) Syntax Examples CPU Clock Cycles OR reg,immed or dx,110110b 88/86 286 386 486 4 3 2 1 OR mem,immed or flag_rec,8 88/86 286 386 486 (b=17,w=25)+EA 7 7 3 0000110w data (1 or 2) Syntax Examples CPU Clock Cycles OR accum,immed or 88/86 286 386 486 4 3 2 1 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 115 of 67 Printed: 10/02/00 04:15 PM ax,40h 116 OUT Output to Port OUT Output to Port Transfers a byte or word (or a doubleword on the 80386–80486) to a port from the accumulator register. The port address is specified by the destination operand, which can be DX or an 8-bit constant. In protected mode, a generalprotection fault occurs if OUT is used when the current privilege level is greater than the value of the IOPL flag. Flags No change Encoding 1110011w Encoding data (1) Syntax Examples CPU Clock Cycles OUT immed8,accum out 88/86 286 386 486 10 (88=14) 3 10,pm=4,24* 16,pm=11,31* 60h,al 1110111w Syntax Examples CPU Clock Cycles OUT DX,accum out out 88/86 286 386 486 8 (88=12) 3 11,pm=5,25* 16,pm=10,30* dx,ax dx,al * First protected-mode timing: CPL < IOPL. Second timing: CPL > IOPL. OUTS/OUTSB/OUTSW/OUTSD Output String to Port 80186–80486 Only Sends a string to a port. The string is considered the source and must be pointed to by DS:SI (even if an operand is given). The output port is specified in DX. For each element sent, SI is adjusted according to the size of the operand and the status of the direction flag. SI is increased if the direction flag has been cleared with CLD, or decreased if the direction flag has been set with STD. If the OUTS form of the instruction is used, an operand must be provided to indicate the size of data elements to be sent. A segment override can be given. If OUTSB (bytes), OUTSW (words), or OUTSD (doublewords on the 80386– 80486 only) is used, the instruction determines the size of the data elements to be sent. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 116 of 68 Printed: 10/02/00 04:15 PM POP Pop 117 OUTS and its variations are normally used with the REP prefix. Before the instruction is executed, CX should contain the number of elements to send. In protected mode, a general-protection fault occurs if OUTS is used when the current privilege level is greater than the value of the IOPL flag. Flags No change Encoding 0110111w Syntax Examples CPU Clock Cycles OUTS DX, [[segreg:]] src OUTSB [[DX, [[segreg:]] src]] OUTSW [[DX, [[segreg:]] src]] OUTSD [[DX, [[segreg:]] src]] rep outs dx,buffer outsb rep outsw 88/86 286 386 486 — 5 14,pm=8,28* 17,pm=10,32* * First protected-mode timing: CPL < IOPL. Second timing: CPL > IOPL. POP Pop Pops the top of the stack into the destination operand. The value at SS:SP is copied to the destination operand and SP is increased by 2. The destination operand can be a memory location, a general-purpose 16-bit register, or any segment register except CS. Use RET to pop CS. On the 80386–80486, 32-bit values can be popped by giving a 32-bit operand. ESP is increased by 4 for 32bit pops. Flags No change Encoding 01011 reg Encoding Syntax Examples CPU Clock Cycles POP reg16 POP reg32* pop 88/86 286 386 486 8 (88=12) 5 4 1 10001111 mod,000,r/m cx disp (2) Syntax Examples CPU Clock Cycles POP mem16 POP mem32* pop 88/86 286 386 486 17+EA (88=25+EA) 5 5 6 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 117 of 69 Printed: 10/02/00 04:15 PM param 118 POPA/POPAD Pop All Encoding Encoding 000,sreg,111 Syntax Examples CPU Clock Cycles POP segreg pop pop pop 88/86 286 386 486 8 (88=12) 5,pm=20 7,pm=21 3,pm=9 00001111 es ds ss 10,sreg,001 Syntax Examples CPU Clock Cycles POP segreg* pop pop 88/86 286 386 486 — — 7,pm=21 3,pm=9 fs gs * 80386–80486 only. POPA/POPAD Pop All 80186-80486 Only Pops the top 16 bytes on the stack into the eight generalpurpose registers. The registers are popped in the following order: DI, SI, BP, SP, BX, DX, CX, AX. The value for the SP register is actually discarded rather than copied to SP. POPA always pops into 16-bit registers. On the 80386– 80486, use POPAD to pop into 32-bit registers. Flags No change Encoding 01100001 Syntax Examples CPU Clock Cycles POPA POPAD* popa 88/86 286 386 486 — 19 24 9 * 80386–80486 only. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 118 of 70 Printed: 10/02/00 04:15 PM PUSH/PUSHW/PUSHD Push 119 POPF/POPFD Pop Flags Pops the value on the top of the stack into the flags register. POPF always pops into the 16-bit flags register. On the 80386–80486, use POPFD to pop into the 32-bit flags register. Flags O D I T S Z A P C ± ± ± ± ± ± ± ± ± Encoding 10011101 Syntax Examples CPU Clock Cycles POPF POPFD* popf 88/86 286 386 486 8 (88=12) 5 5 9,pm=6 * 80386–80486 only. PUSH/PUSHW/PUSHD Push Pushes the source operand onto the stack. SP is decreased by 2 and the source value is copied to SS:SP. The operand can be a memory location, a generalpurpose 16-bit register, or a segment register. On the 80186–80486 processors, the operand can also be a constant. On the 80386–80486, 32-bit values can be pushed by specifying a 32-bit operand. ESP is decreased by 4 for 32-bit pushes. On the 8088 and 8086, PUSH SP saves the value of SP after the push. On the 80186–80486 processors, PUSH SP saves the value of SP before the push. The PUSHW and PUSHD instructions push a word (2 bytes) and a doubleword (4 bytes), respectively. Flags No change Encoding 01010 reg Syntax Examples CPU Clock Cycles PUSH reg16 PUSH reg32* PUSHW reg16 PUSHD reg32* push 88/86 286 386 486 11 (88=15) 3 2 1 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 119 of 71 Printed: 10/02/00 04:15 PM dx 120 PUSHA/PUSHAD Push All Encoding Encoding Encoding Encoding 11111111 mod, 110,r/m disp (2) Syntax Examples CPU Clock Cycles PUSH mem16 PUSH mem32* push push 88/86 286 386 486 16+EA (88=24+EA) 5 5 4 [di] fcount 00,sreg,110 Syntax Examples CPU Clock Cycles PUSH segreg PUSHW segreg PUSHD segreg* push push push 88/86 286 386 486 10 (88=14) 3 2 3 00001111 es ss cs 10,sreg,000 Syntax Examples CPU Clock Cycles PUSH segreg PUSHW segreg PUSHD segreg* push push 88/86 286 386 486 — — 2 3 011010s0 fs gs data (1 or 2) Syntax Examples CPU Clock Cycles PUSH immed PUSHW immed PUSHD immed* push push 88/86 286 386 486 — 3 2 1 'a' 15000 * 80386–80486 only. PUSHA/PUSHAD Push All 80186–80486 Only Pushes the eight general-purpose registers onto the stack. The registers are pushed in the following order: AX, CX, DX, BX, SP, BP, SI, DI. The value pushed for SP is the value before the instruction. PUSHA always pushes 16-bit registers. On the 80386–80486, use PUSHAD to push 32-bit registers. Flags No change Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 120 of 72 Printed: 10/02/00 04:15 PM RCL/RCR/ROL/ROR Rotate Encoding 121 01100000 Syntax Examples CPU Clock Cycles PUSHA PUSHAD* pusha 88/86 286 386 486 — 17 18 11 * 80386–80486 only. PUSHF/PUSHFD Push Flags Pushes the flags register onto the stack. PUSHF always pushes the 16-bit flags register. On the 80386–80486, use PUSHFD to push the 32-bit flags register. Flags No change Encoding 10011100 Syntax Examples CPU Clock Cycles PUSHF PUSHFD* pushf 88/86 286 386 486 10(88=14) 3 4 4,pm=3 * 80386–80486 only. RCL/RCR/ROL/ROR Rotate Rotates the bits in the destination operand the number of times specified in the source operand. RCL and ROL rotate the bits left; RCR and ROR rotate right. ROL and ROR rotate the number of bits in the operand. For each rotation, the leftmost or rightmost bit is copied to the carry flag as well as rotated. RCL and RCR rotate through the carry flag. The carry flag becomes an extension of the operand so that a 9-bit rotation is done for 8-bit operands, or a 17-bit rotation for 16-bit operands. On the 8088 and 8086, the source operand can be either CL or 1. On the 80186–80486, the source operand can be CL or an 8-bit constant. On the 80186–80486, rotate counts larger than 31 are masked off, but on the 8088 and 8086, larger rotate counts are performed despite the inefficiency involved. The Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 121 of 73 Printed: 10/02/00 04:15 PM 122 RCL/RCR/ROL/ROR Rotate overflow flag is modified only by single-bit variations of the instruction; for multiple-bit variations, the overflow flag is undefined. Flags O D I ± Encoding 1101000w Encoding T S Z A P C ± mod, TTT*,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles ROL reg,1 ROR reg,1 ror rol ax,1 dl,1 88/86 286 386 486 2 2 3 3 RCL reg,1 RCR reg,1 rcl rcr dx,1 bl,1 88/86 286 386 486 2 2 9 3 ROL mem,1 ROR mem,1 ror rol bits,1 WORD PTR [bx],1 88/86 286 386 486 15+EA (W88=23+EA) 7 7 4 RCL mem,1 RCR mem,1 rcl rcr WORD PTR [si],1 WORD PTR m32[0],1 88/86 286 386 486 15+EA (W88=23+EA 7 10 4 1101001w mod, TTT*,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles ROL reg,CL ROR reg,CL ror rol ax,cl dx,cl 88/86 286 386 486 8+4n 5+n 3 3 RCL reg,CL RCR reg,CL rcl rcr dx,cl bl,cl 88/86 286 386 486 8+4n 5+n 9 8–30 ROL mem,CL ROR mem,CL ror color,cl 88/86 rol WORD PTR [bp+6],cl 286 386 486 20+EA+4n (W88=28+EA+4n) 8+n 7 4 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 122 of 74 Printed: 10/02/00 04:15 PM REP Repeat String Encoding Syntax Examples CPU Clock Cycles RCL mem,CL RCR mem,CL rcr WORD PTR [bx+di],cl 88/86 rcl masker 286 386 486 20+EA+4n (W88=28+EA+4n) 8+n 10 9–31 1100000w mod,TTT*,r/m disp (0, 1, or 2) 123 data (1) Syntax Examples CPU Clock Cycles ROL reg,immed8 ROR reg,immed8 rol ror ax,13 bl,3 286 88/86 286 386 486 — 5+n 3 2 RCL reg,immed8 RCR reg,immed8 rcl rcr bx,5 si,9 88/86 286 386 486 — 5+n 9 8–30 ROL mem,immed8 ROR mem,immed8 rol ror BYTE PTR [bx],10 bits,6 88/86 286 386 486 — 8+n 7 4 RCL mem,immed8 RCR mem,immed8 rcl rcr WORD PTR [bp+8], masker,3 88/86 286 386 486 — 8+n 10 9–31 * TTT represents one of the following bit codes: 000 for ROL, 001 for ROR, 010 for RCL, or 011 for RCR. REP Repeat String Repeats a string instruction the number of times indicated by CX. First, CX is compared to 0; if it equals 0, execution proceeds to the next instruction. Otherwise, CX is decremented, the string instruction is performed, and the loop continues. REP is used with MOVS and STOS. REP also can be used with INS and OUTS on the 80186–80486 processors. On all processors except the 80386–80486, combining a repeat prefix with a segment override can cause errors if an interrupt occurs. Flags No change Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 123 of 75 Printed: 10/02/00 04:15 PM 124 REP Repeat String Encoding Encoding Encoding Encoding Encoding 11110011 1010010w Syntax Examples CPU Clock Cycles REP MOVS dest,src REP MOVSB [[dest,src]] REP MOVSW [[dest,src]] REP MOVSD [[dest,src]]* rep rep 88/86 286 386 486 9+17n (W88=9+25n) 5+4n 7+4n 12+3n# 11110011 movs source,dest movsw 1010101w Syntax Examples CPU Clock Cycles REP STOS dest REP STOSB [[dest]] REP STOSW [[dest]] REP STOSD [[dest]]* rep rep 88/86 286 386 486 9+10n (W88=9+14n) 4+3n 5+5n 7+4n† 11110011 stosb stos dest 1010101w Syntax Examples CPU Clock Cycles REP LODS dest REP LODSB [[dest]] REP LODSW [[dest]] REP LODSD [[dest]]* rep rep 88/86 286 386 486 — — — 7+4n† 11110011 lodsb lods dest 0110110w Syntax Examples CPU Clock Cycles REP INS dest,DX REP INSB [[dest,DX]] REP INSW [[dest,DX]] REP INSD [[dest,DX]]* rep rep 88/86 286 386 486 — 5+4n 13+6n,pm=(7,27)+6n§ 16+8n,pm=(10,30)+8n § 11110011 insb ins dest,dx 0110111w Syntax Examples CPU Clock Cycles REP OUTS DX,src REP OUTSB [[src]] REP OUTSW [[src]] REP OUTSD [[src]]* rep rep 88/86 286 386 486 — 5+4n 12+5n,pm=(6,26)+5n§ 17+5n,pm=(11,31)+5n§ outs dx,source outsw * 80386–80486 only. # 5 if n = 0, 13 if n = 1. † 5 if n = 0. § First protected-mode timing: CPL ≤ IOPL. Second timing: CPL > IOPL. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 124 of 76 Printed: 10/02/00 04:15 PM REPcondition Repeat String Conditionally 125 REPcondition Repeat String Conditionally Repeats a string instruction as long as condition is true and the maximum count has not been reached. REPE and REPZ (they are synonyms) repeat while the zero flag is set. REPNE and REPNZ (they are synonyms) repeat while the zero flag is cleared. The conditional-repeat prefixes should only be used with SCAS and CMPS, since these are the only string instructions that modify the zero flag. Before executing the instruction, CX should be set to the maximum allowable number of repetitions. First, CX is compared to 0; if it equals 0, execution proceeds to the next instruction. Otherwise, CX is decremented, the string instruction is performed, and the loop continues. On all processors except the 80386–80486, combining a repeat prefix with a segment override may cause errors if an interrupt occurs during a string operation. Flags O D I Encoding 11110011 Encoding Encoding T S Z A P C ± 1010011w Syntax Examples CPU Clock Cycles REPE CMPS src,dest REPE CMPSB [[src,dest]] REPE CMPSW [[src,dest]] REPE CMPSD [[src,dest]]* repz cmpsb repe cmps src,dest 88/86 286 386 486 9+22n (W88=9+30n) 5+9n 5+9n 7+7n# Syntax Examples CPU Clock Cycles REPE SCAS dest REPE SCASB [[dest]] REPE SCASW [[dest]] REPE SCASD [[dest]]* repe repz 88/86 286 386 486 9+15n (W88=9+19n) 5+8n 5+8n 7+5n# 11110011 11110010 1010111w scas dest scasw 1010011w Syntax Examples CPU Clock Cycles REPNE CMPS src,dest REPNE CMPSB [[src,dest]] REPNE CMPSW [[src,dest]] REPNE CMPSD [[src,dest]]* repne cmpsw repnz cmps src,dest 88/86 286 386 486 9+22n (W88=9+30n) 5+9n 5+9n 7+7n# Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 125 of 77 Printed: 10/02/00 04:15 PM 126 RET/RETN/RETF Return from Procedure Encoding 11110010 1010111w Syntax Examples CPU Clock Cycles REPNE SCAS des REPNE SCASB [[dest]] REPNE SCASW [[dest]] REPNE SCASD [[dest]]* repne scas dest repnz scasb 88/86 286 386 486 9+15n (W88=9+19n) 5+8n 5+8n 7+5n* * 80386–80486 only. # 5 if n=0. RET/RETN/RETF Return from Procedure Returns from a procedure by transferring control to an address popped from the top of the stack. A constant operand can be given indicating the number of additional bytes to release. The constant is normally used to adjust the stack for arguments pushed before the procedure was called. The size of a return (near or far) is the size of the procedure in which the RET is defined with the PROC directive. RETN can be used to specify a near return; RETF can specify a far return. A near return pops a word into IP. A far return pops a word into IP and then pops a word into CS. After the return, the number of bytes given in the operand (if any) is added to SP. Flags No change Encoding 11000011 Encoding Syntax Examples CPU Clock Cycles RET RETN ret retn 88/86 286 386 486 16 (88=20) 11+m 10+m 5 Syntax Examples CPU Clock Cycles RET immed16 RETN immed16 ret retn 88/86 286 386 486 20 (88=24) 11+m 10+m 5 11000010 data (2) Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 126 of 78 Printed: 10/02/00 04:15 PM 2 8 SAHF Store AH into Flags Encoding Encoding 127 11001011 Syntax Examples CPU Clock Cycles RET RETF ret retf 88/86 286 386 486 26 (88=34) 15+m,pm=25+m,55* 18+m,pm=32+m,62* 13,pm=18,33* Syntax Examples CPU Clock Cycles RET immed16 RETF immed16 ret retf 88/86 286 386 486 25 (88=33) 15+m,pm=25+m,55* 18+m,pm=32+m,68* 14,pm=17,33* 11001010 data (2) 8 32 * The first protected-mode timing is for a return to the same privilege level; the second is for a return to a lesser privilege level. ROL/ROR Rotate See RCL/RCR. SAHF Store AH into Flags Transfers AH into bits 0 to 7 of the flags register. This includes the carry, parity, auxiliary carry, zero, and sign flags, but not the trap, interrupt, direction, or overflow flags. Flags O D I Encoding 10011110 T S Z A P C ± ± ± ± ± Syntax Examples CPU Clock Cycles SAHF sahf 88/86 286 386 486 4 2 3 2 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 127 of 79 Printed: 10/02/00 04:15 PM 128 SAL/SAR Shift SAL/SAR Shift See SHL/SHR/SAL/SAR. SBB Subtract with Borrow Adds the carry flag to the second operand, then subtracts that value from the first operand. The result is assigned to the first operand. SBB is used to subtract the least significant portions of numbers that must be processed in multiple registers. Flags O D I ± Encoding 000110dw Encoding T S Z A P C ± ± ± ± ± mod, reg, r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles SBB reg,reg sbb dx,cx 88/86 286 386 486 3 2 2 1 SBB mem,reg sbb WORD PTR m32[2],dx 88/86 286 386 486 16+EA (W88=24+EA) 7 6 3 SBB reg,mem sbb dx,WORD PTR m32[2] 88/86 286 386 486 9+EA (W88=13+EA) 7 7 2 100000sw mod,011, r/m disp (0, 1, or 2) data (1 or 2) Syntax Examples CPU Clock Cycles SBB reg,immed sbb dx,45 88/86 286 386 486 4 3 2 1 SBB mem,immed sbb WORD PTR m32[2],40 88/86 286 386 486 17+EA (W88=25+EA) 7 7 3 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 128 of 80 Printed: 10/02/00 04:15 PM SCAS/SCASB/SCASW/SCASD Scan String Flags Encoding 0001110w 129 data (1 or 2) Syntax Examples CPU Clock Cycles SBB accum,immed sbb 4 86 386 486 3 2 1 ax,320 88/86 SCAS/SCASB/SCASW/SCASD Scan String Flags Scans a string to find a value specified in the accumulator register. The string to be scanned is considered the destination. ES:DI must point to that string, even if an operand is specified. For each element, the destination element is subtracted from the accumulator value and the flags are updated to reflect the result (although the result is not stored). DI is adjusted according to the size of the operands and the status of the direction flag. DI is increased if the direction flag has been cleared with CLD, or decreased if the direction flag has been set with STD. If the SCAS form of the instruction is used, an operand must be provided to indicate the size of the data elements to be processed. No segment override is allowed. If SCASB (bytes), SCASW (words), or SCASD (doublewords on the 80386–80486 only) is used, the instruction determines the size of the data elements to be processed and whether the element scanned for is in AL, AX, or EAX. SCAS and its variations are normally used with repeat prefixes. REPNE (or REPNZ) is used to find the first element in a string that matches the value in the accumulator register. REPE (or REPZ) is used to find the first mismatch. Before the scan, CX should contain the maximum number of elements to scan. After a REPNE SCAS, the zero flag is clear if the string does not contain the accumulator value. After a REPE SCAS, the zero flag is set if the string contains nothing but the accumulator value. When the instruction finishes, ES:DI points to the element that follows (if the direction flag is clear) or precedes (if the direction flag is set) the match or mismatch. If CX decrements to 0, ES:DI points to the element that follows or precedes the last comparison. The zero flag is set or clear according to the result of the last comparison, not according to the value of CX. Flags O D I ± T S Z A P C ± ± ± ± ± Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 129 of 81 Printed: 10/02/00 04:15 PM 130 SETcondition Encoding Set Conditionally 1010111w Syntax Examples CPU Clock Cycles SCAS [[ES:]] dest SCASB [[[[ES:]] dest]] SCASW [[[[ES:]] dest]] SCASD [[[[ES:]] dest]]* repne repe scas 88/86 286 386 486 15 (W88=19) 7 7 6 scasw scasb es:destin * 80386–80486 only SETcondition Set Conditionally 80386–80486 Only Sets the byte specified in the operand to 1 if condition is true or to 0 if condition is false. The condition is tested by checking the flags shown in the table on the following page. The instruction is used to set Boolean flags conditionally. Flags No change Encoding 00001111 Set Conditions 1001cond mod,000,r/m Syntax Examples CPU Clock Cycles SETcondition reg8 setc setz setae dh al bl 88/86 286 386 486 — — 4 true=4, false=3 SETcondition mem8 seto setle sete BTYE PTR [ebx] flag Booleans[di] 88/86 286 386 486 — — 5 true=3, false=4 Opcode Mnemonic Flags Checked Description 10010010 SETB/SETNAE CF=1 Set if below/not above or equal (unsigned comparisons) 10010011 SETAE/SETNB CF=0 Set if above or equal/not below (unsigned comparisons) 10010110 SETBE/SETNA CF=1 or ZF=1 Set if below or equal/not above (unsigned comparisons) 10010111 SETA/SETNBE CF=0 and ZF=0 Set if above/not below or equal (unsigned comparisons) 10010100 SETE/SETZ ZF=1 Set if equal/zero 10010101 SETNE/SETNZ ZF=0 Set if not equal/not zero Opcode Mnemonic Flags Checked Description Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 130 of 82 Printed: 10/02/00 04:15 PM SGDT/SIDT/SLDT Store Descriptor Table 131 10011100 SETL/SETNGE SF_OF Set if less/not greater or equal (signed comparisons) 10011101 SETGE/SETNL SF=OF Set if greater or equal/not less (signed comparisons) 10011110 SETLE/SETNG ZF=1 or SF_OF Set if less or equal/not greater or equal (signed comparisons) 10011111 SETG/SETNLE ZF=0 and SF=OF Set if greater/not less or equal (signed comparisons) 10011000 SETS SF=1 Set if sign 10011001 SETNS SF=0 Set if not sign 10010010 SETC F=1 Set if carry 10010011 SETNC CF=0 Set if not carry 10010000 SETO OF=1 Set if overflow 10010001 SETNO OF=0 Set if not overflow 10011010 SETP/SETPE PF=1 Set if parity/parity even 10011011 SETNP/SETPO PF=0 Set if no parity/parity odd SGDT/SIDT/SLDT Store Descriptor Table 80286-80486 Only Stores a descriptor table register into a specified operand. SGDT stores the Global Descriptor Table; SIDT, the Interrupt Vector Table; and SLDT, the Local Descriptor Table. These instructions are generally useful only in privileged mode. See Intel documentation for details on descriptor tables and other protected-mode concepts. Flags No change Encoding 00001111 00000001 mod,000,r/m disp (2) Syntax Examples CPU Clock Cycles SGDT mem48 sgdt 88/86 286 386 486 — 11 9 10 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 131 of 83 Printed: 10/02/00 04:15 PM descriptor 132 SHL/SHR/SAL/SAR Shift Encoding Encoding 00001111 00000001 mod,001,r/m disp (2) Syntax Examples CPU Clock Cycles SIDT mem48 sidt 88/86 286 386 486 — 12 9 10 00001111 00000000 descriptor mod, 000,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles SLDT reg16 sldt ax 88/86 286 386 486 — 2 2 2 SLDT mem16 sldt selector 88/86 286 386 486 — 3 2 3 SHL/SHR/SAL/SAR Shift Shifts the bits in the destination operand the number of times specified by the source operand. SAL and SHL shift the bits left; SAR and SHR shift right. With SHL, SAL, and SHR, the bit shifted off the end of the operand is copied into the carry flag, and the leftmost or rightmost bit opened by the shift is set to 0. With SAR, the bit shifted off the end of the operand is copied into the carry flag, and the leftmost bit opened by the shift retains its previous value (thus preserving the sign of the operand). SAL and SHL are synonyms. On the 8088 and 8086, the source operand can be either CL or 1. On the 80186–80486 processors, the source operand can be CL or an 8-bit constant. On the 80186–80486 processors, shift counts larger than 31 are masked off, but on the 8088 and 8086, larger shift counts are performed despite the inefficiency. Only single-bit variations of the instruction modify the overflow flag; for multiple-bit variations, the overflow flag is undefined. Flags O D I ± T S Z A P C ± ± ? ± ± Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 132 of 84 Printed: 10/02/00 04:15 PM SHL/SHR/SAL/SAR Shift Encoding 1101000w mod,TTT*,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles SAR reg,1 sar sar di,1 cl,1 88/86 286 386 486 2 2 3 3 SAL SHL SHR SAR shr shl sal sar dh,1 si,1 bx,1 count,1 88/86 286 386 486 2 2 3 3 88/86 286 386 486 15+EA (W88=23+EA) 7 7 4 88/86 286 386 486 15+EA (W88=23+EA) 7 7 4 reg,1 reg,1 reg,1 mem,1 sal shl shr SAL mem,1 SHL mem,1 SHR mem,1 Encoding 133 1101001w WORD PTR m32[0],1 index,1 unsign[di],1 mod,TTT*,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles SAR reg,CL sar sar bx,cl dx,cl 88/86 286 386 486 8+4n 5+n 3 3 SAL reg,CL SHL reg,CL SHR reg,CL shr shl sal dx,cl di,cl ah,cl 88/86 286 386 486 8+4n 5+n 3 3 SAR mem,CL sar sign,cl 88/86 sar WORD PTR [bp+8],cl 286 386 486 20+EA+4n (W88=28+EA+4n) 8+n 7 4 shr sal shl WORD PTR m32[2],cl BYTE PTR [di],cl index,cl 88/86 SAL mem,CL SHL mem,CL SHR mem,CL Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 133 of 85 Printed: 10/02/00 04:15 PM 286 386 486 20+EA+4n (W88=28+EA+4n) 8+n 7 4 134 SHLD/SHRD Double Precision Shift Encoding 1100000w mod,TTT*,r/m disp (0, 1, or 2) data (1) Syntax Examples CPU Clock Cycles SAR reg,immed8 sar sar bx,5 cl,5 88/86 286 386 486 — 5+n 3 2 SAL reg,immed8 SHL reg,immed8 SHR reg,immed8 sal shl shr cx,6 di,2 bx,8 88/86 286 386 486 — 5+n 3 2 SAR mem,immed8 sar sar sign_count,3 WORD PTR [bx],5 88/86 286 386 486 — 8+n 7 4 SAL reg,immed8 SHL reg,immed8 SHR reg,immed8 shr shl sal mem16,11 unsign,4 array[bx+di],14 88/86 286 386 486 — 8+n 7 4 * TTT represents one of the following bit codes: 100 for SHL or SAL, 101 for SHR, or 111 for SAR. SHLD/SHRD Double Precision Shift 80386–80486 Only Shifts the bits of the second operand into the first operand. The number of bits shifted is specified by the third operand. SHLD shifts the first operand to the left by the number of positions specified in the count. The positions opened by the shift are filled by the most significant bits of the second operand. SHRD shifts the first operand to the right by the number of positions specified in the count. The positions opened by the shift are filled by the least significant bits of the second operand. The count operand can be either CL or an 8-bit constant. If a shift count larger than 31 is given, it is adjusted by using the remainder (modulo) of a division by 32. Flags O D I ? T S Z A P C ± ± ? ± ± Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 134 of 86 Printed: 10/02/00 04:15 PM SHLD/SHRD Double Precision Shift Encoding Encoding Encoding 00001111 10100100 mod,reg,r/m disp (0, 1, or 2) data (1) Syntax Examples CPU Clock Cycles SHLD reg16,reg16,immed8 SHLD reg32,reg32,immed8 shld ax,dx,10 88/86 286 386 486 — — 3 2 SHLD mem16,reg16,immed8 SHLD mem32,reg32,immed8 shld bits,cx,5 88/86 286 386 486 — — 7 3 00001111 10101100 mod,reg,r/m disp (0, 1, or 2) data (1) Syntax Examples CPU Clock Cycles SHRD reg16,reg16,immed8 SHRD reg32,reg32,immed8 shrd cx,si,3 88/86 286 386 486 — — 3 2 SHRD mem16,reg16,immed8 SHRD mem32,reg32,immed8 shrd [di],dx,13 88/86 286 386 486 — — 7 3 00001111 10100101 mod,reg,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles SHLD reg16,reg16,CL SHLD reg32,reg32,CL shld 88/86 286 386 486 — — 3 3 SHLD mem16,reg16,CL SHLD mem32,reg32,CL shld masker,ax,cl 88/86 286 386 486 — — 7 4 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 135 of 87 Printed: 10/02/00 04:15 PM ax,dx,cl 135 136 SMSW Store Machine Status Word Encoding 00001111 10101101 mod,reg,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles SHRD reg16,reg16,CL SHRD reg32,reg32,CL shrd bx,dx,cl 88/86 286 386 486 — — 3 3 SHRD mem16,reg16,CL SHRD mem32,reg32,CL shrd [bx],dx,cl 88/86 286 386 486 — — 7 4 SMSW Store Machine Status Word 80286-80486 Only Stores the Machine Status Word (MSW) into a specified memory operand. SMSW is generally useful only in protected mode. See Intel documentation for details on the MSW and other protected-mode concepts. Flags No change Encoding 00001111 00000001 mod,100,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles SMSW reg16 smsw ax 88/86 286 386 486 — 2 2 2 SMSW mem16 smsw machine 88/86 286 386 486 — 3 3 3 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 136 of 88 Printed: 10/02/00 04:15 PM STI Set Interrupt Flag 137 STC Set Carry Flag Sets the carry flag. Flags O D I Encoding 11111001 T S Z A P C 1 Syntax Examples CPU Clock Cycles STC stc 88/86 286 386 486 2 2 2 2 STD Set Direction Flag Sets the direction flag. All subsequent string instructions will process down (from high addresses to low addresses). Flags O D I 1 Encoding 11111101 T S Z A P C Syntax Examples CPU Clock Cycles STD std 88/86 286 386 486 2 2 2 2 STI Set Interrupt Flag Sets the interrupt flag. When the interrupt flag is set, maskable interrupts are recognized. If interrupts were disabled by a previous CLI instruction, pending interrupts will not be executed immediately; they will be executed after the instruction following STI. Flags O D I T S Z A P C 1 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 137 of 89 Printed: 10/02/00 04:15 PM 138 STOS/STOSB/STOSW/STOSD Store String Data Encoding 11111011 Syntax Examples CPU Clock Cycles STI sti 88/86 286 386 486 2 2 3 5 STOS/STOSB/STOSW/STOSD Store String Data Stores the value of the accumulator in a string. The string is the destination and must be pointed to by ES:DI, even if an operand is given. For each source element loaded, DI is adjusted according to the size of the operand and the status of the direction flag. DI is incremented if the direction flag has been cleared with CLD or decremented if the direction flag has been set with STD. If the STOS form of the instruction is used, an operand must be provided to indicate the size of the data elements to be processed. No segment override is allowed. If STOSB (bytes), STOSW (words), or STOSD (doublewords on the 80386–80486 only) is used, the instruction determines the size of the data elements to be processed and whether the element comes from AL, AX, or EAX. STOS and its variations are often used with the REP prefix to fill a string with a repeated value. Before the repeated instruction is executed, CX should contain the number of elements to store. Flags No change Encoding 1010101w Syntax Examples CPU Clock Cycles STOS [[ES:]] dest STOSB [[[[ES:]] dest]] STOSW [[[[ES:]] dest]] STOSD [[[[ES:]] dest]]* stos es:dstring rep stosw rep stosb 88/86 286 386 486 11 (W88=15) 3 4 5 * 80386–80486 only Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 138 of 90 Printed: 10/02/00 04:15 PM SUB Subtract 139 STR Store Task Register 80286-80486 Only Stores the current task register to the specified operand. This instruction is generally useful only in privileged mode. See Intel documentation for details on task registers and other protected-mode concepts. Flags No change Encoding 00001111 00000000 mod, 001, reg disp (0, 1, or 2) Syntax Examples CPU Clock Cycles STR reg16 str cx 88/86 286 386 486 — 2 2 2 STR mem16 str taskreg 88/86 286 386 486 — 3 2 3 SUB Subtract Subtracts the source operand from the destination operand and stores the result in the destination operand. Flags O D I ± Encoding 001010dw T S Z A P C ± ± ± ± ± mod, reg, r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles SUB reg,reg sub sub ax,bx bh,dh 88/86 286 386 486 3 2 2 1 SUB mem,reg sub sub tally,bx array[di],bl 88/86 286 386 486 16+EA (W88=24+EA) 7 6 3 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 139 of 91 Printed: 10/02/00 04:15 PM 140 TEST Encoding Encoding Logical Compare Syntax Examples CPU Clock Cycles SUB reg,mem sub sub 88/86 286 386 486 9+EA (W88=13+EA) 7 7 2 100000sw cx,discard al,[bx] mod,101,r/m disp (0, 1, or 2) data (1 or 2) Syntax Examples CPU Clock Cycles SUB reg,immed sub sub dx,45 bl,7 88/86 286 386 486 4 3 2 1 SUB mem,immed sub sub total,4000 BYTE PTR [bx+di],2 88/86 286 386 486 17+EA (W88=25+EA) 7 7 3 0010110w data (1 or 2) Syntax Examples CPU Clock Cycles SUB accum,immed sub 88/86 286 386 486 4 3 2 1 ax,32000 TEST Logical Compare Tests specified bits of an operand and sets the flags for a subsequent conditional jump or set instruction. One of the operands contains the value to be tested. The other contains a bit mask indicating the bits to be tested. TEST works by doing a bitwise AND operation on the source and destination operands. The flags are modified according to the result, but the destination operand is not changed. This instruction is the same as the AND instruction, except the result is not stored. Flags O D I 0 T S Z A P C ± ± ? ± 0 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 140 of 92 Printed: 10/02/00 04:15 PM VERR/VERW Verify Read or Write Encoding Encoding Encoding 1000010w mod, reg, r/m 141 disp (0, 1, or 2) Syntax Examples CPU Clock Cycles TEST reg,reg test test dx,bx bl,ch 88/86 286 386 486 3 2 2 1 TEST mem,reg TEST reg,mem* test test dx,flags bl,bitarray[bx] 88/86 286 386 486 9+EA (W88=13+EA) 6 5 2 mod,000,r/m disp (0, 1, or 2) 1111011w data (1 or 2) Syntax Examples CPU Clock Cycles TEST reg,immed test test cx,30h cl,1011b 88/86 286 386 486 5 3 2 1 TEST mem,immed test test masker,1 BYTE PTR [bx],03h 88/86 286 386 486 11+EA 6 5 2 1010100w data (1 or 2) Syntax Examples CPU Clock Cycles TEST accum,immed test 88/86 286 386 486 4 3 2 1 ax,90h * MASM transposes TEST reg,mem; that is, it is encoded as TEST mem,reg. VERR/VERW Verify Read or Write 80286-80486 Protected Only Verifies that a specified segment selector is valid and can be read or written to at the current privilege level. VERR verifies that the selector is readable. VERW verifies that the selector can be written to. If the segment is verified, the zero flag is set. Otherwise, the zero flag is cleared. Flags O D I T S Z A P C ± Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 141 of 93 Printed: 10/02/00 04:15 PM 142 WAIT Wait Encoding Encoding 00001111 00000000 mod, 100,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles VERR reg16 verr ax 88/86 286 386 486 — 14 10 11 VERR mem16 verr selector 88/86 286 386 486 — 16 11 11 00001111 00000000 mod, 101,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles VERW reg16 verw cx 88/86 286 386 486 — 14 15 11 VERW mem16 verw selector 88/86 286 386 486 — 16 16 11 WAIT Wait Suspends processor execution until the processor receives a signal that a coprocessor has finished a simultaneous operation. It should be used to prevent a coprocessor instruction from modifying a memory location that is being modified simultaneously by a processor instruction. WAIT is the same as the coprocessor FWAIT instruction. Flags No change Encoding 10011011 Syntax Examples CPU Clock Cycles WAIT wait 88/86 286 386 486 4 3 6 1–3 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 142 of 94 Printed: 10/02/00 04:15 PM XADD Exchange and Add 143 WBINVD Write Back and Invalidate Data Cache 80486 Only Empties the contents of the current data cache after writing changes to memory. Proper use of this instruction requires knowledge of how contents are placed in the cache. WBINVD is intended primarily for system programming. See Intel documentation for details. Flags Encoding No change 00001111 00001001 Syntax Examples CPU Clock Cycles WBINVD wbinvd 88/86 286 386 486 — — — 5 XADD Exchange and Add 80486 Only Adds the source and destination operands and stores the sum in the destination; simultaneously, the original value of the destination is moved to the source. The instruction sets flags according to the result of the addition. Flags O D I ± Encoding 00001111 T S Z A P C ± ± ± ± ± 1100000b mod, reg, r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles XADD mem,reg xadd xadd warr[bx],ax string,bl 88/86 286 386 486 — — — 4 XADD reg,reg xadd xadd dl,al bx,dx 88/86 286 386 486 — — — 3 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 143 of 95 Printed: 10/02/00 04:15 PM 144 XCHG Exchange XCHG Exchange Exchanges the values of the source and destination operands. Flags No change Encoding 1000011w Encoding mod,reg,r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles XCHG reg,reg xchg xchg xchg cx,dx bl,dh al,ah 88/86 286 386 486 4 3 3 3 XCHG reg,mem XCHG mem,reg xchg xchg [bx],ax bx,pointer 88/86 286 386 486 17+EA (W88=25+EA) 5 5 5 10010 reg Syntax Examples CPU Clock Cycles XCHG accum,reg16* XCHG reg16,accum* xchg xchg 88/86 286 386 486 3 3 3 3 ax,cx cx,ax * On the 80386–80486, the accumulator may also be exchanged with a 32-bit register. XLAT/XLATB Translate Translates a value from one coding system to another by looking up the value to be translated in a table stored in memory. Before the instruction is executed, BX should point to a table in memory and AL should contain the unsigned position of the value to be translated from the table. After the instruction, AL contains the table value at the specified position. No operand is required, but one can be given to specify a segment override. DS is assumed unless a segment override is given. XLATB is a synonym for XLAT. Either version allows an operand, but neither requires one. Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 144 of 96 Printed: 10/02/00 04:15 PM XOR Exclusive OR Flags No change Encoding 11010111 Syntax Examples CPU Clock Cycles XLAT [[[[segreg:]] mem]] XLATB [[[[segreg:]] mem]] xlat xlatb 88/86 286 386 486 11 5 5 4 es:table 145 XOR Exclusive OR Performs a bitwise exclusive OR operation on the source and destination operands and stores the result in the destination. For each bit position in the operands, if both bits are set or if both bits are cleared, the corresponding bit of the result is cleared. Otherwise, the corresponding bit of the result is set. Flags O D I 0 Encoding 001100dw T S Z A P C ± ± ? ± 0 mod, reg, r/m disp (0, 1, or 2) Syntax Examples CPU Clock Cycles XOR reg,reg xor xor cx,bx ah,al 88/86 286 386 486 3 2 2 1 XOR mem,reg xor xor [bp+10],cx masked,bx 88/86 286 386 486 16+EA (W88=24+EA) 7 6 3 XOR reg,mem xor xor cx,flags bl,bitarray[di] 88/86 286 386 486 9+EA (W88=13+EA) 7 7 2 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 145 of 97 Printed: 10/02/00 04:15 PM 146 XOR Exclusive OR Encoding Encoding 100000sw mod,110,r/m disp (0, 1, or 2) data (1 or 2) Syntax Examples CPU Clock Cycles XOR reg,immed xor xor bx,10h bl,1 88/86 286 386 486 4 3 2 1 XOR mem,immed xor xor Boolean,1 switches[bx],101b 88/86 286 386 486 17+EA (W88=25+EA) 7 7 3 0011010w data (1 or 2) Syntax Examples CPU Clock Cycles XOR accum,immed xor 88/86 286 386 486 4 3 2 1 Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 146 of 98 Printed: 10/02/00 04:15 PM ax,01010101b XOR Exclusive OR Filename: LMARFC04.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 67 Page: 147 of 99 Printed: 10/02/00 04:15 PM 147 145 C H A P T E R 5 Coprocessor Topical Cross-reference for Coprocessor Instructions . Interpreting Coprocessor Instructions. . . . . . . . . . . . . Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Clock Speeds . . . . . . . . . . . . . . . . . . . . . . . . . . . Instruction Size . . . . . . . . . . . . . . . . . . . . . . . . . . Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 145 of 1 Printed: 10/02/00 04:16 PM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 148 148 148 148 148 149 146 Reference Topical Cross-reference for Coprocessor Instructions Arithmetic FABS FADD/FIADD FADDP FCHS FDIV/FIDIV FDIVP FDIVR/FIDIVR FDIVRP FMUL/FIMUL FMULP FPREM FPREM1§ FRNDINT FSCALE FSQRT FSUB/FISUB FSUBP FSUBR/FISUBR FSUBRP FXTRACT Compare FCOM/FICOM FSTSW/FNSTSW FUCOMP § FCOMP/FICOMP FTST FUCOMPP§ FCOMPP FUCOM§ FXAM FLDCW FXCH FLDENV FLDL2E FLDLN2 FLDL2T FLDPI FDECSTP FFREE FLDCW FSAVE/FNSAVE FSTENV/FNSTENV FDISI/FNDISI* FINCSTP FNOP FSETPM_ FSTSW/FNSTSW FST/FIST FSTP/FISTP/FBSTP FSTCW/FNSTCW FSTSW/FNSTSW Load FLD/FILD/FBLD FRSTOR Load Constant FLD1 FLDLG2 FLDZ Processor Control FCLEX/FNCLEX FENI/FNENI* FINIT/FNINIT FRSTOR FSTCW/FNSTCW FWAIT Store Data FSAVE/FNSAVE FSTENV/FNSTENV Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 146 of 2 Printed: 10/02/00 04:16 PM Coprocessor Transcendental F2XM1 FCOS§ FPREM FPREM1 FSIN FSINCOS § FPATAN FPTAN § § FYL2P1 FYL2X * 8087 only † 80287 only. Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 147 of 3 Printed: 10/02/00 04:16 PM § 80387–80486 only. 147 148 Reference Interpreting Coprocessor Instructions This section provides an alphabetical reference to instructions of the 8087, 80287, and 80387 coprocessors. The format is the same as the processor instructions except that encodings are not provided. Differences are noted in the following. The 80486 has the coprocessor built in. This one chip executes all the instructions listed in the previous section and this section. Syntax Syntaxes in Column 1 use the following abbreviations for operand types: Syntax Operand reg A coprocessor stack register memreal A direct or indirect memory operand storing a real number memint A direct or indirect memory operand storing a binary integer membcd A direct or indirect memory operand storing a BCD number Examples The position of the examples in Column 2 is not related to the clock speeds in Column 3. Clock Speeds Column 3 shows the clock speeds for each processor. Sometimes an instruction may have more than one possible clock speed. The following abbreviations are used to specify variations: Abbreviation Description EA Effective address. This applies only to the 8087. See the Processor Section, “Timings on the 8088 and 8086 Processors,” for an explanation of effective address timings. s,l,t Short real, long real, and 10-byte temporary real. w,d,q Word, doubleword, and quadword binary integer. to, fr To or from stack top. On the 80387 and 80486, the to clocks represent timings when ST is the destination. The fr clocks represent timings when ST is the source. Instruction Size The instruction size is always 2 bytes for instructions that do not access memory. For instructions that do access memory, the size is 4 bytes on the 8087 and 80287. On the 80387 and 80486, the size for instructions that access memory is 4 bytes in 16-bit mode, or 6 bytes in 32-bit mode. Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 148 of 4 Printed: 10/02/00 04:16 PM Coprocessor 149 On the 8087, each instruction must be preceded by the WAIT (also called FWAIT) instruction, thereby increasing the instruction’s size by 1 byte. The assembler inserts WAIT automatically by default, or with the .8087 directive. Architecture The 8087, 80287, and 80387 coprocessors, along with the 80486, have several common elements of architecture. All have a register stack made up of eight 80bit data registers. These can contain floating-point numbers in the temporary real format. The coprocessors also have 14 bytes of control registers. Figure 5.1 shows the format of registers. Fig. 5.1 Coprocessor Registers Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 149 of 5 Printed: 10/02/00 04:16 PM 150 F2XM1 2X–1 The most important control registers are the control word and the status word. Figure 5.2 shows the format of these registers. Fig. 5.2 Control Word and Status Word F2XM1 2X–1 Calculates Y = 2X – 1. X is taken from ST. The result, Y, is returned in ST. X must be in the range 0 ≤ X ≤ 0.5 on the 8087/287, or in the range –1.0 ≤ X ≤ +1.0 on the 80387–80486. Syntax Examples CPU Clock Cycles F2XM1 f2xm1 87 287 387 486 310–630 310–630 211–476 140–279 FABS Absolute Value Converts the element in ST to its absolute value. Syntax Examples CPU Clock Cycles FABS fabs 87 287 387 486 10–17 10–17 22 3 Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 150 of 6 Printed: 10/02/00 04:16 PM FBSTP Store BCD and Pop 151 FADD/FADDP/FIADD Add Adds the source to the destination and returns the sum in the destination. If two register operands are specified, one must be ST. If a memory operand is specified, the sum replaces the value in ST. Memory operands can be 32- or 64bit real numbers or 16- or 32-bit integers. If no operand is specified, ST is added to ST(1) and the stack is popped, returning the sum in ST. For FADDP, the source must be ST; the sum is returned in the destination and ST is popped. Syntax Examples CPU Clock Cycles FADD [[reg,reg]] fadd st,st(2) fadd st(5),st fadd 87 287 387 486 70–100 70–100 to=23–31, fr=26–34 8–20 FADDP reg,ST faddp st(6),st 87 287 387 486 75–105 75–105 23–31 8–20 FADD memreal fadd QWORD PTR [bx] fadd shortreal 87 (s=90–120,s=95– 125)+EA s=90–120,l=95–125 s=24–32,l=29–37 8–20 287 387 486 FIADD memint fiadd int16 fiadd warray[di] fiadd double 87 287 387 486 FBLD Load BCD See FLD. FBSTP Store BCD and Pop See FST. Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 151 of 7 Printed: 10/02/00 04:16 PM (w=102–137,d=108 –143)+EA w=102–137,d=108 –143 w=71–85,d=57–72 w=20–35,d=19–32 152 FCHS Change Sign FCHS Change Sign Reverses the sign of the value in ST. Syntax Examples CPU Clock Cycles FCHS fchs 87 287 387 486 10–17 10–17 24–25 6 FCLEX/FNCLEX Clear Exceptions Clears all exception flags, the busy flag, and bit 7 in the status word. Bit 7 is the interrupt-request flag on the 8087, and the error-status flag on the 80287, 80387, and 80486. The instruction has wait and no-wait versions. Syntax Examples CPU Clock Cycles* FCLEX FNCLEX fclex 87 287 387 486 2–8 2–8 11 7 * These timings reflect the no-wait version of the instruction. The wait version may take additional clock cycles. FCOM/FCOMP/FCOMPP/FICOM/FICOMP Compare Compares the specified source operand to ST and sets the condition codes of the status word according to the result. The instruction subtracts the source operand from ST without changing either operand. Memory operands can be 32- or 64-bit real numbers or 16- or 32-bit integers. If no operand is specified or if two pops are specified, ST is compared to ST(1) and the stack is popped. If one pop is specified with an operand, the operand is compared to ST. If one of the operands is a NAN, an invalid-operation exception occurs (see FUCOM for an alternative method of comparing on the 80387–80486). Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 152 of 8 Printed: 10/02/00 04:16 PM FCOM/FCOMP/FCOMPP/FICOM/FICOMP Compare 153 Syntax Examples CPU Clock Cycles FCOM [[reg]] fcom fcom 87 287 387 486 40–50 40–50 24 4 FCOMP [[reg]] fcomp fcomp 87 287 387 486 42–52 42–52 26 4 FCOMPP fcompp 87 287 387 486 45–55 45–55 26 5 FCOM memreal fcom fcom 87 287 387 486 (s=60–70,l=65–75)+EA s=60–70,l=65–75 s=26,l=31 4 FCOMP memreal fcomp fcomp longreal shorts[di] 87 287 387 486 (s=63–73,l=67–77)+EA s=63–73,l=67–77 s=26,l=31 4 FICOM memint ficom ficom double warray[di] 87 (w=72–86,d=78–91)+EA w=72–86,d=78–91 w=71–75,d=56–63 w=16–20,d=15–17 st(2) st(7) shortreals[di] longreal 287 387 486 FICOMP memint ficomp [bp+6] ficomp WORD PTR 87 darray[di] 287 387 486 (w=74–88,d=80–93)+EA w=74–88,d=80–93 w=71–75,d=56–63 w=16–20,d=15–17 Condition Codes for FCOM C3 C2 C1 C0 Meaning 0 0 ? 0 ST > source 0 0 ? 1 ST < source 1 0 ? 0 ST = source 1 1 ? 1 ST is not comparable to source Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 153 of 9 Printed: 10/02/00 04:16 PM 154 FCOS Cosine FCOS Cosine 80387–80486 Only Replaces a value in radians in ST with its cosine. If |ST | < 263, the C2 bit of the status word is cleared and the cosine is calculated. Otherwise, C2 is set and no calculation is performed. ST can be reduced to the required range with FPREM or FPREM1. Syntax Examples CPU Clock Cycles FCOS fcos 87 287 387 486 — — 123–772* 257–354† * For operands with an absolute value greater than π/4, up to 76 additional clocks may be required. † For operands with an absolute value greater than π/4, add n clocks where n = operand/(π/4). FDECSTP Decrement Stack Pointer Decrements the stack-top pointer in the status word. No tags or registers are changed, and no data is transferred. If the stack pointer is 0, FDECSTP changes it to 7. Syntax Examples CPU Clock Cycles FDECSTP fdecstp 87 287 387 486 6–12 6–12 22 3 FDISI/FNDISI Disable Interrupts 8087 Only Disables interrupts by setting the interrupt-enable mask in the control word. This instruction has wait and no-wait versions. Since the 80287, 80387, and 80486 do not have an interrupt-enable mask, the instruction is recognized but ignored on these coprocessors. Syntax Examples CPU Clock Cycles* FDISI FNDISI fdisi 87 287 387 486 2–8 2 2 3 Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 154 of 10 Printed: 10/02/00 04:16 PM FDIV/FDIVP/FIDIV Divide 155 * These timings reflect the no-wait version of the instruction. The wait version may take additional clock cycles. FDIV/FDIVP/FIDIV Divide Divides the destination by the source and returns the quotient in the destination. If two register operands are specified, one must be ST. If a memory operand is specified, the quotient replaces the value in ST. Memory operands can be 32- or 64-bit real numbers or 16- or 32-bit integers. If no operand is specified, ST(1) is divided by ST and the stack is popped, returning the result in ST. For FDIVP, the source must be ST; the quotient is returned in the destination register and ST is popped. Syntax Examples CPU Clock Cycles FDIV [[reg,reg]] fdiv fdiv 87 287 387 486 193–203 193–203 to=88, fr=91 73 FDIVP reg,ST fdivp 87 287 387 486 197–207 197–207 91 73 FDIV memreal fdiv fdiv fdiv DWORD PTR [bx] shortreal[di] longreal 87 (s=215–225,l=220– 230)+EA s=215–225,l=220–230 s=89,l=94 73 fidiv fidiv fidiv int16 warray[di] double 87 FIDIV memint st,st(2) st(5),st st(6),st 287 387 486 287 387 486 Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 155 of 11 Printed: 10/02/00 04:16 PM (w=224–238,d=230– 243)+EA w=224–238,d=230 –243 w=136–140,d=120 –127 w=85–89,d=84–86 156 FDIVR/FDIVRP/FIDIVR Divide Reversed FDIVR/FDIVRP/FIDIVR Divide Reversed Divides the source by the destination and returns the quotient in the destination. If two register operands are specified, one must be ST. If a memory operand is specified, the quotient replaces the value in ST. Memory operands can be 32- or 64-bit real numbers or 16- or 32-bit integers. If no operand is specified, ST is divided by ST(1) and the stack is popped, returning the result in ST. For FDIVRP, the source must be ST; the quotient is returned in the destination register and ST is popped. Syntax Examples CPU Clock Cycles FDIVR [[reg,reg]] fdivr fdivr fdivr 87 287 387 486 194–204 194–204 to=88, fr=91 73 FDIVRP reg,ST fdivrp 87 287 387 486 198–208 198–208 91 73 FDIVR memreal fdivr fdivr 87 (s=216–226,l=221 –231)+EA s=216–226,l=221–231 s=89,l=94 73 st,st(2) st(5),st st(6),st longreal shortreal[di] 287 387 486 FIDIVR memint fidivr fidivr double warray[di] 87 287 387 486 (w=225–239,d=231 –245)+EA w=225–239,d=231 –245 w=135–141,d=121–128 w=85–89,d=84–86 FENI/FNENI Enable Interrupts 8087 Only Enables interrupts by clearing the interrupt-enable mask in the control word. This instruction has wait and no-wait versions. Since the 80287, 80387, and 80486 do not have interrupt-enable masks, the instruction is recognized but ignored on these coprocessors. Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 156 of 12 Printed: 10/02/00 04:16 PM FILD Load Integer Syntax Examples CPU Clock Cycles* FENI FNENI feni 87 287 387 486 2–8 2 2 3 157 * These timings reflect the no-wait version of the instruction. The wait version may take additional clock cycles. FFREE Free Register Changes the specified register’s tag to empty without changing the contents of the register. Syntax Examples CPU Clock Cycles FFREE ST(i) ffree 87 287 387 486 9–16 9–16 18 3 st(3) FIADD/FISUB/FISUBR/ FIMUL/FIDIV/FIDIVR Integer Arithmetic See FADD, FSUB, FSUBR, FMUL, FDIV, and FDIVR. FICOM/FICOMP Compare Integer See FCOM. FILD Load Integer See FLD. Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 157 of 13 Printed: 10/02/00 04:16 PM 158 FINCSTP Increment Stack Pointer FINCSTP Increment Stack Pointer Increments the stack-top pointer in the status word. No tags or registers are changed, and no data is transferred. If the stack pointer is 7, FINCSTP changes it to 0. Syntax Examples CPU Clock Cycles FINCSTP fincstp 87 287 387 486 6–12 6–12 21 3 FINIT/FNINIT Initialize Coprocessor Initializes the coprocessor and resets all the registers and flags to their default values. The instruction has wait and no-wait versions. On the 80387–80486, the condition codes of the status word are cleared. On the 8087/287, they are unchanged. Syntax Examples CPU Clock Cycles* FINIT FNINIT finit 87 287 387 486 2–8 2–8 33 17 * These timings reflect the no-wait version of the instruction. The wait version may take additional clock cycles. FIST/FISTP Store Integer See FST. Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 158 of 14 Printed: 10/02/00 04:16 PM FLD1/FLDZ/FLDPI/FLDL2E/FLDL2T/FLDLG2/FLDLN2 Load Constant 159 FLD/FILD/FBLD Load Pushes the specified operand onto the stack. All memory operands are automatically converted to temporary-real numbers before being loaded. Memory operands can be 32-, 64-, or 80-bit real numbers or 16-, 32-, or 64-bit integers. Syntax Examples CPU Clock Cycles FLD reg fld st(3) 87 287 387 486 17–22 17–22 14 4 FLD memreal fld fld longreal shortarray[bx+di] 87 fld tempreal (s=38–56,l=40–60,t= 53–65)+EA s=38–56,l=40–60,t= 53–65 s=20,1=25,t=44 s=3,l=3,t=6 287 387 486 FILD memint fild fild fild mem16 DWORD PTR [bx] quads[si] 87 287 387 486 FBLD membcd fbld packbcd 87 287 387 486 (w=46–54,d=52– 60,q=60–68)+EA w=46-54,d=52-60,q= 60-68 w=61–65,d=45– 52,q=56–67 w=13–16,d=9–12,q= 10–18 (290–310)+EA 290–310 266–275 70–103 FLD1/FLDZ/FLDPI/FLDL2E/ FLDL2T/FLDLG2/FLDLN2 Load Constant FLD1/FLDZ/FLDPI/FLDL2E/FLDL2T/FLDLG2/FLDLN2 Load Constant Pushes a constant onto the stack. The following constants can be loaded: Instruction Constant FLD1 +1.0 FLDZ +0.0 FLDPI π Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 159 of 15 Printed: 10/02/00 04:16 PM 160 FLD1/FLDZ/FLDPI/FLDL2E/FLDL2T/FLDLG2/FLDLN2 Load Constant Instruction Constant FLDL2E Log2(e) Log2(10) FLDL2T FLDLG2 Log10(2) Loge(2) FLDLN2 Syntax Examples CPU Clock Cycles FLD1 fld1 87 287 387 486 15–21 15–21 24 4 FLDZ fldz 87 287 387 486 11–17 11–17 20 4 FLDPI fldpi 87 287 387 486 16–22 16–22 40 8 FLDL2E fldl2e 87 287 387 486 15–21 15–21 40 8 FLDL2T fldl2t 87 287 387 486 16–22 16–22 40 8 FLDLG2 fldlg2 87 287 387 486 18–24 18–24 41 8 FLDLN2 fldln2 87 287 387 486 17–23 17–23 41 8 Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 160 of 16 Printed: 10/02/00 04:16 PM FMUL/FMULP/FIMUL Multiply 161 FLDCW Load Control Word Loads the specified word into the coprocessor control word. The format of the control word is shown in the “Interpreting Coprocessor Instructions” section. Syntax Examples CPU Clock Cycles FLDCW mem16 fldcw 87 287 387 486 (7–14)+EA 7–14 19 4 ctrlword FLDENV/FLDENVW/FLDENVD Load Environment State Loads the 14-byte coprocessor environment state from a specified memory location. The environment includes the control word, status word, tag word, instruction pointer, and operand pointer. On the 80387–80486 in 32-bit mode, the environment state is 28 bytes. Syntax Examples CPU Clock Cycles FLDENV mem fldenv 87 (35–45)+EA FLDENVW mem* 287 35–45 FLDENVD mem* 387 486 71 44,pm=34 [bp+10] * 80387–80486 only. FMUL/FMULP/FIMUL Multiply Multiplies the source by the destination and returns the product in the destination. If two register operands are specified, one must be ST. If a memory operand is specified, the product replaces the value in ST. Memory operands can be 32- or 64-bit real numbers or 16- or 32-bit integers. If no operand is specified, ST(1) is multiplied by ST and the stack is popped, returning the product in ST. For FMULP, the source must be ST; the product is returned in the destination register and ST is popped. Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 161 of 17 Printed: 10/02/00 04:16 PM 162 FNinstruction No-Wait Instructions Syntax Examples CPU Clock Cycles FMUL [[reg,reg]] fmul fmul fmul 87 287 387 486 130–145 (90–105)* 130–145 (90–105)* to=46–54 (49), fr= 29–57 (52)† 16 st,st(2) st(5),st FMULP reg,ST fmulp st(6),st 87 287 387 486 134–148 (94–108)* 134–148 (94–108)* 29–57 (52)† 16 FMUL memreal fmul fmul fmul DWORD PTR [bx] shortreal[di+3] longreal 87 (s=110–125,l=154– 168)+EA§ s=110–125,l=154 –168§ s=27–35,l=32–57 s=11,l=14 287 387 486 FIMUL memint fimul fimul fimul int16 warray[di] double 87 287 387 486 (w=124–138,d=130 –144)+EA w=124–138,d=130 –144 w=76–87,d=61–82 w=23–27,d=22–24 * The clocks in parentheses show times for short values—those with 40 trailing zeros in their fraction because they were loaded from a short-real memory operand. † The clocks in parentheses show typical speeds. § If the register operand is a short value—having 40 trailing zeros in its fraction because it was loaded from a short-real memory operand—then the timing is (112–126)+EA on the 8087 or 112–126 on the 80287. FNinstruction No-Wait Instructions Instructions that have no-wait versions include FCLEX, FDISI, FENI, FINIT, FSAVE, FSTCW, FSTENV, and FSTSW. Wait versions of instructions check for unmasked numeric errors; no-wait versions do not. When the .8087 directive is used, the assembler puts a WAIT instruction before the wait versions and a NOP instruction before the no-wait versions. Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 162 of 18 Printed: 10/02/00 04:16 PM FPREM Partial Remainder 163 FNOP No Operation Performs no operation. FNOP can be used for timing delays or alignment. Syntax Examples CPU Clock Cycles FNOP fnop 87 287 387 486 10–16 10–16 12 3 FPATAN Partial Arctangent Finds the partial tangent by calculating Z = ARCTAN(Y / X). X is taken from ST and Y from ST(1). On the 8087/287, Y and X must be in the range 0 ≤ Y < X < ∞. On the 80387–80486, there is no restriction on X and Y. X is popped from the stack and Z replaces Y in ST. Syntax Examples CPU Clock Cycles FPATAN fpatan 87 287 387 486 250–800 250–800 314–487 218–303 FPREM Partial Remainder Calculates the remainder of ST divided by ST(1), returning the result in ST. The remainder retains the same sign as the original dividend. The calculation uses the following formula: remainder = ST – ST(1) * quotient The quotient is the exact value obtained by chopping ST / ST(1) toward 0. The instruction is normally used in a loop that repeats until the reduction is complete, as indicated by the condition codes of the status word. Syntax Examples CPU Clock Cycles FPREM fprem 87 287 387 486 15–190 15–190 74–155 70–138 Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 163 of 19 Printed: 10/02/00 04:16 PM 164 FPREM1 Partial Remainder (IEEE Compatible) Condition Codes for FPREM and FPREM1 C3 C2 C1 C0 Meaning ? 1 ? ? Incomplete reduction 0 0 0 0 quotient MOD 8 = 0 0 0 0 1 quotient MOD 8 = 4 0 0 1 0 quotient MOD 8 = 1 0 0 1 1 quotient MOD 8 = 5 1 0 0 0 quotient MOD 8 = 2 1 0 0 1 quotient MOD 8 = 6 1 0 1 0 quotient MOD 8 = 3 1 0 1 1 quotient MOD 8 = 7 FPREM1 Partial Remainder (IEEE Compatible) 80387–80486 Only Calculates the remainder of ST divided by ST(1), returning the result in ST. The remainder retains the same sign as the original dividend. The calculation uses the following formula: remainder = ST – ST(1) * quotient The quotient is the integer nearest to the exact value of ST / ST(1). When two integers are equally close to the given value, the even integer is used. The instruction is normally used in a loop that repeats until the reduction is complete, as indicated by the condition codes of the status word. See FPREM for the possible condition codes. Syntax Examples CPU Clock Cycles FPREM1 fprem1 87 287 387 486 — — 95–185 72–167 Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 164 of 20 Printed: 10/02/00 04:16 PM FRNDINT Round to Integer 165 FPTAN Partial Tangent Finds the partial tangent by calculating Y / X = TAN(Z). Z is taken from ST. Z must be in the range 0 ≤ Z ≤ π / 4 on the 8087/287. On the 80387–80486, |Z| must be less than 263. The result is the ratio Y / X. Y replaces Z, and X is pushed into ST. Thus, Y is returned in ST(1) and X in ST. Syntax Examples CPU Clock Cycles FPTAN fptan 87 287 387 486 30–540 30–540 191–497* 200–273† * For operands with an absolute value greater than π/4, up to 76 additional clocks may be required. † For operands with an absolute value greater than π/4, add n clocks where n = operand/(π/4). FRNDINT Round to Integer Rounds ST from a real number to an integer. The rounding control (RC) field of the control word specifies the rounding method, as shown in the introduction to this section. Syntax Examples CPU Clock Cycles FRNDINT frndint 87 287 387 486 16–50 16–50 66–80 21–30 Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 165 of 21 Printed: 10/02/00 04:16 PM 166 FRSTOR/FRSTORW/FRSTORD Restore Saved State FRSTOR/FRSTORW/FRSTORD Restore Saved State Restores the 94-byte coprocessor state to the coprocessor from the specified memory location. In 32-bit mode on the 80387–80486, the environment state takes 108 bytes. Syntax Examples CPU Clock Cycles FRSTOR mem FRSTORW mem* FRSTORD mem* frstor [bp–94] 87 287 387 486 (197–207)+EA † 308 131,pm=120 * 80387–80486 only. † Clock counts are not meaningful in determining overall execution time of this instruction. Timing is determined by operand transfers. FSAVE/FSAVEW/FSAVED/FNSAVE/ FNSAVEW/FNSAVED Save Coprocessor State Stores the 94-byte coprocessor state to the specified memory location. In 32-bit mode on the 80387–80486, the environment state takes 108 bytes. This instruction has wait and no-wait versions. After the save, the coprocessor is initialized as if FINIT had been executed. Syntax Examples CPU Clock Cycles§ FSAVE mem FSAVEW mem* FSAVED mem* FNSAVE mem FNSAVEW mem* FNSAVED mem* fsave [bp–94] fsave cobuffer 87 287 387 486 (197–207)+EA † 375–376 154,pm=143 * 80387–80486 only. † Clock counts are not meaningful in determining overall execution time of this instruction. Timing is determined by operand transfers. § These timings reflect the no-wait version of the instruction. The wait version may take additional clock cycles. Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 166 of 22 Printed: 10/02/00 04:16 PM FSETPM Set Protected Mode 167 FSCALE Scale Scales by powers of 2 by calculating the function Y = Y * 2X. X is the scaling factor taken from ST(1), and Y is the value to be scaled from ST. The scaled result replaces the value in ST. The scaling factor remains in ST(1). If the scaling factor is not an integer, it will be truncated toward zero before the scaling. On the 8087/287, if X is not in the range –215 ≤ X < 215 or if X is in the range 0 < X < 1, the result will be undefined. The 80387–80486 have no restrictions on the range of operands. Syntax Examples CPU Clock Cycles FSCALE fscale 87 287 387 486 32–38 32–38 67–86 30–32 FSETPM Set Protected Mode 80287 Only Sets the 80287 to protected mode. The instruction and operand pointers are in the protected-mode format after this instruction. On the 80387– 80486, FSETPM is recognized but interpreted as FNOP, since the 80386/486 processors handle addressing identically in real and protected mode. Syntax Examples CPU Clock Cycles FSETPM fsetpm 87 287 387 486 — 2–8 12 3 Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 167 of 23 Printed: 10/02/00 04:16 PM 168 FSIN Sine FSIN Sine 80387–80486 Only Replaces a value in radians in ST with its sine. If |ST | < 263, the C2 bit of the status word is cleared and the sine is calculated. Otherwise, C2 is set and no calculation is performed. ST can be reduced to the required range with FPREM or FPREM1. Syntax Examples CPU Clock Cycles FSIN fsin 87 287 387 486 — — 122–771* 257–354† * For operands with an absolute value greater than π/4, up to 76 additional clocks may be required. † For operands with an absolute value greater than π/4, add n clocks where n = operand/(π/4). FSINCOS Sine and Cosine 80387–80486 Only Computes the sine and cosine of a radian value in ST. The sine replaces the value in ST, and then the cosine is pushed onto the stack. If |ST | < 263, the C2 bit of the status word is cleared and the sine and cosine are calculated. Otherwise, C2 is set and no calculation is performed. ST can be reduced to the required range with FPREM or FPREM1. Syntax Examples CPU Clock Cycles FSINCOS fsincos 87 287 387 486 — — 194–809* 292–365† * For operands with an absolute value greater than π/4, up to 76 additional clocks may be required. † For operands with an absolute value greater than π/4, add n clocks where n = operand/(π/4). Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 168 of 24 Printed: 10/02/00 04:16 PM FST/FSTP/FIST/FISTP/FBSTP Store 169 FSQRT Square Root Replaces the value of ST with its square root. (The square root of –0 is –0.) Syntax Examples CPU Clock Cycles FSQRT fsqrt 87 287 387 486 180–186 180–186 122–129 83–87 FST/FSTP/FIST/FISTP/FBSTP Store Stores the value in ST to the specified memory location or register. Temporaryreal values in registers are converted to the appropriate integer, BCD, or floating-point format as they are stored. With FSTP, FISTP, and FBSTP, the ST register value is popped off the stack. Memory operands can be 32-, 64-, or 80-bit real numbers for FSTP or 16-, 32-, or 64-bit integers for FISTP. Syntax Examples CPU Clock Cycles FST reg fst fst st(6) st 87 287 387 486 15–22 15–22 11 3 FSTP reg fstp fstp st st(3) 87 287 387 486 17–24 17–24 12 3 FST memreal fst fst shortreal longs[bx] 87 (s=84–90,l=96– 104)+EA s=84–90,l=96–104 s=44,l=45 s=7,l=8 287 387 486 FSTP memreal fstp fstp longreal tempreals[bx] 87 287 387 486 Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 169 of 25 Printed: 10/02/00 04:16 PM (s=86–92,l=98–106, t=52–58)+EA s=86–92,l=98–106, t=52–58 s=44,l=45,t=53 s=7,l=8,t=6 170 FSTCW/FNSTCW Store Control Word Syntax Examples CPU Clock Cycles FIST memint fist fist 87 (w=80–90,d=82– 92)+EA w=80–90,d=82–92 w=82-95,d=79-93 w=29–34,d=28–34 int16 doubles[8] 287 387 486 FISTP memint fistp fistp longint doubles[bx] 486 (w=82–92,d=84–94, q=94–105)+EA w=82–92,d=84–94, q=94–105 w=82–95,d=79–93, q=80–97 29–34 87 287 387 486 (520–540)+EA 520–540 512–534 172–176 87 287 387 FBSTP membcd fbstp bcds[bx] FSTCW/FNSTCW Store Control Word Stores the control word to a specified 16-bit memory operand. This instruction has wait and no-wait versions. Syntax Examples CPU Clock Cycles* FSTCW mem16 FNSTCW mem16 fstcw 87 287 387 486 12–18 12–18 15 3 ctrlword * These timings reflect the no-wait version of the instruction. The wait version may take additional clock cycles. FSTENV/FSTENVW/FSTENVD/FNSTENV/FNSTENVW/ FNSTENVD Store Environment State Stores the 14-byte coprocessor environment state to a specified memory location. The environment state includes the control word, status word, tag word, instruction pointer, and operand pointer. On the 80387–80486 in 32-bit mode, the environment state is 28 bytes. Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 170 of 26 Printed: 10/02/00 04:16 PM FSUB/FSUBP/FISUB Subtract Syntax Examples CPU Clock Cycles† FSTENV mem FSTENVW mem* FSTENVD mem* FNSTENV mem FNSTENVW mem* FNSTENVD mem* fstenv 87 287 387 486 (40–50)+EA 40–50 103–104 67,pm=56 [bp–14] 171 * 80387–80486 only. † These timings reflect the no-wait version of the instruction. The wait version may take additional clock cycles. FSTSW/FNSTSW Store Status Word Stores the status word to a specified 16-bit memory operand. On the 80287, 80387, and 80486, the status word can also be stored to the processor’s AX register. This instruction has wait and no-wait versions. Syntax Examples CPU Clock Cycles* FSTSW mem16 FNSTSW mem16 fstsw statword 87 287 387 486 12–18 12–18 15 3 FSTSW AX FNSTSW AX fstsw ax 87 287 387 486 — 10–16 13 3 * These timings reflect the no-wait version of the instruction. The wait version may take additional clock cycles. FSUB/FSUBP/FISUB Subtract Subtracts the source operand from the destination operand and returns the difference in the destination operand. If two register operands are specified, one must be ST. If a memory operand is specified, the result replaces the value in ST. Memory operands can be 32- or 64-bit real numbers or 16- or 32-bit integers. If no operand is specified, ST is subtracted from ST(1) and the stack is popped, returning the difference in ST. For FSUBP, the source must be ST; the difference (destination minus source) is returned in the destination register and ST is popped. Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 171 of 27 Printed: 10/02/00 04:16 PM 172 FSUBR/FSUBRP/FISUBR Subtract Reversed Syntax Examples CPU Clock Cycles FSUB [[reg,reg]] fsub fsub fsub st,st(2) st(5),st 87 287 387 486 70–100 70–100 to=29–37, fr=26–34 8–20 FSUBP reg,ST fsubp st(6),st 87 287 387 486 75–105 75–105 26–34 8–20 FSUB memreal fsub fsub 87 (s=90–120,s=95– 125)+EA s=90–120,l=95–125 s=24–32,l=28–36 8–20 longreal shortreals[di] 287 387 486 FISUB memint fisub double fisub warray[di] 87 287 387 486 (w=102–137,d=108143)+EA w=102–137,d=108– 143 w=71–83,d=57–82 w=20–35,d=19–32 FSUBR/FSUBRP/FISUBR Subtract Reversed Subtracts the destination operand from the source operand and returns the result in the destination operand. If two register operands are specified, one must be ST. If a memory operand is specified, the result replaces the value in ST. Memory operands can be 32- or 64-bit real numbers or 16- or 32-bit integers. If no operand is specified, ST(1) is subtracted from ST and the stack is popped, returning the difference in ST. For FSUBRP, the source must be ST; the difference (source minus destination) is returned in the destination register and ST is popped. Syntax Examples CPU Clock Cycles FSUBR [[reg,reg]] fsubr fsubr fsubr st,st(2) st(5),st 87 287 387 486 70–100 70–100 to=29–37, fr=26–34 8–20 FSUBRP reg,ST fsubrp st(6),st 87 287 387 486 75–105 75–105 26–34 8–20 Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 172 of 28 Printed: 10/02/00 04:16 PM FUCOM/FUCOMP/FUCOMPP Unordered Compare Syntax Examples CPU Clock Cycles FSUBR memreal fsubr fsubr fsubr 87 (s=90–120,s=95– 125)+EA s=90–120,l=95–125 s=25–33,l=29–37 8–20 QWORD PTR [bx] shortreal[di] longreal fisubr int16 fisubr warray[di] fisubr double FISUBR memint 287 387 486 87 287 387 486 173 (w=103–139,d=109– 144)+EA w=103–139,d=109– 144 w=72–84,d=58–83 w=20–55,d=19–32 FTST Test for Zero Compares ST with +0.0 and sets the condition of the status word according to the result. Syntax Examples CPU Clock Cycles FTST ftst 87 287 387 486 38–48 38–48 28 4 Condition Codes for FTST C3 C2 C1 C0 Meaning 0 0 ? 0 ST is positive 0 0 ? 1 ST is negative 1 0 ? 0 ST is 0 1 1 ? 1 ST is not comparable (NAN or projective infinity) FUCOM/FUCOMP/FUCOMPP Unordered Compare 80387–80486 Only Compares the specified source to ST and sets the condition codes of the status word according to the result. The instruction subtracts the source operand from ST without changing either operand. Memory operands are not allowed. If no operand is specified or if two pops are specified, ST is compared to ST(1). If one pop is specified with an operand, the given register is compared to ST. Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 173 of 29 Printed: 10/02/00 04:16 PM 174 FWAIT Wait Unlike FCOM, FUCOM does not cause an invalid-operation exception if one of the operands is NAN. Instead, the condition codes are set to unordered. Syntax Examples CPU Clock Cycles FUCOM [[reg]] fucom fucom st(2) 87 287 387 486 — — 24 4 FUCOMP [[reg]] fucomp fucomp st(7) 87 287 387 486 — — 26 4 FUCOMPP fucompp 87 287 387 486 — — 26 5 Condition Codes for FUCOM C3 C2 C1 C0 Meaning 0 0 ? 0 ST > source 0 0 ? 1 ST < source 1 0 ? 0 ST = source 1 1 ? 1 Unordered FWAIT Wait Suspends execution of the processor until the coprocessor is finished executing. This is an alternate mnemonic for the processor WAIT instruction. Syntax Examples CPU Clock Cycles FWAIT fwait 87 287 387 486 4 3 6 1–3 Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 174 of 30 Printed: 10/02/00 04:16 PM FXAM Examine 175 FXAM Examine Reports the contents of ST in the condition flags of the status word. Syntax Examples CPU Clock Cycles FXAM fxam 87 287 387 486 12–23 12–23 30–38 8 Condition Codes for FXAM C3 C2 C1 C0 Meaning 0 0 0 0 + Unnormal* 0 0 0 1 + NAN 0 0 1 0 – Unnormal* 0 0 1 1 – NAN 0 1 0 0 + Normal 0 1 0 1 + Infinity 0 1 1 0 – Normal 0 1 1 1 – Infinity 1 0 0 0 +0 1 0 0 1 Empty 1 0 1 0 –0 1 0 1 1 Empty 1 1 0 0 + Denormal 1 1 0 1 Empty* 1 1 1 0 – Denormal 1 1 1 1 Empty* * Not used on the 80387–80486. Unnormals are not supported by the 80387–80486. Also, the 80387– 80486 use two codes instead of four to identify empty registers. Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 175 of 31 Printed: 10/02/00 04:16 PM 176 FXCH Exchange Registers FXCH Exchange Registers Exchanges the specified (destination) register and ST. If no operand is specified, ST and ST(1) are exchanged. Syntax Examples CPU Clock Cycles FXCH [[reg]] fxch fxch 87 287 387 486 10–15 10–15 18 4 st(3) FXTRACT Extract Exponent and Significand Extracts the exponent and significand (mantissa) fields of ST. The exponent replaces the value in ST, and then the significand is pushed onto the stack. Syntax Examples CPU Clock Cycles FXTRACT fxtract 87 287 387 486 27–55 27–55 70–76 16–20 FYL2X Y log2(X) Calculates Z = Y log2(X). X is taken from ST and Y from ST(1). The stack is popped, and the result, Z, replaces Y in ST. X must be in the range 0 < X < ∞ and Y in the range –∞ < Y < ∞. Syntax Examples CPU Clock Cycles FYL2X fyl2x 87 287 387 486 900–1100 900–1100 120–538 196–329 Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 176 of 32 Printed: 10/02/00 04:16 PM FYL2XP1 Y log2(X+1) 177 FYL2XP1 Y log2(X+1) Calculates Z = Y log2(X + 1). X is taken from ST and Y from ST(1). The stack is popped once, and the result, Z, replaces Y in ST. X must be in the range 0 < |X| < (1 – (√2 / 2)). Y must be in the range –∞ < Y < ∞. Syntax Examples CPU Clock Cycles FYL2XP1 fyl2xp1 87 287 387 486 700–1000 700–1000 257–547 171–326 Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 177 of 33 Printed: 10/02/00 04:16 PM 178 FYL2XP1 Y log2(X+1) Filename: LMARFC05.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Mike Eddy Revision #: 79 Page: 178 of 34 Printed: 10/02/00 04:16 PM 179 C H A P T E R 6 Macros Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BIOS.INC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CMACROS.INC, CMACROS.NEW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MS-DOS.INC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MACROS.INC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PROLOGUE.INC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WIN.INC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Filename: LMARFC06.DOC Project: MASM Reference Template: MSGRIDA1.DOT Author: a.c. birdsong Last Saved By: Launi Lockard Revision #: 26 Page: 179 of 1 Printe d: 10/02/00 04:16 PM 180 180 180 183 184 185 185 180 Reference Introduction Each of the INCLUDE files is listed with the names of the macros it contains. Macros listed take the form: MACRO[[ ]], ..>]] Some variables are listed as name:req. In these cases, req indicates that macroname cannot be called without the variable name supplied. For specific information on the macros themselves, see the contents of the commented *.INC file. BIOS.INC @Cls MACRO pagenum @GetCharAtr MACRO pagenum @GetCsr MACRO pagenum @GetMode MACRO @PutChar MACRO chr, atrib, pagenum, loops @PutCharAtr MACRO chr, atrib, pagenum, loops @Scroll MACRO distance:REQ, atrib:=<07h>, upcol, uprow, dncol, dnrow @SetColor MACRO color @SetCsrPos MACRO column, row, pagenum @SetCsrSize MACRO first, last @SetMode MACRO mode @SetPage MACRO pagenum @SetPalette MACRO color CMACROS.INC, CMACROS.NEW These two include files contain the same macros. Use CMACROS.NEW for programs written in MASM 6.0 and later. Use CMACROS.INC for programs written in MASM 5.1 or earlier, or if you have problems with CMACROS.NEW. @reverse MACRO list arg MACRO args assumes MACRO s,ln Filename: LMARFC06.DOC Project: MASM Reference Template: MSGRIDA1.DOT Author: a.c. birdsong Last Saved By: Launi Lockard Revision #: 26 Page: 180 of 2 Printed: 10/02/00 04:16 PM Macros callcrt MACRO funcname cBegin MACRO pname cEnd MACRO pname cEpilog MACRO procname, flags, cbParms, cbLocals, reglist, userparms cProc MACRO pname:REQ, attribs, autoSave cPrologue MACRO procname, flags, cbParms, cbLocals, reglist, userparms createSeg MACRO segName, logName, aalign, combine, class, grp cRet MACRO defGrp MACRO foo:vararg errn$ MACRO l,x errnz MACRO x externA MACRO names:req, langtype externB MACRO names:req, langtype externCP MACRO n,c externD MACRO names:req, langtype externDP MACRO n,c externFP MACRO names:req, langtype externNP MACRO names:req, langtype externP MACRO n,c externQ MACRO names:req, langtype externT MACRO names:req, langtype externW MACRO names:req, langtype farPtr MACRO n,s,o globalB MACRO name:req, initVal:=, repCount, langType globalCP MACRO n,i,s,c globalD MACRO name:req, initVal:=, repCount, langType globalDP MACRO n,i,s,c globalQ MACRO name:req, initVal:=, repCount, langType globalT MACRO name:req, initVal:=, repCount, langType globalW MACRO name:req, initVal:=, repCount, langType labelB MACRO names:req,langType labelCP MACRO n,c Filename: LMARFC06.DOC Project: MASM Reference Template: MSGRIDA1.DOT Author: a.c. birdsong Last Saved By: Launi Lockard Revision #: 26 Page: 181 of 3 Printed: 10/02/00 04:16 PM 181 182 Reference labelD MACRO names:req,langType labelDP MACRO n,c labelFP MACRO names:req,langType labelNP MACRO names:req,langType labelP MACRO n,c labelQ MACRO names:req,langType labelT MACRO names:req,langType labelW MACRO names:req,langType lbl MACRO names:req localB MACRO name localCP MACRO n localD MACRO name localDP MACRO n localQ MACRO name localT MACRO name localV MACRO name,a localW MACRO name logName&_assumes MACRO s logName&_sbegin MACRO n MACRO outif MACRO name:req, defval:=<0>, onmsg, offmsg parmB MACRO names:req parmCP MACRO n parmD MACRO names:req parmDP MACRO n parmQ MACRO names:req parmR MACRO n,r,r2 parmT MACRO names:req parmW MACRO names:req regPtr MACRO n,s,o save MACRO r sBegin MACRO name:req Filename: LMARFC06.DOC Project: MASM Reference Template: MSGRIDA1.DOT Author: a.c. birdsong Last Saved By: Launi Lockard Revision #: 26 Page: 182 of 4 Printed: 10/02/00 04:16 PM Macros sEnd MACRO name setDefLangType MACRO overLangType staticB MACRO name:req, initVal:=, repCount staticCP MACRO name:req, i, s staticD MACRO name:req, initVal:=, repCount staticDP MACRO name:req, i, s staticI MACRO name:req, initVal:=, repCount staticQ MACRO name:req, initVal:=, repCount staticT MACRO name:req, initVal:=, repCount staticW MACRO name:req, initVal:=, repCount MS-DOS.INC NPVOID TYPEDEF NEAR PTR FPVOID TYPEDEF FAR PTR FILE_INFO STRUCT @ChDir MACRO path:REQ, segmnt @ChkDrv MACRO drive @CloseFile MACRO handle:REQ @DelFile MACRO path:REQ, segmnt @Exit MACRO return @FreeBlock MACRO segmnt @GetBlock MACRO graphs:REQ, retry:=<0> @GetChar MACRO ech:=<1>, cc:=<1>, clear:=<0> @GetDate MACRO @GetDir MACRO buffer:REQ, drive, segmnt @GetDrv MACRO @GetDTA MACRO @GetFileSize MACRO handle:REQ @GetFirst MACRO path:REQ, atrib, segmnt @GetInt MACRO interrupt:REQ @GetNext MACRO Filename: LMARFC06.DOC Project: MASM Reference Template: MSGRIDA1.DOT Author: a.c. birdsong Last Saved By: Launi Lockard Revision #: 26 Page: 183 of 5 Printed: 10/02/00 04:16 PM 183 184 Reference @GetStr MACRO ofset:REQ, terminator, limit, segmnt @GetTime MACRO @GetVer MACRO @MakeFile MACRO path:REQ, atrib:=<0>, segmnt, kind @MkDir MACRO path:REQ, segmnt @ModBlock MACRO graphs:REQ, segmnt @MoveFile MACRO old:REQ, new:REQ, segold, segnew @MovePtrAbs MACRO handle:REQ, distance @MovePtrRel MACRO handle:REQ, distance @OpenFile MACRO path:REQ, access:=<0>, segmnt @PrtChar MACRO chr:VARARG @Read MACRO ofset:REQ, bytes:REQ, handle:=<0>, segmnt @RmDir MACRO path:REQ, segmnt @SetDate MACRO month:REQ, day:REQ, year:REQ @SetDrv MACRO drive:REQ @SetDTA MACRO buffer:REQ, segmnt @SetInt MACRO interrupt:REQ, vector:REQ, segmnt @SetTime MACRO hour:REQ, minutes:REQ, seconds:REQ, hundredths:REQ @ShowChar MACRO chr:VARARG @ShowStr MACRO ofset:REQ, segmnt @TSR MACRO paragraphs:REQ, return @Write MACRO ofset:REQ, bytes:REQ, handle:=<1>, segmnt MACROS.INC @ArgCount MACRO arglist:VARARG @ArgI MACRO index:REQ, arglist:VARARG @ArgRev MACRO arglist @PopAll MACRO @PushAll MACRO @RestoreRegs MACRO @SaveRegs MACRO regs:VARARG echof MACRO format:REQ, args:VARARG pushc MACRO op Filename: LMARFC06.DOC Project: MASM Reference Template: MSGRIDA1.DOT Author: a.c. birdsong Last Saved By: Launi Lockard Revision #: 26 Page: 184 of 6 Printed: 10/02/00 04:16 PM Macros 185 PROLOGUE.INC cEpilogue MACRO szProcName, flags, cbParams, cbLocals, rgRegs, rgUserParams cPrologue MACRO szProcName, flags, cbParams, cbLocals, rgRegs, rgUserParams WIN.INC The include file WIN.INC is WINDOWS.H processed by H2INC, and slightly modified to reduce unnecessary warnings. Filename: LMARFC06.DOC Project: MASM Reference Template: MSGRIDA1.DOT Author: a.c. birdsong Last Saved By: Launi Lockard Revision #: 26 Page: 185 of 7 Printed: 10/02/00 04:16 PM 186 Reference Filename: LMARFC06.DOC Project: MASM Reference Template: MSGRIDA1.DOT Author: a.c. birdsong Last Saved By: Launi Lockard Revision #: 26 Page: 186 of 8 Printed: 10/02/00 04:16 PM 187 C H A P T E R 7 Tables ASCII Chart . . . . . . . . . . . . . . . . . . . . . Key Codes . . . . . . . . . . . . . . . . . . . . . . MS-DOS Program Segment Prefix (PSP) Color Display Attributes . . . . . . . . . . . . . Hexadecimal-Binary-Decimal Conversion Filename: LMARFC07.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 18 Page: 187 of 1 Printed: 10/02/00 04:16 PM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188 190 192 193 194 188 Reference ASCII Codes Filename: LMARFC07.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 18 Page: 188 of 2 Printed: 10/02/00 04:16 PM Tables Filename: LMARFC07.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 18 Page: 189 of 3 Printed: 10/02/00 04:16 PM 189 190 Reference Key Codes Filename: LMARFC07.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 18 Page: 190 of 4 Printed: 10/02/00 04:16 PM Tables Filename: LMARFC07.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 18 Page: 191 of 5 Printed: 10/02/00 04:16 PM 191 192 Reference MS-DOS Program Segment Prefix (PSP) 1 Opcode for INT 20h instruction (CDh 20h) 2 Segment of first allocatable address following the program (used for memory allocation) 3 Reserved or used by MS-DOS 4 Opcode for far call to MS-DOS function dispatcher 5 Vector for terminate routine 6 Vector for CTRL+C handler routine 7 Vector for error handler routine 8 Segment address of program’s environment block 9 Opcode for MS-DOS INT 21h and far return (you can do a far call to this address to execute MS-DOS calls) 10 First command-line argument (formatted as uppercase 11-character filename) 11 Second command-line argument (formatted as uppercase 11-character filename) 12 Number of bytes in command-line argument 13 Unformatted command line and/or default Disk Transfer Area (DTA) Filename: LMARFC07.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 18 Page: 192 of 6 Printed: 10/02/00 04:16 PM Tables Color Display Attributes Background Foreground Bits Num F R G B 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 Color Bits* Num Color I R G B Black 0 0 0 0 0 Black 1 Blue 0 0 0 1 1 Blue 2 Green 0 0 1 0 2 Green 1 3 Cyan 0 0 1 1 3 Cyan 0 0 4 Red 0 1 0 0 4 Red 1 0 1 5 Magenta 0 1 0 1 5 Magenta 1 1 0 6 Brown 0 1 1 0 6 Brown 0 1 1 1 7 White 0 1 1 1 7 White 1 0 0 0 8 Black blink 1 0 0 0 8 Dark gray 1 0 0 1 9 Blue blink 1 0 0 1 9 Light Blue 1 0 1 0 A Green blink 1 0 1 0 A Light green 1 0 1 1 B Cyan blink 1 0 1 1 B Light cyan 1 1 0 0 C Red blink 1 1 0 0 C Light red 1 1 0 1 D Magenta blink 1 1 0 1 D Light Magenta 1 1 1 0 E Brown blink 1 1 1 0 E Yellow 1 1 1 1 F White blink 1 1 1 1 F Bright White F Flashing bit G Green bit R Red bit B Blue bit I Intensity bit * On monochrome monitors, the blue bit is set and the red and green bits are cleared (001) for underline; all color bits are set (111) for normal text. Filename: LMARFC07.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 18 Page: 193 of 7 Printed: 10/02/00 04:16 PM 193 194 Reference Hexadecimal-Binary-Decimal Conversion Hex Number Binary Number Decimal Digit 000X Decimal Digit 00X0 Decimal Digit 0X00 Decimal Digit X000 0 0000 0 0 0 0 1 0001 1 16 256 4,096 2 0010 2 32 512 8,192 3 0011 3 48 768 12,288 4 0100 4 64 1,024 16,384 5 0101 5 80 1,280 20,480 6 0110 6 96 1,536 24,576 7 0111 7 112 1,792 28,672 8 1000 8 128 2,048 32,768 9 1001 9 144 2,304 36,864 A 1010 10 160 2,560 40,960 B 1011 11 176 2,816 45,056 C 1100 12 192 3,072 49,152 D 1101 13 208 3,328 53,248 E 1110 14 224 3,584 57,344 F 1111 15 240 3,840 61,440 Filename: LMARFC07.DOC Project: Template: MSGRIDA1.DOT Author: Mike Eddy Last Saved By: Launi Lockard Revision #: 18 Page: 194 of 8 Printed: 10/02/00 04:16 PM
Source Exif Data:
File Type : PDF File Type Extension : pdf MIME Type : application/pdf PDF Version : 1.4 Linearized : No Modify Date : 2003:05:29 19:45:12-07:00 Create Date : 2002:09:08 11:24:03Z Page Count : 210 Mod Date : 2003:05:29 19:45:12-07:00 Creation Date : 2002:09:08 11:24:03Z Producer : Acrobat Web Capture 5.0 Metadata Date : 2003:05:29 19:45:12-07:00 Title : CSCI 240 - Assembly Language Programming - MASM & Intel Docs Page Mode : UseOutlinesEXIF Metadata provided by EXIF.tools