学了这么多的指令,想必大家对于"Z"与"NZ"已经有所认识,许多指令都与ZF标志有关,比如条件转移指令JZ/JNZ,连指令前缀REP也可以加上Z与NZ写成REPZ(ZF为1则重复)和REPNZ(ZF为0则重复)。注意在我们已经学过的指令之中还有一个指令也可以加上Z与NZ,这个指令就是循环指令LOOP:
指令助记符 | 用途条件 | 其它形式 | |
JZ(Jump if Zero) | 结果为0则跳转 | ZF=1 | JE(Jump if Equal) |
JNZ(Jump if Not Zero) | 结果不为0则跳转 | ZF=0 | JNE(Jump if Not Equal) |
JS(Jump if Sign) | 结果为负则跳转 | SF=1 | |
JNS(Jump if Not Sign) | 结果为正则跳转 | SF=0 | |
JO(Jump if Overflow) | 有溢出则跳转 | OF=1 | |
JNO(Jump if Not Overflow) | 无溢出则跳转 | OF=0 | |
JP(Jump if Parity) | 奇偶位为1则跳转 | PF=1 | JPE(Jump if Parity Even) |
JNP(Jump if Not Parity) | 奇偶位为0则跳转 | PF=0 | JPO(Jump if Parity Odd) |
JB(Jump if Below) | 低于(不高于且不等于、进位标志为1)则跳转 | CF=1 | JC(Jump if Carry) JNAE(Jump if Not Above or Equal) |
JNB(Jump if Not Below) | 不低于(高于或等于、进位标志为0)则跳转 | CF=0 | JNC(Jump if Not Carry) JAE(Jump if Above or Equal) |
JBE(Jump if Below or Equal) | 低于或等于则跳转 | CF or ZF=1 | JNA(Jump if Not Above) |
JNBE(Jump if Not Below or Equal) | 不低于或等于(高于)则跳转 | CF or ZF=0 | JA(Jump if Above) |
JL(Jump if Less) | 小于则跳转 | SF xor OF=1 | JNGE(Jump if Not Great or Equal) |
JNL(Jump if Not Less) | 不小于则跳转 | SF xor OF=0 | JGE(Jump if Great or Equal) |
JLE(Jump if Less or Equal) | 小于或等于则跳转 | (SF xor OF)or ZF=1 | JNG(Jump if Not Great) |
JNLE(Jump if Not Less or Equal) | 不小于或不等于则跳转 | (SF xor OF)or ZF=0 | JG(Jump if Great) |
JCXZ(Jump if CX is Zreo) | 当CX寄存器为0时跳转 | CX=0 |
助记符:LOOPZ(Loop while Zero)
用 途:根据CX寄存器的值与ZF标志完成循环
格 式:LOOPZ 目的地址
执 行:若CX 0且ZF=1转移至目的地址继续执行,若CX=0或ZF=0则退出循
环,执行下面的指令
与这个指令相对的就是LOOPNZ,这两个指令与前面讨论过的LOOP指令有一个共同点,就是循环计数都要置入CX寄存器内,所不同的是LOOPZ/LOOPNZ还要判断ZF标志,只有ZF=1时LOOPZ才执行,反之当ZF=0时LOOPNZ执行。同REP指令前缀一样,LOOPZ/LOOPNZ有时也被写成LOOPE/LOOPNE,字母"E"同样表示"Equal"。
常用的算术运算指令我们都已经学过了,如加减乘除,增1减1,进位借位等,不过还有一个问题我们还没有讨论,就是带符号数的问题。当然了,首先需要指出的是在加减法运算中无需考虑这个问题,这是采用补码表示数带来的优点。而乘除法则例外,比如计算80H 2,采用MUL指令将得结果0100H,MUL指令将80H看作是无符号数128。如果我们需要计算的-128 2,就要采用带符号数的乘除指令--IMUL与IDIV:
助记符:IMUL(Signed Multiple)
用 途:计算两个带符号数相乘的结果
格 式:IMUL 寄存器
IMUL 存储单元
执 行:累加器与操作数相乘,16位的结果保存于AX寄存器中,32位结果保
存于DX-AX中。
带符号数的除法指令是"IDIV",这两个指令除了能处理符号之外其它方面与MUL/DIV相同,在此不再过多讨论。
基本的逻辑操作有四种,与(AND)、或(OR)、异或(XOR)和非(NOT)。前三种逻辑操作在前面的章节里已经学习过了,本章讨论的"非"操作可以说是四种逻辑操作中最简单的一种:
助记符:NOT(Not)
用 途:将操作数的各个位取反
格 式:NOT 寄存器
NOT 存储单元
执 行:指定的寄存器或存储单元中为1的位均变为0,为0的位均变为1