关于汇编语言中通过位移转移的指令

前言
在汇编语言中有一些指令在机器码中是通过位移来转移的,就比如说:jmp short指令、jmp near ptr指令、jcxz指令和loop指令,这些指令在机器码中给出的都不是地址,而是位移,我们要用IP值去加上这个位移才能得到新的IP值。

妙用:
一旦编译成功就不会改变机器码,所以可以通过复制一段转移指令的代码来实现一个固定位移的跳转。

汇编16中的经典示例:

assume cs:codesg
codesg segment

	mov ax, 4c00h
	int 21h	
	
start:	mov ax, 0	;只是凑三个字节的代码,不必理会
	s:	nop		;nop占一个字节,在之前文章有提及
		nop	
		
		mov di, offset s	;offset即取标号偏移地址,详情见之前文章
		mov si, offset s2
		mov ax, cs:[si]	;代码段中偏移地址为si处的机器码赋给寄存器ax
		mov cs:[di], ax	;把ax中的机器码赋给代码段中偏移地址为di处的内存
	s0:	jmp short s	;这是一个普通的跳转
	
	s1:	mov ax, 0	;凑字节的三行代码
		int 21h
		mov ax, 0
		
	s2:	jmp short s1	;机器码EBF6,即位移是-10,前面代码复制时也是复制的机器码
		nop

codesg ends
end start
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值