跳转指令分三类:
一、无条件跳转: JMP;二、根据 CX、ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转)、JECXZ(ECX 为 0 则跳转);三、根据 EFLAGS 寄存器的标志位跳转, 这个太多了.根据标志位跳转的指令:JE ;等于则跳转JNE ;不等于则跳转JZ ;为 0 则跳转JNZ ;不为 0 则跳转JS ;为负则跳转JNS ;不为负则跳转JC ;进位则跳转JNC ;不进位则跳转JO ;溢出则跳转JNO ;不溢出则跳转JA ;无符号大于则跳转JNA ;无符号不大于则跳转JAE ;无符号大于等于则跳转JNAE ;无符号不大于等于则跳转JG ;有符号大于则跳转JNG ;有符号不大于则跳转JGE ;有符号大于等于则跳转JNGE ;有符号不大于等于则跳转JB ;无符号小于则跳转JNB ;无符号不小于则跳转JBE ;无符号小于等于则跳转JNBE ;无符号不小于等于则跳转JL ;有符号小于则跳转JNL ;有符号不小于则跳转JLE ;有符号小于等于则跳转JNLE ;有符号不小于等于则跳转JP ;奇偶位置位则跳转JNP ;奇偶位清除则跳转JPE ;奇偶位相等则跳转JPO ;奇偶位不等则跳转
跳转相关的标志位:
11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|
OF | DF | IF | TF | SF | ZF | AF | PF | CF | |||
溢出 | 符号 | 零 | 未用 | 辅助 | 未用 | 奇偶 | 未用 | 进位 |
JMP 测试
; Test28_1.asm;.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc PrintText '1' jmp @F PrintText '2' PrintText '3'@@: PrintText '4' retmain endpend main;测试结果应该是:;1;4;以下都应该是这样.
JE 测试
; Test28_2.asm;.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc PrintText '1' mov eax, 123 cmp eax, 123 je @F PrintText '2' PrintText '3'@@: PrintText '4' retmain endpend main
JZ 测试
; Test28_3.asm;.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc PrintText '1' xor eax, eax jz @F PrintText '2' PrintText '3'@@: PrintText '4' retmain endpend main
JS 测试
; Test28_4.asm;.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc PrintText '1' xor eax, eax dec eax js @F PrintText '2' PrintText '3'@@: PrintText '4' retmain endpend main
JC 测试
; Test28_5.asm;.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc PrintText '1' mov al, 0FFh add al, 1 jc @F PrintText '2' PrintText '3'@@: PrintText '4' retmain endpend main
JO 测试
; Test28_6.asm;.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc PrintText '1' mov al, -128 sub al, 1 jo @F PrintText '2' PrintText '3'@@: PrintText '4' retmain endpend main
JA 测试
; Test28_7.asm;.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc PrintText '1' mov eax, 22 cmp eax, 11 ja @F PrintText '2' PrintText '3'@@: PrintText '4' retmain endpend main
JG 测试
; Test28_8.asm;.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc PrintText '1' mov eax, 1 cmp eax, -1 jg @F PrintText '2' PrintText '3'@@: PrintText '4' retmain endpend main
JP 测试
; Test28_9.asm;.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc PrintText '1' mov al, 00001110b inc al jp @F PrintText '2' PrintText '3'@@: PrintText '4' retmain endpend main
JECXZ 测试
; Test28_10.asm;.386.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.codemain proc PrintText '1' xor ecx, ecx jecxz @F PrintText '2' PrintText '3'@@: PrintText '4' retmain endpend main