学习笔记分享之汇编---4. JCC&位运算

前言:
  此文章收录在本人的《学习笔记分享》分类中,此分类记录本人的学习心得体会,现全部分享出来希望和大家共同交流学习成长。附上分类链接:
  https://www.cnblogs.com/tibbors/category/1729804.html

学习内容:JCC

JCC就是有在前提条件的情况下执行JMP指令
  (其中J为JMP,CC指条件码)

  1. JMP指令:

    修改EIP的值
    MOV EIP,寄存器/立即数
    简写为 JMP 寄存器/立即数

  2. CALL指令:

    PUSH 地址B
    MOV EIP,地址A/寄存器
    简写为:CALL 地址A/寄存器

  3. RET指令:

    LEA ESP,[ESP+4]
    MOV EIP,[ESP-4]
    简写为:RET

    🞕 JCC指令:
      J : jmp     N : not

    指令 执行条件(语言描述) 执行条件 备注
    1 JE
    JZ
    结果为零则跳转
    结果相等时跳转
    ZF=1 jmp if zf=1
    (E:equal)(Z:zero)
    2 JNE
    JNZ
    结果不为零则跳转
    结果不相等时跳转
    ZF=0 jmp if zf=0
    (E:equal)(Z:zero)
    3 JS 结果为负则跳转 SF=1 jmp if sf=1
    (S:sign)
    4 JNS 结果为非负则跳转 SF=0 jmp if sf=0
    (S:sign)
    5 JP
    JPE
    结果中1的个数为偶数则跳转 PF=1 jmp if pf=1
    (P:parity(E:even))
    6 JNP
    JPO
    结果中1的个数为偶数则跳转 PF=0 jmp if pf=0
    (P:parity(O:odd))
    7 JO 结果溢出了则跳转 OF=1 jmp if of=1
    (O:overflow)
    8 JNO 结果没有溢出则跳转 OF=0 jmp if of=0
    (O:not overflow)
    9 JB
    JNAE
    小于则跳转 (无符号数)
    不高于则跳转
    CF=1 jmp if cf=1
    (B:bdlow)(AE:above equal)
    10 JNB
    JAE
    (无符号数)大于等于则跳转
    高于则跳转
    CF=0 jmp if cf=0
    (B:bdlow)(AE:above equal)
    11 JBE
    JNA
    (无符号数)小于等于则跳转
    不高于则跳转
    ZF=1
    CF=1
    jmp if zf=1/cf=1
    (B:below)(A:above)
    12 JNBE
    JA
    (无符号数)大于则跳转 ZF=0
    CF=0
    jmp if zf=0/cf=0
    (B:below)(A:above)
    13 JL
    JNGE
    (有符号数)小于则跳转 SF ≠ OF jmp if sf ≠ of
    (L:less)(GE:greater equal)
    14 JNL
    JGE
    (有符号数)大于等于则跳转 SF = OF jmp if sf = of
    (L:less)(GE:greater equal)
    15 JLE
    JNG
    (有符号数)小于等于则跳转 SF ≠ OF
    ZF = 1
    jmp if sf ≠ of or zf = 1
    (LE:less equal)(G:greater)
    16 JNLE
    JG
    (有符号数)大于则跳转 SF = OF
    & ZF = 0
    jmp if sf = of & zf = 0
    (LE:less equal)(G:greater)



学习内容:位运算

一、汇编中的移位指令

  1. 算术移位指令(用于有符号数)

    指令格式:SAL/SAR Reg/Mem, CL/Imm

    • SAL(Shift Arithmetic Left): 算术左移
    执行步骤:把左移多出来的一位写入CF中,后面补0

    算术左移

    SAL EAX,1
    SAL AX,1
    SAL AL,1
    

    e.g.
    1000 0001     0x81
    SAL AL,1
    0000 0010     0x02
    CF = 1
    算术左移(例)

    • SAR(Shift Arithmetic Right): 算术右移
    执行步骤:把右移多出来的一位写入CF中,前面补符号位

    算术右移

    SAR EAX,1
    SAR AX,1
    SAR AL,1
    

    e.g.
    1000 0001     0x81
    SAR AL,1
    1100 0000     0xC0
    CF = 1
    算术右移(例)


  2. 逻辑移位指令(用于无符号数)

    指令格式:SHL/SHR Reg/Mem, CL/Imm

    • SHL(Shift Left): 逻辑左移
    执行步骤:把左移多出来的一位写入CF中,后面补0(同算术左移)

    逻辑左移(同算术左移)

    SHL EAX,1
    SHL AX,1
    SHL AL,1
    

    e.g.
    1000 0001     0x81
    SHL AL,1
    0000 0010     0x02
    CF = 1
    逻辑左移(例)(同算数左移)

    • SHR(Shift Right):逻辑右移
    执行步骤:把右移多出来的一位写入CF中,前面补0

    逻辑右移

    SHR EAX,1
    SHR AX,1
    SHR AL,1
    

    e.g.
    1000 0001     0x81
    SHR AL,1
    0100 0000     0x40
    CF = 1
    逻辑右移(例)


  3. 循环移位指令

    指令格式:ROL r/m, i8 ROR r/m, CL

    • ROL(Rotate Left):循环左移
    执行步骤:把左移多出来的一位写入CF中,并补在后面

    循环左移

    ROL EAX,1
    ROL AX,1
    ROL AL,1
    

    e.g.
    1000 0001     0x81
    ROL AL,1
    0000 0011     0x03
    CF = 1
    循环左移(例)

    • ROR(Rotate Right):循环右移
    执行步骤:把右移多出来的一位写入CF中,并补在前面

    循环右移

    ROR EAX,1
    ROR AX,1
    ROR AL,1
    

    e.g.
    1000 0001     0x81
    ROR AL,1
    1100 0000     0xC0
    CF = 1
    循环右移(例)


  4. 带进位的循环移位指令

    指令格式:RCL r/m, i8 RCR r/m, CL

    • RCL(Rotate through Carry Left):带进位循环左移
    执行步骤:把CF中的数补在后面,把左移多出来的一位写入CF中

    带进位循环左移

    RCL EAX,1
    RCL AX,1
    RCL AL,1
    

    e.g.
    1000 0001     0x81
    设CF = 0
    RCL AL,1
    0000 0010     0x02
    CF=1
    带进位循环左移(例)

    • RCR(Rotate through Carry Right):带进位循环右移
    执行步骤:把CF中的数补在前面,把右移多出来的一位写入CF中

    带进位循环右移

    RCR EAX,1
    RCR AX,1
    RCR AL,1
    

    e.g.
    1000 0001     0x81
    设CF = 0
    RCR AL,1
    0100 0000     0x40
    CF = 1
    带进位循环右移(例)

二、C语言中的移位运算:

  1. 与运算 &

  2. 或运算 |

  3. 非运算 ~

  4. 异或运算 ^

  5. 移位运算 << >>

此部分详情在C语言中更新

posted @ 2020-04-19 11:43  Tibbors  阅读(613)  评论(0编辑  收藏  举报