📄 8086_instruction_set.html
字号:
<TR><TD><FONT FACE="Fixedsys">CMP</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>Compare.<BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys">operand1 - operand2<BR><BR>result is not stored anywhere, flags are set (OF, SF, ZF, AF, PF, CF) accordingto result.</FONT><BR><BR>Example:<PRE><FONT FACE="Fixedsys">MOV AL, 5MOV BL, 5CMP AL, BL ; AL = 5, ZF = 1 (so equal!)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>r</TD> <TD>r</TD> <TD>r</TD> <TD>r</TD> <TD>r</TD> <TD>r</TD> </TR></TABLE></FONT> <A NAME="CMPSB"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">CMPSB</FONT></TD><TD>No operands</TD><TD>Compare bytes: <NOBR>ES:[DI] from DS:[SI].</NOBR> <BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys"><UL><LI>DS:[SI] - ES:[DI]<BR></LI><LI>set flags according to result:<BR> OF, SF, ZF, AF, PF, CF<BR></LI><LI>if DF = 0 then <UL> <LI>SI = SI + 1</LI> <LI>DI = DI + 1</LI> </UL> else <UL> <LI>SI = SI - 1</LI> <LI>DI = DI - 1</LI> </UL></LI></UL></FONT>Example:<BR>see <B><A HREF="../Samples/cmpsb.asm">cmpsb.asm</A></B> in Samples.<BR><BR><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="CMPSW"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">CMPSW</FONT></TD><TD>No operands</TD><TD>Compare words: <NOBR>ES:[DI] from DS:[SI].</NOBR> <BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys"><UL><LI>DS:[SI] - ES:[DI]<BR></LI><LI>set flags according to result:<BR> OF, SF, ZF, AF, PF, CF<BR></LI><LI>if DF = 0 then <UL> <LI>SI = SI + 2</LI> <LI>DI = DI + 2</LI> </UL> else <UL> <LI>SI = SI - 2</LI> <LI>DI = DI - 2</LI> </UL></LI></UL></FONT>Example:<BR>see <B><A HREF="../Samples/cmpsw.asm">cmpsw.asm</A></B> in Samples.<BR><BR><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="CWD"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">CWD</FONT></TD><TD>No operands</TD><TD>Convert Word to Double word. <BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys">if high bit of AX = 1 then:<UL><LI>DX = 65535 (0FFFFh)</LI></UL><BR>else<UL><LI>DX = 0</LI></UL></FONT><BR>Example:<PRE><FONT FACE="Fixedsys">MOV DX, 0 ; DX = 0MOV AX, 0 ; AX = 0MOV AX, -5 ; DX AX = 00000h:0FFFBhCWD ; DX AX = 0FFFFh:0FFFBhRET</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="DAA"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">DAA</FONT></TD><TD>No operands</TD><TD>Decimal adjust After Addition.<BR>Corrects the result of addition of two packed 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>AF = 1</LI></UL>if AL > 9Fh or CF = 1 then:<UL><LI>AL = AL + 60h</LI><LI>CF = 1</LI></UL></FONT><BR>Example:<PRE><FONT FACE="Fixedsys">MOV AL, 0Fh ; AL = 0Fh (15)DAA ; AL = 15hRET</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="DAS"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">DAS</FONT></TD><TD>No operands</TD><TD>Decimal adjust After Subtraction.<BR>Corrects the result of subtraction of two packed 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>AF = 1</LI></UL>if AL > 9Fh or CF = 1 then:<UL><LI>AL = AL - 60h</LI><LI>CF = 1</LI></UL></FONT><BR>Example:<PRE><FONT FACE="Fixedsys">MOV AL, 0FFh ; AL = 0FFh (-1)DAS ; AL = 99h, CF = 1RET</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="DEC"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">DEC</FONT></TD><TD><FONT FACE="Fixedsys"> <NOBR> REG<BR> memory<BR> </NOBR></FONT></TD><TD>Decrement.<BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys">operand = operand - 1<BR><BR></FONT><BR>Example:<PRE><FONT FACE="Fixedsys">MOV AL, 255 ; AL = 0FFh (255 or -1)DEC AL ; AL = 0FEh (254 or -2)RET</FONT></PRE><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <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> </TR></TABLE>CF - unchanged!</FONT> <A NAME="DIV"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">DIV</FONT></TD><TD><FONT FACE="Fixedsys"> <NOBR> REG<BR> memory<BR> </NOBR></FONT></TD><TD>Unsigned divide.<BR><BR>Algorithm:<BR><BR> <BLOCKQUOTE> when operand is a <B>byte</B>:<BR> <FONT FACE="Fixedsys">AL = AX / operand<BR> AH = remainder (modulus) </FONT> </BLOCKQUOTE> <BLOCKQUOTE> when operand is a <B>word</B>:<BR> <FONT FACE="Fixedsys">AX = (DX AX) / operand<BR> DX = remainder (modulus) </FONT> </BLOCKQUOTE> Example:<PRE><FONT FACE="Fixedsys">MOV AX, 203 ; AX = 00CBhMOV BL, 4DIV BL ; AL = 50 (32h), AH = 3RET</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>?</TD> <TD>?</TD> <TD>?</TD> <TD>?</TD> <TD>?</TD> </TR></TABLE></FONT> <A NAME="HLT"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">HLT</FONT></TD><TD>No operands</TD><TD>Halt the System.<BR><BR> Example:<PRE><FONT FACE="Fixedsys">MOV AX, 5HLT</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="IDIV"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">IDIV</FONT></TD><TD><FONT FACE="Fixedsys"> <NOBR> REG<BR> memory<BR> </NOBR></FONT></TD><TD>Signed divide.<BR><BR>Algorithm:<BR><BR> <BLOCKQUOTE> when operand is a <B>byte</B>:<BR> <FONT FACE="Fixedsys">AL = AX / operand<BR> AH = remainder (modulus) </FONT> </BLOCKQUOTE> <BLOCKQUOTE> when operand is a <B>word</B>:<BR> <FONT FACE="Fixedsys">AX = (DX AX) / operand<BR> DX = remainder (modulus) </FONT> </BLOCKQUOTE> Example:<PRE><FONT FACE="Fixedsys">MOV AX, -203 ; AX = 0FF35hMOV BL, 4IDIV BL ; AL = -50 (0CEh), AH = -3 (0FDh)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>?</TD> <TD>?</TD> <TD>?</TD> <TD>?</TD> <TD>?</TD> </TR></TABLE></FONT> <A NAME="IMUL"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">IMUL</FONT></TD><TD><FONT FACE="Fixedsys"> <NOBR> REG<BR> memory<BR> </NOBR></FONT></TD><TD>Signed multiply.<BR><BR>Algorithm:<BR><BR> <BLOCKQUOTE> when operand is a <B>byte</B>:<BR> <FONT FACE="Fixedsys">AX = AL * operand</FONT>. </BLOCKQUOTE> <BLOCKQUOTE> when operand is a <B>word</B>:<BR> <FONT FACE="Fixedsys">(DX AX) = AX * operand</FONT>. </BLOCKQUOTE> Example:<PRE><FONT FACE="Fixedsys">MOV AL, -2MOV BL, -4IMUL BL ; AX = 8RET</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>r</TD> <TD>?</TD> <TD>?</TD> </TR></TABLE>CF=OF=0 when result fits into operand of IMUL.</FONT> <A NAME="IN"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">IN</FONT></TD><TD><FONT FACE="Fixedsys"> <NOBR> AL, im.byte<BR> AL, DX<BR> AX, im.byte<BR> AX, DX </NOBR></FONT></TD><TD>Input from port into <B>AL</B> or <B>AX</B>.<BR>Second operand is a port number. If required to accessport number over 255 - <B>DX</B> register should be used.<BR>Example:<PRE><FONT FACE="Fixedsys">IN AX, 4 ; get status of traffic lights.IN AL, 7 ; get status of stepper-motor.</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="INC"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">INC</FONT></TD><TD><FONT FACE="Fixedsys"> <NOBR> REG<BR> memory<BR> </NOBR></FONT></TD><TD>Increment.<BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys">operand = operand + 1<BR></FONT><BR>Example:<PRE><FONT FACE="Fixedsys">MOV AL, 4INC AL ; AL = 5RET</FONT></PRE><FONT FACE="Fixedsys"><TABLE BORDER=1 NOSHADE><TR> <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> </TR></TABLE>CF - unchanged!</FONT> <A NAME="INT"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">INT</FONT></TD><TD><FONT FACE="Fixedsys"> <NOBR>immediate byte</NOBR></FONT></TD><TD>Interrupt numbered by immediate byte (0..255).<BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys"><UL> Push to stack: <UL> <LI>flags register</LI> <LI>CS</LI> <LI>IP</LI> </UL> <LI>IF = 0</LI> <LI>Transfer control to interrupt procedure</LI></UL></FONT><BR>Example:<PRE><FONT FACE="Fixedsys">MOV AH, 0Eh ; teletype.MOV AL, 'A'INT 10h ; BIOS interrupt.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> <TD>I</TD> </TR><TR> <TD COLSPAN=6>unchanged</TD> <TD>0</TD></TR></TABLE></FONT> <A NAME="INTO"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">INTO</FONT></TD><TD>No operands</TD><TD>Interrupt 4 if Overflow flag is 1.<BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys">if OF = 1 then INT 4<BR></FONT><BR>Example:<PRE><FONT FACE="Fixedsys">; -5 - 127 = -132 (not in -128..127); the result of SUB is wrong (124),; so OF = 1 is set:MOV AL, -5SUB AL, 127 ; AL = 7Ch (124)INTO ; process error.RET</FONT></PRE> <A NAME="IRET"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">IRET</FONT></TD><TD>No operands</TD><TD>Interrupt Return.<BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys"><UL> Pop from stack: <UL> <LI>IP</LI> <LI>CS</LI> <LI>flags register</LI> </UL></UL></FONT><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><CENTER>popped</CENTER></TD> </TR></TABLE></FONT> <A NAME="JA"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">JA</FONT></TD><TD><FONT FACE="Fixedsys"> <NOBR>label</NOBR></FONT></TD><TD>Short Jump if first operand is Above second operand (as set by CMP instruction).Unsigned.<BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys"><UL> if (CF = 0) and (ZF = 0) then jump</UL></FONT>Example:<PRE><FONT FACE="Fixedsys"> include 'emu8086.inc' #make_COM# ORG 100h MOV AL, 250 CMP AL, 5 JA label1 PRINT 'AL is not above 5' JMP exitlabel1: PRINT 'AL is above 5'exit: 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="JAE"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">JAE</FONT></TD><TD><FONT FACE="Fixedsys"> <NOBR>label</NOBR></FONT></TD><TD>Short Jump if first operand is Above or Equal to second operand (as set by CMP instruction).Unsigned.<BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys"><UL> if CF = 0 then jump</UL></FONT>Example:<PRE><FONT FACE="Fixedsys"> include 'emu8086.inc' #make_COM# ORG 100h MOV AL, 5 CMP AL, 5 JAE label1 PRINT 'AL is not above or equal to 5' JMP exitlabel1: PRINT 'AL is above or equal to 5'exit: 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="JB"> </A></TD></TR><TR><TD><FONT FACE="Fixedsys">JB</FONT></TD><TD><FONT FACE="Fixedsys"> <NOBR>label</NOBR></FONT></TD><TD>Short Jump if first operand is Below second operand (as set by CMP instruction).Unsigned.<BR><BR>Algorithm:<BR><BR><FONT FACE="Fixedsys"><UL> if CF = 1 then jump</UL></FONT>Example:<PRE><FONT FACE="Fixedsys"> include 'emu8086.inc' #make_COM# ORG 100h MOV AL, 1 CMP AL, 5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -