📄 8086_instruction_set.html
字号:
<!doctype HTML public "-//W3O//DTD W3 HTML 3.0//EN"><HTML><HEAD><TITLE>8086 instructions</TITLE><META name="description" content="Complete 8086 instruction set"><META name="keywords" content="8086, instruction, set, complete instruction set, example, mov, add, inc, sub, xor, xchg"><META name="robots" content="nofollow"></HEAD><BODY bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#007099" alink="#FF0000"><FONT FACE="Verdana" SIZE=3><FONT SIZE=+2><B>Complete 8086 instruction set</B></FONT><!-- 116 instructions --><HR><BR>Quick reference:<BR><BR><FONT FACE="Fixedsys"><TABLE BORDER=0 WIDTH=100%><TR><TD><A HREF="#AAA">AAA</A> <BR><A HREF="#AAD">AAD</A> <BR><A HREF="#AAM">AAM</A> <BR><A HREF="#AAS">AAS</A> <BR><A HREF="#ADC">ADC</A> <BR><A HREF="#ADD">ADD</A> <BR><A HREF="#AND">AND</A> <BR><A HREF="#CALL">CALL</A> <BR><A HREF="#CBW">CBW</A> <BR><A HREF="#CLC">CLC</A> <BR><A HREF="#CLD">CLD</A> <BR><A HREF="#CLI">CLI</A> <BR><A HREF="#CMC">CMC</A> <BR><A HREF="#CMP">CMP</A> <BR></TD><TD><A HREF="#CMPSB">CMPSB</A> <BR><A HREF="#CMPSW">CMPSW</A> <BR><A HREF="#CWD">CWD</A> <BR><A HREF="#DAA">DAA</A> <BR><A HREF="#DAS">DAS</A> <BR><A HREF="#DEC">DEC</A> <BR><A HREF="#DIV">DIV</A> <BR><A HREF="#HLT">HLT</A> <BR><A HREF="#IDIV">IDIV</A> <BR><A HREF="#IMUL">IMUL</A> <BR><A HREF="#IN">IN</A> <BR><A HREF="#INC">INC</A> <BR><A HREF="#INT">INT</A> <BR><A HREF="#INTO">INTO</A> <BR><A HREF="#IRET">IRET</A> <BR><A HREF="#JA">JA</A> <BR></TD><TD><A HREF="#JAE">JAE</A> <BR><A HREF="#JB">JB</A> <BR><A HREF="#JBE">JBE</A> <BR><A HREF="#JC">JC</A> <BR><A HREF="#JCXZ">JCXZ</A> <BR><A HREF="#JE">JE</A> <BR><A HREF="#JG">JG</A> <BR><A HREF="#JGE">JGE</A> <BR><A HREF="#JL">JL</A> <BR><A HREF="#JLE">JLE</A> <BR><A HREF="#JMP">JMP</A> <BR><A HREF="#JNA">JNA</A> <BR><A HREF="#JNAE">JNAE</A> <BR><A HREF="#JNB">JNB</A> <BR></TD><TD><A HREF="#JNBE">JNBE</A> <BR><A HREF="#JNC">JNC</A> <BR><A HREF="#JNE">JNE</A> <BR><A HREF="#JNG">JNG</A> <BR><A HREF="#JNGE">JNGE</A> <BR><A HREF="#JNL">JNL</A> <BR><A HREF="#JNLE">JNLE</A> <BR><A HREF="#JNO">JNO</A> <BR><A HREF="#JNP">JNP</A> <BR><A HREF="#JNS">JNS</A> <BR><A HREF="#JNZ">JNZ</A> <BR><A HREF="#JO">JO</A> <BR><A HREF="#JP">JP</A> <BR><A HREF="#JPE">JPE</A> <BR></TD><TD><A HREF="#JPO">JPO</A> <BR><A HREF="#JS">JS</A> <BR><A HREF="#JZ">JZ</A> <BR><A HREF="#LAHF">LAHF</A> <BR><A HREF="#LDS">LDS</A> <BR><A HREF="#LEA">LEA</A> <BR><A HREF="#LES">LES</A> <BR><A HREF="#LODSB">LODSB</A> <BR><A HREF="#LODSW">LODSW</A> <BR><A HREF="#LOOP">LOOP</A> <BR><A HREF="#LOOPE">LOOPE</A> <BR><A HREF="#LOOPNE">LOOPNE</A> <BR><A HREF="#LOOPNZ">LOOPNZ</A> <BR><A HREF="#LOOPZ">LOOPZ</A> <BR></TD><TD><A HREF="#MOV">MOV</A> <BR><A HREF="#MOVSB">MOVSB</A> <BR><A HREF="#MOVSW">MOVSW</A> <BR><A HREF="#MUL">MUL</A> <BR><A HREF="#NEG">NEG</A> <BR><A HREF="#NOP">NOP</A> <BR><A HREF="#NOT">NOT</A> <BR><A HREF="#OR">OR</A> <BR><A HREF="#OUT">OUT</A> <BR><A HREF="#POP">POP</A> <BR><A HREF="#POPA">POPA</A> <BR><A HREF="#POPF">POPF</A> <BR><A HREF="#PUSH">PUSH</A> <BR><A HREF="#PUSHA">PUSHA</A> <BR><A HREF="#PUSHF">PUSHF</A> <BR><A HREF="#RCL">RCL</A> <BR></TD><TD><A HREF="#RCR">RCR</A> <BR><A HREF="#REP">REP</A> <BR><A HREF="#REPE">REPE</A> <BR><A HREF="#REPNE">REPNE</A> <BR><A HREF="#REPNZ">REPNZ</A> <BR><A HREF="#REPZ">REPZ</A> <BR><A HREF="#RET">RET</A> <BR><A HREF="#RETF">RETF</A> <BR><A HREF="#ROL">ROL</A> <BR><A HREF="#ROR">ROR</A> <BR><A HREF="#SAHF">SAHF</A> <BR><A HREF="#SAL">SAL</A> <BR><A HREF="#SAR">SAR</A> <BR><A HREF="#SBB">SBB</A> <BR></TD><TD><A HREF="#SCASB">SCASB</A> <BR><A HREF="#SCASW">SCASW</A> <BR><A HREF="#SHL">SHL</A> <BR><A HREF="#SHR">SHR</A> <BR><A HREF="#STC">STC</A> <BR><A HREF="#STD">STD</A> <BR><A HREF="#STI">STI</A> <BR><A HREF="#STOSB">STOSB</A> <BR><A HREF="#STOSW">STOSW</A> <BR><A HREF="#SUB">SUB</A> <BR><A HREF="#TEST">TEST</A> <BR><A HREF="#XCHG">XCHG</A> <BR><A HREF="#XLATB">XLATB</A> <BR><A HREF="#XOR">XOR</A> <BR></TD></TR></TABLE></FONT><BR><BR><HR>Operand types:<BR><BR><B>REG</B>: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.<BR><BR><B>SREG</B>: DS, ES, SS, and only as second operand: CS.<BR><BR><B>memory</B>: [BX], [BX+SI+7], variable, etc...(see <A HREF="asm_tutorial_02.html"><B>Memory Access</B></A>).<BR><BR><B>immediate</B>: 5, -24, 3Fh, 10001101b, etc...<BR><BR><HR><BR>Notes:<BR><BR><UL><LI>When two operands are required for an instruction they are separated by comma. For example:<BR><BR> <FONT FACE="Fixedsys"> REG, memory </FONT> <BR><BR></LI><LI>When there are two operands, both operands must have the same size (except shift and rotate instructions). For example:<BR><BR> <FONT FACE="Fixedsys"> AL, DL<BR> DX, AX<BR> <FONT COLOR=#005555> m1 DB ?<BR> </FONT> AL, m1<BR> <FONT COLOR=#005555> m2 DW ?<BR> </FONT> AX, m2 </FONT> <BR><BR> </LI> <LI>Some instructions allow several operand combinations. For example:<BR><BR> <FONT FACE="Fixedsys"> memory, immediate<BR> REG, immediate<BR><BR> memory, REG<BR> REG, SREG </FONT><BR><BR> </LI> <LI>Some examples contain macros, so it is advisable to use <NOBR><B>Shift + F8</B></NOBR> hot key to <I>Step Over</I> (to make macro code execute at maximum speed set <B>step delay</B> to zero), otherwise emulator will step through each instruction of a macro. Here is an example that uses PRINTN macro: <PRE> <FONT FACE="Fixedsys"> #make_COM# include 'emu8086.inc' ORG 100h MOV AL, 1 MOV BL, 2 PRINTN 'Hello World!' ; macro. MOV CL, 3 PRINTN 'Welcome!' ; macro. RET</FONT></PRE> </LI></UL><BR><HR><BR><BR>These marks are used to show the state of the flags:<BR><BR><B>1</B> - instruction sets this flag to <B>1</B>.<BR><B>0</B> - instruction sets this flag to <B>0</B>.<BR><B>r</B> - flag value depends on result of the instruction.<BR><B>?</B> - flag value is undefined (maybe <B>1</B> or <B>0</B>).<BR><BR><BR><HR><BR><BR><B>Some instructions generate exactly the same machine code, so disassemblermay have a problem decoding to your original code. This is especiallyimportant for Conditional Jump instructions (see"<A HREF="asm_tutorial_07.html">Program Flow Control</A>"in Tutorials for more information).</B><BR><BR><BR><HR><BR><BR>Instructions in alphabetical order:<BR><BR><TABLE BORDER=1 WIDTH=100% CELLPADDING=10><TR><TD>Instruction</TD> <TD>Operands</TD> <TD>Description <A NAME="AAA"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">AAA</FONT></TD><TD>No operands</TD><TD>ASCII Adjust after Addition.<BR>Corrects result in AH and AL after additionwhen working with BCD values. <BR><BR> It works according to the following Algorithm:<BR><BR><FONT FACE="Fixedsys">if low nibble of AL > 9 or AF = 1 then:<BR><UL><LI>AL = AL + 6</LI><LI>AH = AH + 1</LI><LI>AF = 1</LI><LI>CF = 1</LI></UL>else<UL><LI>AF = 0</LI><LI>CF = 0</LI></UL>in both cases:<BR>clear the high nibble of AL.</FONT><BR><BR>Example:<PRE><FONT FACE="Fixedsys">MOV AX, 15 ; AH = 00, AL = 0FhAAA ; AH = 01, AL = 05RET</FONT></PRE><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <TD>C</TD> <TD>Z</TD> <TD>S</TD> <TD>O</TD> <TD>P</TD> <TD>A</TD> </TR><TR> <TD>r</TD> <TD>?</TD> <TD>?</TD> <TD>?</TD> <TD>?</TD> <TD>r</TD> </TR></TABLE></FONT> <A NAME="AAD"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">AAD</FONT></TD><TD>No operands</TD><TD>ASCII Adjust before Division.<BR>Prepares two BCD values for division. <BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys"><UL><LI>AL = (AH * 10) + AL</LI><LI>AH = 0</LI></UL></FONT><BR>Example:<PRE><FONT FACE="Fixedsys">MOV AX, 0105h ; AH = 01, AL = 05AAD ; AH = 00, AL = 0Fh (15)RET</FONT></PRE><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <TD>C</TD> <TD>Z</TD> <TD>S</TD> <TD>O</TD> <TD>P</TD> <TD>A</TD> </TR><TR> <TD>?</TD> <TD>r</TD> <TD>r</TD> <TD>?</TD> <TD>r</TD> <TD>?</TD> </TR></TABLE></FONT> <A NAME="AAM"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">AAM</FONT></TD><TD>No operands</TD><TD>ASCII Adjust after Multiplication.<BR>Corrects the result of multiplication of two BCD values. <BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys"><UL><LI>AH = AL / 10</LI><LI>AL = remainder</LI></UL></FONT><BR>Example:<PRE><FONT FACE="Fixedsys">MOV AL, 15 ; AL = 0FhAAM ; AH = 01, AL = 05RET</FONT></PRE><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <TD>C</TD> <TD>Z</TD> <TD>S</TD> <TD>O</TD> <TD>P</TD> <TD>A</TD> </TR><TR> <TD>?</TD> <TD>r</TD> <TD>r</TD> <TD>?</TD> <TD>r</TD> <TD>?</TD> </TR></TABLE></FONT> <A NAME="AAS"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">AAS</FONT></TD><TD>No operands</TD><TD>ASCII Adjust after Subtraction.<BR>Corrects result in AH and AL after subtractionwhen working with BCD values. <BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys">if low nibble of AL > 9 or AF = 1 then:<BR><UL><LI>AL = AL - 6</LI><LI>AH = AH - 1</LI><LI>AF = 1</LI><LI>CF = 1</LI></UL>else<UL><LI>AF = 0</LI><LI>CF = 0</LI></UL>in both cases:<BR>clear the high nibble of AL.</FONT><BR><BR>Example:<PRE><FONT FACE="Fixedsys">MOV AX, 02FFh ; AH = 02, AL = 0FFhAAS ; AH = 01, AL = 09RET</FONT></PRE><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <TD>C</TD> <TD>Z</TD> <TD>S</TD> <TD>O</TD> <TD>P</TD> <TD>A</TD> </TR><TR> <TD>r</TD> <TD>?</TD> <TD>?</TD> <TD>?</TD> <TD>?</TD> <TD>r</TD> </TR></TABLE></FONT> <A NAME="ADC"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">ADC</FONT></TD><TD><FONT FACE="Fixedsys"> <NOBR> REG, memory<BR> memory, REG<BR> REG, REG<BR> memory, immediate<BR> REG, immediate </NOBR></FONT></TD><TD>Add with Carry.<BR><BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys">operand1 = operand1 + operand2 + CF</FONT><BR><BR>Example:<PRE><FONT FACE="Fixedsys">STC ; set CF = 1MOV AL, 5 ; AL = 5ADC AL, 1 ; AL = 7RET</FONT></PRE><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <TD>C</TD> <TD>Z</TD> <TD>S</TD> <TD>O</TD> <TD>P</TD> <TD>A</TD> </TR><TR> <TD>r</TD> <TD>r</TD> <TD>r</TD> <TD>r</TD> <TD>r</TD> <TD>r</TD> </TR></TABLE></FONT> <A NAME="ADD"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">ADD</FONT></TD><TD><FONT FACE="Fixedsys"> <NOBR> REG, memory<BR> memory, REG<BR> REG, REG<BR> memory, immediate<BR> REG, immediate </NOBR></FONT></TD><TD>Add.<BR><BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys">operand1 = operand1 + operand2</FONT><BR><BR>Example:<PRE><FONT FACE="Fixedsys">MOV AL, 5 ; AL = 5ADD AL, -3 ; AL = 2RET</FONT></PRE><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <TD>C</TD> <TD>Z</TD> <TD>S</TD> <TD>O</TD> <TD>P</TD> <TD>A</TD> </TR><TR> <TD>r</TD> <TD>r</TD> <TD>r</TD> <TD>r</TD> <TD>r</TD> <TD>r</TD> </TR></TABLE></FONT> <A NAME="AND"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">AND</FONT></TD><TD><FONT FACE="Fixedsys"> <NOBR> REG, memory<BR> memory, REG<BR> REG, REG<BR> memory, immediate<BR> REG, immediate </NOBR></FONT></TD><TD>Logical AND between all bits of two operands. Result is stored in operand1.<BR><BR>These rules apply:<BR><BR><FONT FACE="Fixedsys">1 AND 1 = 1<BR>1 AND 0 = 0<BR>0 AND 1 = 0<BR>0 AND 0 = 0<BR></FONT><BR><BR>Example:<PRE><FONT FACE="Fixedsys">MOV AL, 'a' ; AL = 01100001bAND AL, 11011111b ; AL = 01000001b ('A')RET</FONT></PRE><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <TD>C</TD> <TD>Z</TD> <TD>S</TD> <TD>O</TD> <TD>P</TD> </TR><TR> <TD>0</TD> <TD>r</TD> <TD>r</TD> <TD>0</TD> <TD>r</TD> </TR></TABLE></FONT> <A NAME="CALL"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">CALL</FONT></TD><TD><FONT FACE="Fixedsys"> <NOBR> procedure name<BR> label<BR> 4-byte address<BR> </NOBR></FONT></TD><TD>Transfers control to procedure, return address is (IP) is pushed tostack. <I>4-byte address</I> may be entered in this form:<FONT FACE="Fixedsys">1234h:5678h</FONT>, first value is a segment secondvalue is an offset (this is a far call, so CS is also pushed to stack).<BR><BR><BR>Example:<PRE><FONT FACE="Fixedsys">#make_COM#ORG 100h ; for COM file.CALL p1ADD AX, 1RET ; return to OS.p1 PROC ; procedure declaration. MOV AX, 1234h RET ; return to caller.p1 ENDP</FONT></PRE><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <TD>C</TD> <TD>Z</TD> <TD>S</TD> <TD>O</TD> <TD>P</TD> <TD>A</TD> </TR><TR> <TD COLSPAN=6>unchanged</TD> </TR></TABLE></FONT> <A NAME="CBW"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">CBW</FONT></TD><TD>No operands</TD><TD>Convert byte into word. <BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys">if high bit of AL = 1 then:<UL><LI>AH = 255 (0FFh)</LI></UL><BR>else<UL><LI>AH = 0</LI></UL></FONT><BR>Example:<PRE><FONT FACE="Fixedsys">MOV AX, 0 ; AH = 0, AL = 0MOV AL, -5 ; AX = 000FBh (251)CBW ; AX = 0FFFBh (-5)RET</FONT></PRE><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <TD>C</TD> <TD>Z</TD> <TD>S</TD> <TD>O</TD> <TD>P</TD> <TD>A</TD> </TR><TR> <TD COLSPAN=6>unchanged</TD> </TR></TABLE></FONT> <A NAME="CLC"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">CLC</FONT></TD><TD>No operands</TD><TD>Clear Carry flag. <BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys">CF = 0</FONT><BR><BR><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <TD>C</TD> </TR><TR> <TD>0</TD> </TR></TABLE></FONT> <A NAME="CLD"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">CLD</FONT></TD><TD>No operands</TD><TD>Clear Direction flag. SI and DI will be incremented by chaininstructions: CMPSB, CMPSW, LODSB, LODSW, MOVSB, MOVSW, STOSB, STOSW. <BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys">DF = 0</FONT><BR><BR><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <TD>D</TD> </TR><TR> <TD>0</TD> </TR></TABLE></FONT> <A NAME="CLI"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">CLI</FONT></TD><TD>No operands</TD><TD>Clear Interrupt enable flag. This disables hardware interrupts. <BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys">IF = 0</FONT><BR><BR><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <TD>I</TD> </TR><TR> <TD>0</TD> </TR></TABLE></FONT> <A NAME="CMC"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">CMC</FONT></TD><TD>No operands</TD><TD>Complement Carry flag. Inverts value of CF. <BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys">if CF = 1 then CF = 0<BR>if CF = 0 then CF = 1<BR></FONT><BR><BR><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <TD>C</TD> </TR><TR> <TD>r</TD> </TR></TABLE></FONT> <A NAME="CMP"> </A></TD></TR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -