小结:实验8 分析一个奇怪的程序

<pre name="code" class="plain">	assume cs:code
	code segment
0H		mov ax, 4c00H
3H		int 21H
	start:
5H		mov ax, 0
	s:
8H		nop
		nop
aH		mov di, offset s	;di=0005H
		mov si, offset s2	;si=0020H
		;cs:[si]指向cs:0020H,所以s2标号下的jmp shorts1指令(大小刚好一个字)被拷贝到ax中
		mov ax, cs:[si]		
		;cs:[di]指向cs:0005H,所以ax中的值被拷贝到s标号开头的一个字单元,即jmp short ;s1被拷到了s开头处,取代了两个nop指令
		mov cs:[di], ax		
	s0:
		;编译器计算跳转的偏移值是用标号的偏移-下一条指令的偏移,
		;此处即8H-18H=-10H,所以编译后为jmp -10H,
		;当执行jmp -10H时,ip=ip+(-10H),
		;此处就是ip=18H+(-10H)=8H,就跳转到了s处了
16H		jmp short s
	s1:
18H		mov ax, 0
		int 21H
		mov ax, 0
	s2:
		;标号偏移-下一条指令偏移=18H-22H=-aH
		;此处编译后为jmp -aH,
		;由于s0处跳转到了s处所以这段代码在s处执行,
		;在s处执行jmp -aH时,ip=ip+(-aH)=aH+(-aH)=0H,所以跳转到了cs:0000H处,程序成功退出
20H		jmp short s1
22H		nop
	code ends
	end start


 

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值