JCC
JCC
EIP的值决定cpu即将执行的指令
JMP指令
JMP指令
直接修改EIP
MOV EIP,R/IMM
;以上指令功能由JMP表示为
JMP R/IMM
CALL指令
跳转前将下一指令的地址压入栈
PUSH M1
MOV EIP,M2/R
;以上指令功能由CALL表示为
CALL M2/R
RET指令
与CALL指令相匹配,将EIP修改为栈顶所存地址
LEA ESP,[ESP+4]
MOV EIP,[ESP-4]
;简写为
RET
比较指令
CMP指令
该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结构并不保存到第一个操作数中
只是根据相减的结果来改变零标志位的,当两个操作数相等的时候,零标志位置1
格式:
CMP R/M,R/M/IMM ;数据宽度相同,两边不同时为内存
例:
MOV EAX,0x100
MOV ECX,0x100
CMP EAX,ECX ;观察Z位
MOV EAX,0x100
MOV ECX,0x200
CMP EAX,ECX ;观察S位,不相同时根据S位判断大小关系
TEST指令
该指令在一定程序上和CMP指令时类似的,两个数值进行与操作,结果不保存,但是会改变相应标志位
常用来确定某个寄存器是否等于0
格式:
TEST R/M,R/M/IMM
例:
TEST EAX,EAX ;观察Z位
JCC
序号 | 指令 | 描述 | 英文原意 | 标志 |
---|---|---|---|---|
1 | JE JZ |
结果为零则跳转(相等时跳转) | jump if zero jump if equal |
ZF=1 |
2 | JNE JNZ |
结果不为零则跳转(不相等时跳转) | jump if not zero jump if not equal |
ZF=0 |
3 | JS | 结果为负则跳转 | jump if sign | SF=1 |
4 | JNS | 结果为非负则跳转 | jump if not sign | SF=0 |
5 | JP JPE |
结果中1的个数为偶数则跳转 | jump if parity(even) | PF=1 |
6 | JNP JPO |
结果中1的个数为奇数则跳转 | jump if not parity(odd) | PF=1 |
7 | JO | 结果溢出了则跳转 | jump if overflow | OF=1 |
8 | JNO | 结果没有溢出则跳转 | jump if not overflow | OF=0 |
9 | JC JB JNAE |
小于则跳转(无符号数) | jump if carry jump if below jump if not above equal |
CF=1 |
10 | JNC JNB JAE |
大于等于则跳转(无符号数) | jump if not carry jump if not below jump if above equal |
CF=0 |
11 | JBE JNA |
小于等于则跳转(无符号数) | jump if below equal jump if not above |
CF=1 or ZF=1 |
12 | JNBE JA |
大于则跳转(无符号数) | jump if not below equal jump if above |
CF=0 and ZF=0 |
13 | JL JNGE |
小于则跳转(有符号数) | jump if less jump if not greater equal |
SF≠OF |
14 | JNL JGE |
大于等于则跳转(有符号数) | jump if not less jump if greater equal |
SF=OF |
15 | JLE JNG |
小于等于则跳转(有符号数) | jump if less equal jump if not greater |
ZF=1 or SF≠OF |
16 | JNLE JG |
大于则跳转(有符号数) | jump if not less equal jump if greater |
ZF=0 and SF=OF |