(1)条件语句被执行前需要进行两个步骤:首先,使用CMP,AND,SUB之类的指令修改CPU标志;其次,使用条件跳转指令测试标志值并导致向新地址的分支转移。
(2)Jcond指令
Jcond 目标地址
格式中的cond指的是一个标志条件.用来表示一个或多个标志的状态。
默认情况下,MASM要求跳转的目标在当前过程之内,为了突破这种限制,可以声明一个全局变量(变量后面跟“::”)。而且跳转目标和跳转指令的下一条指令之间的偏移地址差必须在-128到+127字节范围之内。这是因为当条件跳转指令被转换成机器指令时,目的操作数是用一个8位的偏移值来表示的。
(3)条件跳转指令
a) 根据特定的CPU标志值
助记符 |
描述 |
标志值 |
JZ |
为零则跳转 |
ZF=1 |
JNZ |
不为零则跳转 |
ZF=0 |
JC |
如果设置进位标志则跳转 |
CF=1 |
JNC |
如果未设置进位标志则跳转 |
CF=0 |
JO |
如果设置溢出标志则跳转 |
OF=1 |
JNO |
如果未设置溢出标志则跳转 |
OF=0 |
JS |
如果设置符号标志则跳转 |
SF=1 |
JNS |
如果未设置符号标志则跳转 |
SF=0 |
JP |
如果设置了奇偶标志则跳转(偶) |
PF=1 |
JNP |
如果未设置了奇偶标志则跳转(奇) |
PF=0 |
b) 根据操作数之间是否相等,或根据(E)CX的值:
下表列出了基于两个操作数是否相等或CX,ECX值是否为零的跳转指令。
CMP leftOp,rightOp
助记符 |
描述 |
JZ |
相等则跳转 |
JNZ |
不相等则跳转 |
JCXZ |
CX=0则跳转 |
JECXZ |
ECX=0则跳转 |
c) 基于无符号整数比较结果的跳转指令
助记符 |
描述 |
JA |
大于则跳转(leftOp>rightOp) |
JNBE |
不小于或相等则跳转(同JA指令) |
JAE |
大于或等于则跳转(leftOp>=rightOp) |
JNB |
不小于则跳转(同JEA指令) |
JB |
小于则跳转(leftOp<rightOp) |
JNAE |
不大于或者等于则跳转(同JB指令) |
JBE |
小于或等于则跳转(leftOp<=rightOp) |
JNA |
不大于则跳转(同JBE指令) |
d) 基于有符号整数比较的跳转指令
助记符 |
描述 |
JG |
大于则跳转(leftOp>rightOp) |
JNLE |
不小于或相等则跳转(同JG指令) |
JGE |
大于或等于则跳转(leftOp>=rightOp) |
JNL |
不小于则跳转(同JGE指令) |
JL |
小于则跳转(leftOp<rightOp) |
JNGE |
不大于或者等于则跳转(同JL指令) |
JLE |
小于或等于则跳转(leftOp<=rightOp) |
JNG |
不大于则跳转(同JLE指令) |