站内短消息不好用 以后别发了。
暂时不理解就不必强行理解了。偏离初衷就不好了。以后该明白时自然就明白。
举一才能反三,连举一都不行,就忙着反三是不可能的任务。
先理解透彻那几句吧。
call @F
@@:pop ebx
sub ebx,offset@B
CALL是伪指令,实际运行时会先把下条指令地址入栈,然后才会执行CALL。
而执行CALL既是执行了pop ebx,就把刚才入栈的下条指令地址弹出送入ebx,这个地址
就是pop ebx指令本身的地址 也即标号@@的实际地址。
相信你理解应该没问题。
重定位有2个方面 一是什么地方需要重定位 二是需要修正的差值是多少。
这几句代码的作用就是求得重定位需要的差值。
取得标号@@的实际地址以后,还要取得在默认装载情况下的地址。
这就是offset@B的作用。记得回答类似问题的时候,我反复讲,一定要
注意offset,甚至可以说这个是理解的关键。上午回贴时看到zklhp版主
在上页有个手误的地方,就是这个offset@B编译后的值。

他自己发现了。
offset@B在编译时就固定了,以常量的形式存在,如果代码按照默认装载
地址装入,那么就不需要重定位,存在于ebx中的@@标号的实际地址和以常
量的形式存在的offset@B的值相等。
如果没有按照默认地址装载,那么他们的值是不等的,SUB以后就得到了两者
的差值,这个差值最后放在ebx中, 然后用这个差值去修正代码中需要进行
重新定位的数据。
实际装载地址可以每次都不同,即存在于ebx中的@@标号的实际地址可以每次
都不同, 但是offset@B在编译时就固定了,以常量的形式存在,不管实际地址
如何改变,这个值是固定不变的,它表示的就是不需重定位时@@标号的地址。
至于反汇编后的机器码什么的,暂时不必去多看,牵扯到opcode的知识,真要感兴趣可以去看看罗聪的OPCODE系列文章,很不错。
读书百遍,其义自见,多看看书 耐住性子。 象这些很简单的问题,多读读 多想想 多
动动手,不成任何问题的。
在透彻理解的前提下,再去扩展思路去想别的-----至少 如果你能理解sub ebx,offset@B的作用是取得差值的话,你也不会在主贴里想要把offset去
掉而变成实际地址减实际地址永远都是0了 那还有必要搞这几句代码吗?
这也是偶一直以来强调的,汇编语言单条指令查查手册谁都懂,但是重点要放在代码段
上 要放在代码段实现的功能上,
为什么要这几句代码?需要取得重定位需要的差值。
如何取得差值? 通过取得@@标号的实际装载地址,再去和@@标号的默认装载地址相减。
代码段完成后有什么结果? ebx中存放着所需的数据。

偶都成唐僧了, 偶看楼主骨骼清奇 眉清目秀 所以罗嗦半天
