第九章实验8

题目:分析下面的程序,在运行前思考:这个程序可以返回吗?运行后分析:为什么会是这个结果?

解答:这个程序实在是让我头疼了一天,百思不得其解,8~11行代码是把jmp short s1这条指令复制到s处的两个nop处,这里我是知道的。但是问题就是出在这里,我老是认为当程序执行到s0:jmp short s后,当他跳转到s处时,他就应该要执行跳转到s1处。但是这样的话肯定不对的,上论坛转了一圈,还是没看出大概,还是稀里糊涂的。后来终于知道:这个程序的关键还是在复制jmp short s1这条指令这里 。因为指令有其对应的机器码,通过调试程序可以知道jmp short s1它的机器码是EB F6h(是用补码表示的,换算后就是-10。至于为什么偏移量是10?请先看下面的机器码:

实际上是这样的:偏移量是从s2:jmp short s1这条指令后的nop指令处即0B85:0022到s1:mov ax,0000处即0B85:0018,两者之间的差值就是10,所以偏移量就是10了),其实是把EBF6复制到了s的两个nop处(刚好两个字节)。所以当程序执行到s0:jmp short s跳转到s处后,他只是把ip的值减去了10,而mov ax,4c00h到原来的两个nop处刚好是10,所以程序就赚到了mov ax,4c00h处执行,然后程序正常返回。

调试过程:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值