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 |