(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指令) |