汇编基础-JMP,CALL,JCC

本文详细介绍了汇编语言中的JMP、CALL、RET指令及其区别,JMP用于修改EIP而不会影响堆栈,CALL不仅修改EIP还会保存返回地址。RET用于从函数调用中返回。CMP指令用于比较操作数并更新标志寄存器,而TEST指令进行按位与操作,常用于判断寄存器是否为0。JCC指令则根据标志寄存器状态决定是否跳转,是条件判断的关键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

汇编基础-JMP,JCC

JMP指令

JMP指令:修改EIP的值

JMP指令只影响了EIP,不影响堆栈和其它通用寄存器

JMP 寄存器/立即数 相当于 MOV EIP,寄存器/立即数

CALL指令

CALL指令和JMP指令都会修改EIP的值

但CALL指令会将返回地址(CALL指令的下一条指令地址)压入堆栈

因此也会引起esp的变化

RET指令

call调用跳转后执行完相关代码完要返回到call的下一条指令时使用ret指令

ret指令相当于pop eip(但是不能这么写)

CMP指令

指令格式:CMP R/M,R/M/IMM

CMP指令只改变标志寄存器的值

该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结果并不保存到第一个操作数中

只是根据相减的结果来改变ZF零标志位的,当两个操作数相等的时候,零标志位置1;
当第一个数小于第二个数时,SF标志位置1.

TEST指令

指令格式:TEST R/M,R/M/IMM

该指令在一定程度上和CMP指令时类似的,两个数值进行与操作,结果不保存,但是会改变相应标志位

可以看到只要有任一操作数为0时,结果就为0

常见用法:用这个指令,可以确定某寄存器是否等于0

只有当eax=0时 eax and eax才会是0

所以

TEST EAX,EAX

观察ZF(零标志位)就可以判断EAX是否为0

JCC指令

根本上是否跳转是由各标志寄存器决定的,为了帮助理解,可以看做是根据两个操作数做cmp运算的结果来跳转。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值