学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

转自:http://www.cnblogs.com/del/archive/2010/04/16/1713886.html

http://pan.baidu.com/s/1gVTSi

跳转指令分三类:

一、无条件跳转:

JMP  ;无条件跳转

二、根据CX、ECX寄存器的值跳转:

JCXZ ;CX 为 0 则跳转
JECXZ;ECX 为 0 则跳转

三、根据 EFLAGS 寄存器 PSW 标志位 跳转, 这个太多了.

根据标志位跳转的指令:



JE   ;等于则跳转			同JZ
JNE  ;不等于则跳转		同JNZ

JA   ;无符号大于则跳转
JNA  ;无符号不大于则跳转
JAE  ;无符号大于等于则跳转		同JNB
JNAE ;无符号不大于等于则跳转	同JB

JB   ;无符号小于则跳转
JNB  ;无符号不小于则跳转
JBE  ;无符号小于等于则跳转		同JNA
JNBE ;无符号不小于等于则跳转	同JA

JG   ;有符号大于则跳转
JNG  ;有符号不大于则跳转
JGE  ;有符号大于等于则跳转		同JNL
JNGE ;有符号不大于等于则跳转	同JL

JL   ;有符号小于则跳转
JNL  ;有符号不小于则跳转
JLE  ;有符号小于等于则跳转		同JNG
JNLE ;有符号不小于等于则跳转	同JG

JZ   ;为零则跳转
JNZ  ;不为零则跳转

JS   ;为负则跳转
JNS  ;不为负则跳转

JC   ;进位则跳转
JNC  ;不进位则跳转

JO   ;溢出则跳转
JNO  ;不溢出则跳转

JP ;为偶则跳转
JNP  ;不为偶则跳转
JPE  ;奇偶位置位则跳转		同JP
JPO  ;奇偶位复位则跳转		同JNP
    
    
    
    

跳转相关的PSW标志位:
11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF   AF   PF   CF













影响标志位的汇编指令:

加法指令:ADD、ADC、INC、XADD
                  
                  除了INC不影响CF标志位外,都影响条件标志位。
                  CF、ZF、SF、OF
                  CF最高位是否有进位
                  DF若两个操作数符号相同而结果符号与之相反OF=1,否则OF=0.

减法指令:SUB、SBB、DEC、NEG、CMP、CMPXCHG、CMPXCHG8B
                  
                  前六种除了DEC不影响CF标志外都影响标志位。CMPXHG8B只影响ZF。
                  CF说明无符号数相减的溢出,同时又确实是被减数最高有效位向高位的借位。
                  OF位则说明带符号数的溢出
                  无符号运算时,若减数>被减数,有借位CF=1,否则CF=0.
                  OF若两个数符号相反,而结果的符号与减数相同则OF=1.否则OF=0.

乘法指令:MUL、IMUL
                  
                  MUL:如果乘积高一半为0,则CF和OF位均为0,否则CF和OF均为1.
                  IMUL:如果高一半是低一半符号的扩展,则CF位和OF位均为0,否则就均为1.

除法指令:DIV、IDIV
                  
                  对所有条件位均无定义。

逻辑指令:AND、OR、NOT、XOR、TEST
                  
                  NOT不影响标志位,其余4种CF、OF、置0,AF无定义,SF、ZF、PF位看情况而定。

定位扫描指令:BSF正向位扫描、BSR反向位扫描
                  
                  影响ZF位。


指令类型

助记符

对标志寄存器的影响

备注

ZF

CF

PF

SF

OF

AF

DF

IF

TF

 

 

 

 

 

数据传送类

通用

MOV

 

 

 

 

 

不影响标志位

 

交换

XCHG

 

堆栈操作

PUSH

 

POP

 

 

地址传送

LEA

 

LDS

 

LES

 

 

累加器专用

IN

 

OUT

 

XALT

 

 

标志寄存器

LAHF

 

SAHF

标志寄存器低八位的内容由AH的值决定

CF,AF,ZF,SF,PF的值会被影响

PUSHF

不影响标志位

 

POPF

标志寄存器的内容由装入的具体值决定

可能影响所有标志位

 

 

 

 

 

 

 

算术运算类

 

 

加法

ADD

 

 

 

 

ADC

 

 

 

 

INC

 

 

 

 

INC指令不影响CF

AAA

 

 

 

?表示不确定或者未定义

DAA

 

 

 

 

 

 

减法

SUB

 

 

 

 

SBB

 

 

 

 

DEC

 

 

 

 

DEC指令不影响CF

AAS

 

 

 

 

DAS

 

 

 

DAA指令不影响OF

 

乘法

MUL

 

 

 

 

IMUL

 

 

 

 

AAM

 

 

 

 

 

除法

DIV

 

此指令可能会产生中断,故影响IF,TF

IDIV

 

同上

AAD

 

 

 

 

符号位扩展

CBW

不影响标志位

 

CWD

不影响标志位

 

比较

CMP

由计算结果确定标志位的值

不会影响到DF,IF,TF

 

 

逻辑运算类

 

 

求反

NOT

不影响标志位

 

 

移位

SAL

 

 

 

 

OF标志位只在移位次数是1时有效

AF未定义

