x86汇编--(六)一些指令的小结

本文总结了x86汇编中的几种跳转指令,包括jmp near ptr、jmp short、loop、ret、retf、call及call far ptr的使用方式和执行流程,详细解释了它们如何改变程序的执行路径,特别是涉及内存地址和栈操作的部分。

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

offset 取得标号出的地址


jmp short 标号
对应机器指令没有包括目的地址,而是通过记录当前jmp指令结束位置到指定跳转位置的偏移地址,在编译程序的时候被算出
转移短指令:8位偏移最多向前跳转128,向后跳转127
jmp near ptr 标号
16位偏移
jmp far ptr 标号
对应指令包括了目的地址,
jmp word ptr 地址 内存单元地址 段内跳转
jmp dword ptr 地址 段间跳转,高16为表示段地址,低16位表示偏移地址

jcxz 有条件跳转指令 为短转移
cx=0的时候才进行跳转

loop 有条件跳转指令 为短转移
cx存放循环的次数


以下指令都是只涉及到位移,提高了程序的复用
如果超出跳转的最大限制,就会报错 jump destination too far by 1 byte(s)
jmp short 标号

jmp near ptr 标号

以下的程序说明了jmp short的执行方式

assume cs:codesg
codesg segment
	mov ax,4c00h
	int 21h
	
start:	mov ax,0
	s:	nop	;s2那边的指令拷贝到这里的时候,jmp s1编译后就变成了EBF6 跳到它前面10个字节处,到了程序开头 mov ax,4cooh那边
		nop
		
		mov di,offset s
		mov si,offset s2
		mov ax,cs:[si]
		mov cs:[di],ax
		
	s0:	jmp short s
	s1: mov ax,0
		int 21h
		mov ax,0
		
	s2:	jmp short s1 ;;这句会跳转到它当前位置往前几个字节
		nop
codesg ends
end start
jcxz 标号 表示有条件跳转,判断cx为0,就执行跳转,否则不跳转

loop 标号 先cx=cx-1 然后判断是否为0。如果不是0,则跳转,否则不跳转


ret 用栈中的数据修改IP的内容来进行近跳转

POP IP ((1)IP取得ss:sp的值(2)sp=sp+2)

retf 用栈的数据修改CS和IP的值

(1)pop IP (2) pop CS


call 指令

(1)把当前的IP或CS压入栈中

(2)jmp

不能实现短转移,和jmp类似

call far ptr 标号

PUSH CS

PUSH IP

JMP far ptr 标号

call word ptr ds:[0]相当于

PUSH IP

jmp cs:ip

call dword ptr ds:[0]相当于

PUSH CS

PUSH IP

jmp cs:ip


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值