学习笔记分享之汇编---4. JCC&位运算
前言:
此文章收录在本人的《学习笔记分享》分类中,此分类记录本人的学习心得体会,现全部分享出来希望和大家共同交流学习成长。附上分类链接:
https://www.cnblogs.com/tibbors/category/1729804.html
学习内容:JCC
JCC就是有在前提条件的情况下执行JMP指令
(其中J为JMP,CC指条件码)
-
JMP指令:
修改EIP的值
MOV EIP,寄存器/立即数
简写为 JMP 寄存器/立即数
-
CALL指令:
PUSH 地址B
MOV EIP,地址A/寄存器
简写为:CALL 地址A/寄存器
-
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=1jmp if zf=1/cf=1
(B:below)(A:above)12 JNBE
JA(无符号数)大于则跳转 ZF=0
CF=0jmp 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 = 1jmp if sf ≠ of or zf = 1
(LE:less equal)(G:greater)16 JNLE
JG(有符号数)大于则跳转 SF = OF
& ZF = 0jmp if sf = of & zf = 0
(LE:less equal)(G:greater)
学习内容:位运算
一、汇编中的移位指令
-
算术移位指令(用于有符号数)
指令格式:SAL/SAR Reg/Mem, CL/Imm
- SAL(Shift Arithmetic Left): 算术左移
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): 算术右移
SAR EAX,1 SAR AX,1 SAR AL,1
e.g.
1000 0001 0x81
SAR AL,1
1100 0000 0xC0
CF = 1
-
逻辑移位指令(用于无符号数)
指令格式:SHL/SHR Reg/Mem, CL/Imm
- SHL(Shift Left): 逻辑左移
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):逻辑右移
SHR EAX,1 SHR AX,1 SHR AL,1
e.g.
1000 0001 0x81
SHR AL,1
0100 0000 0x40
CF = 1
-
循环移位指令
指令格式:ROL r/m, i8 ROR r/m, CL
- ROL(Rotate Left):循环左移
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):循环右移
ROR EAX,1 ROR AX,1 ROR AL,1
e.g.
1000 0001 0x81
ROR AL,1
1100 0000 0xC0
CF = 1
-
带进位的循环移位指令
指令格式:RCL r/m, i8 RCR r/m, CL
- RCL(Rotate through Carry Left):带进位循环左移
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):带进位循环右移
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语言中的移位运算:
-
与运算 &
-
或运算 |
-
非运算 ~
-
异或运算 ^
-
移位运算 << >>
此部分详情在C语言中更新