zoukankan      html  css  js  c++  java
  • win32 寄存器

    跳转指令分三类:

    一、无条件跳转:

    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标志位:
    11109876543210
    OFDFIFTFSFZF 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<B

    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
  • 相关阅读:
    ES 入门记录之 match和term查询的区别
    ElasticSearch 学习记录之Text keyword 两种基本类型区别
    ES 记录之如何创建一个索引映射,以及一些设置
    娱乐至死 读书笔记
    ES 入门之一 安装ElasticSearcha
    王二的经济学故事 读书笔记
    redis特性 存储 API 集群 等
    Linux 卸载 openjdk
    Linux 下面解压.tar.gz 和.gz文件解压的方式
    本地连接 vmware服务器
  • 原文地址:https://www.cnblogs.com/weekbo/p/10170715.html
Copyright © 2011-2022 走看看