风涩 發表於 2020-2-3 10:28:11

汇编 JMP使用详解

<p><strong>汇编 JMP 详解关键词说明</strong></p>
<p>RVA: 相对虚拟地址(Relative Virtual Address),在内存中相对于PE文件装入地址的偏移位置,是一个相对地址。</p>
<p><strong>JMP 的 3 种类型</strong></p>
<ul>
<li>短跳转(Short Jmp,只能跳转到256字节的范围内),对应机器码:EB</li>
<li>近跳转(Near Jmp,可跳至同一段范围内的地址),对应机器码:E9</li>
<li>远跳转(Far Jmp,可跳至任意地址),对应机器码: EA</li>
</ul>
<p>短跳转 和 近跳转 指令中包含的操作数都是相对于(E)IP的偏移。</p>
<p>远跳转指令中包含的是目标的绝对地址。</p>
<p>所以短/近跳转会出现跳至同一目标的指令机器码不同,不仅会不同,而且应该不同。</p>
<p>而远跳转中包含的是绝对地址,因此转移到同一地址的指令机器码相同 。</p>
<p>至此,我们知道了跳转指令所对应的机器码根据E(IP)计算出来的,那到底是怎么计算的呢?</p>
<p><strong>JMP 目标地址计算方式</strong></p>
<p>目标地址 = 当前指令地址 + 指令长度 + RVA</p>
<p><strong>举例说明</strong></p>
<p style="text-align: center"><img alt="" src="https://img.jbzj.com/file_images/article/202002/202002031025414.png" /></p>
<p>如图: 想要从 001392DB 处跳转到 001392E1 这个地址,那么E9后面应该跟多少呢?</p>
<p><code>RVA = 001392E1 - 001392DB - 5</code></p>
<p>在计算机中使用上面的公式计算结果就是 RVA = 1 所以后面应该是跟 E9 01 00 00 00<br />
其中 5 是指令长度 E9 后面需要跟 4 字节的地址,所以指令(1)+地址(4) = 5</p>
<p>ps: 如果计算结果是负数,则数值后面应该用 FF 填充,如负一则应该用 E9 01 FF FF FF</p>
<p>以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持琼殿技术社区。</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>解析四则表达式的编译过程及生成汇编代码</li><li>汇编语言常见错误信息中文注解</li><li>汇编优化提示</li><li>从汇编看c++中默认构造函数的使用分析</li><li>从汇编看c++的默认析构函数的使用详解</li><li>汇编语言无效指令错误概述</li><li>汇编语言超浓缩教程</li><li>汇编语言 口算异或xor小结</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: 汇编 JMP使用详解