JCC指令
JMP:修改EIP的值
|
|
其指令相当于MOV EIP, [寄存器/立即数]
,但这个指令是非法的。
CALL:调用其他函数
|
|
CALL [地址A/寄存器]
指令相当于下方指令,但下方的指令是非法的。
|
|
与JMP
命令相同的是其修改了EIP
的值,但不同的是其会修改ESP
(栈顶)的值为调用点下一条指令的地址(返回地址)。
RET:返回
相当于:
|
|
JCC指令表
指令 | 含义 | 检查符号位 | 符号 | 条件 |
---|---|---|---|---|
JZ/JE | jump if Zero / jump if Equal | ZF = 1 | i == 0 / i == j |
若为0/相等时跳转 |
JNZ/JNE | jump if not zero / jump if Not Equal | ZF = 0 | i != j / i != 0 |
若为1/不相等时跳转 |
JS | jump if Sign | SF = 1 | i < 0 |
若为负时跳转 |
JNS | jump if Not sign | SF = 0 | i > 0 |
若为正时跳转 |
JP/JPE | jump if Parity(Even) | PF = 1 | 若中1的个数为偶数则跳转 | |
JNP/JPO | jump if Not Parity(Odd) | PF = 0 | 若中1的个数为奇数则跳转 | |
JO | jump if Overflow | OF = 1 | 若溢出则跳转 | |
JNO | jump if Not Overflow | OF = 0 | 若无溢出则跳转 | |
JC/JB/JNAE | jump if Carry / Below / Not Above Equal | CF = 1 | i < j |
(无符号)若进位/低于/不高于等于则跳转 |
JNC/JNB/JAE | jump if Not Carry / Not Below / Above Equal | CF = 1 | i >= j |
(无符号)若无进位/不低于/高于等于则跳转 |
JBE/JNA | jump if Below Equal / Not Above | ZF / CF = 1 | i <= j |
(无符号)若低于等于则跳转;若不高于则跳转 |
JNBE/JA | jump if Not Below Equal / Above | ZF / CF = 0 | i > j |
(无符号)若不低于等于则跳转;若高于则跳转 |
JL/JNGE | jump if Less / Not Greater Equal | SF != OF | si < sj |
(有符号)若小于则跳转;若不大于等于则跳转 |
JNL/JGE | jump if Not Less / Greater Equal | SF == OF | si >= sj |
(有符号)若不小于则跳转;若大于等于则跳转 |
JLE/JNG | jump if Less Equal / Not Greater | ZF != OF || ZF == 1 | si <= sj |
(有符号)若小于等于则跳转;若不大于则跳转 |
JNLE/JG | jump if Less Equal / Not Greater | SF = OF && ZF == 0 | si > sj |
(有符号)若不小于等于则跳转;若大于则跳转 |
比较指令
CMP指令
指令格式:CMP R/M, R/M/IMM
,参数不可同时为内存。
该指令用于比较两个操作数,它相当于SUB
指令,但是相减的结果并不保存到第一个操作数中,且改变相应标志位。
|
|
运行上方指令后,ZF(零标志位)为1。
TEST指令
指令格式:TEST R/M, R/M/IMM
,参数不可同时为内存。
该指令相当于AND
指令,但是相减的结果并不保存到第一个操作数中,且改变相应标志位。
这个指令常用于测试某个寄存器是否为0。
|
|
运行上方指令后,观察ZF(零标志位),当EAX
值为0时,ZF为1。