SHL

 

 

 

SAR

 

 

 

SHR

 

 

 

 

循环

移位

ROL

 

 

 

 

 

 

 

循环移位指令影响OF和CF

AF未定义

ROR

 

 

 

 

 

 

RCL

 

 

 

 

 

 

RCR

 

 

 

 

 

 

 

AND

置0

置0

 

 

 

 

 

OR

置0

置0

 

 

 

 

 

异或

XOR

置0

置0

 

 

 

 

 

检测

TSET

置0

置0

 

 

 

 

 

字符串操作

传送

MOVS

不影响标志位

 

比较

CMPS

由计算结果确定标志位的值

不会影响DF,IF,TF

搜索

SCAS

由计算结果确定标志位的值

不会影响DF,IF,TF

装入

LODS

不影响标志位

 

填充

STOS

不影响标志位

 

前缀

REP

不影响标志位

 

 

 

 

 

 

 

 

 

程序控制类

无条件转移

JMP

 

 

 

 

 

不影响标志位

 

 

 

 

 

单个

标志

JS/JNS

SF=1/0,则转移到目的地址

JZ/ JNZ

ZF=1/0,则转移到目的地址

JP/JNP

PF=1/0,则转移到目的地址

JB/JNB

CF=1/0,则转移到目的地址

JO/JNO

OF=1/0,则转移到目的地址

若干

标志

位的

逻辑

组合

JA

两个无符号数比较,A>B

JBE

两个无符号数比较,A <=B

JG

两个带符号数比较,A>B

JGE

两个带符号数比较,A>=B

JL

两个带符号数比较,A

JLE

两个带符号数比较,A <=B

 

 

循环控制

LOOP

 

 

不影响标志位

 

LOOPE

 

LOOPNE

 

JCXZ

 

JECXZ

 

 

中断控制

INT

不影响标志位

 

INTO

 

IRET

影响所有标志位

标志位到恢复中断以前的状态

 

 

 

CPU控制指令

 

 

 

标志位操作

CLC

 

 

 

 

 

 

 

 

此指令置CF=0

CMC

 

 

 

 

 

 

 

 

此指令CF取反

STC

 

 

 

 

 

 

 

 

此指令置CF=1

CLD

 

 

 

 

 

 

 

 

此指令置DF=0

STD

 

 

 

 

 

 

 

 

此指令置DF=1

CLI

 

 

 

 

 

 

 

 

此指令置IF=0

STI

 

 

 

 

 

 

 

 

此指令置IF=1

空操作

NOP

 

 

不影响标志位

 

暂停

HLT

 

等待

WAIT

 

交权

ESC

 

总线锁定前缀

LOCK

 




JMP 测试


; Test28_1.asm;
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    PrintText '1'
    jmp @F
    PrintText '2'
    PrintText '3'
@@: PrintText '4'
    ret
main endp
end main

;测试结果应该是:
;1
;4
;以下都应该是这样.

    
    
    
    

JE 测试
; Test28_2.asm;
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    PrintText '1'
    mov eax, 123
    cmp eax, 123
    je @F
    PrintText '2'
    PrintText '3'
@@: PrintText '4'
    ret
main endp
end main

    
    
    
    

JZ 测试
; Test28_3.asm;
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    PrintText '1'
    xor eax, eax
    jz @F
    PrintText '2'
    PrintText '3'
@@: PrintText '4'
    ret
main endp
end main

    
    
    
    

JS 测试
; Test28_4.asm;
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    PrintText '1'
    xor eax, eax
    dec eax
    js @F
    PrintText '2'
    PrintText '3'
@@: PrintText '4'
    ret
main endp
end main


    
    
    
    

JC 测试
; Test28_5.asm;
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    PrintText '1'
    mov al, 0FFh
    add al, 1
    jc @F
    PrintText '2'
    PrintText '3'
@@: PrintText '4'
    ret
main endp
end main

    
    
    
    

JO 测试
; Test28_6.asm;
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    PrintText '1'
    mov al, -128
    sub al, 1
    jo @F
    PrintText '2'
    PrintText '3'
@@: PrintText '4'
    ret
main endp
end main

    
    
    
    

JA 测试
; Test28_7.asm;
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    PrintText '1'
    mov eax, 22
    cmp eax, 11
    ja @F
    PrintText '2'
    PrintText '3'
@@: PrintText '4'
    ret
main endp
end main

    
    
    
    

JG 测试
; Test28_8.asm;
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    PrintText '1'
    mov eax, 1
    cmp eax, -1
    jg @F
    PrintText '2'
    PrintText '3'
@@: PrintText '4'
    ret
main endp
end main

    
    
    
    

JP 测试
; Test28_9.asm;
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    PrintText '1'
    mov al, 00001110b
    inc al
    jp @F
    PrintText '2'
    PrintText '3'
@@: PrintText '4'
    ret
main endp
end main

    
    
    
    

JECXZ 测试
; Test28_10.asm;
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.code
main proc
    PrintText '1'
    xor ecx, ecx
    jecxz @F
    PrintText '2'
    PrintText '3'
@@: PrintText '4'
    ret
main endp
end main

    
    
    
    

你可能感兴趣的:(Windows编程)