JCC

指令扩展

JMP

jmp 0040193F= mov eip,0040193F,只不过寄存器不允许直接mov的写法,意思一样

无条件修改寄存器EIP的数值,cpu会根据eip的值跳转,不影响堆栈的值

jmp 0040193F

image-20230419144653246

jmp只影响eip

image-20230419144925144

CALL

与retn配合使用

call会把当前cpu汇编指令的下一行地址压入栈里,执行完当前call指令以后跳转回去继续执行,压入的地址被称为返回地址,call指令会通过当前指令有多少字节的数据计算返回地址

image-20230419145902017

image-20230419150440100

RETN

相当于pop eip,但是寄存器不允许直接写pop eip

image-20230419151242870

CMP

相当于sub指令

eax=0x400

ecx=0x400

与sub指令区别就在于cmp指令只影响标志寄存器,不会修改eax,ebx两个寄存器的数值,cmp指令常常用于判断两个数值是否相等,根据zf位判断

image-20230419185943823

TEST

两个数值进行与操作,结果同样不保存,但是会改变相应标志寄存器

该指令尝尝用于判断某个寄存器的值是否为0

image-20230419190459316

JCC

JCC指令是x86汇编语言中的条件跳转指令,根据不同的条件码(CF、ZF、SF、OF等)来决定是否跳转,jcc指令就是有条件的jmp

JZ/JE

如果零标志位(ZF)为1,则跳转

在比较两个数的大小或检查某个数是否为0时,可以使用此指令,如果比较结果为0或者该变量的值为0,则执行跳转指令。

image-20230419211744951

JNZ/JNE

如果零标志位(ZF)为0,则跳转

用于判断数值是否非0,如果该变量的值不为0,则执行跳转指令。

image-20230419211904163

JS

如果符号标志位(SF)为1,则跳转

在处理有符号数据时,若一个数小于0,则SF置1,反之置0,可以利用此指令实现相关操作的条件判断。

image-20230419212037323

JNS

如果符号标志位(SF)为0,则跳转

用于判断有符号数据是否大于等于0。

image-20230419212338575

JC

如果进位标志位(CF)为1,则跳转

在校验数据的时候,如果发现了数据错误(例如加减溢出),就可以通过此指令中止程序执行,避免程序崩溃。

image-20230419212501886

JNC

如果进位标志位(CF)为0,则跳转

image-20230419212559012

JO

如果溢出标志位(OF)为1,则跳转

在进行加、减、乘等运算的时候发生溢出可以用此指令实现跳转。

image-20230419213135985

JNO

如果溢出标志位(OF)为0,则跳转

用于判断没有发生溢出时的操作。

image-20230419213235583

JP/JPE

如果奇偶标志位(PF)为1,则跳转

image-20230419213537361

JNP/JPO

如果奇偶标志位(PF)为0,则跳转

image-20230419213640410

JCXZ/JECXZ

如果CX寄存器为0,则跳转

image-20230419213809361

JA/JNBE

CF=0 and ZF=0

用于无符号数大小的判断,当指令后面的操作数无符号比较结果的值大于基准值时,执行跳转指令。

image-20230420091859294

JB/JANE

CF=1

用于无符号数大小比较,当指令后面的操作数比较结果的值小于基准值时,执行跳转指令。

image-20230420105703168

JAE/JNB

CF=0

JBE/JNA

CF=1 or ZF=1

JE

ZF=1

JG/JNLE

ZF=0 and SF=OF

JGE/JNL

SF=OF

JL/JNGE

SF!=OF

JLE/JNG

ZF=1 or SF!=OF