Nec*_*lis 16

短跳(和接近调用)是目标在同一模块中的跳转(它们是模块内,但是可以从某些黑客获得模块间变体),它们最常见的是127字节的相对位移(它们改变了流量)从指令的地址向前或向后执行,但是有16位变体提供32k字节.你真的不需要担心它,它真的是超级信息,但英特尔开发人员手册(第2a卷和第2b卷,特别是2a)将涵盖血淋淋的细节

  • “short” jmp 特指用于近跳转的 `rel8` 2 字节编码。您通常将其与“接近”跳转/呼叫混为一谈,这会改变 IP/EIP/RIP 而不是 CS。即正常跳转,您将在平面内存模型中使用的唯一类型。短 jmp 是近 jmp 的紧凑编码版本。英特尔手册 (https://www.felixcloutier.com/x86/jmp) 中的描述部分解释了该术语。 (4认同)

typ*_*eaf 6

使用与当前汇编指令的相对偏移量可以实现短跳转。对于x86/32位,这是一条2字节的指令,其中第一个字节总是EB,为短跳转,第二个字节是当前要跳转的指令前后的字节数。第二个字节是一个有符号的8 位数字,因此 x86 上最远的短跳转距离 +/-127 个字节。任何超过 +/-127 字节的距离都是一个长跳转E9,并且必须使用完整的 32 位地址;产生一个 5 字节的指令。

如果您要内联修补汇编代码,请记住这一点很重要。

前任。 EB 0将跳转到短跳转后的操作码,而不是代码行本身。

前任。 EB 7F是跳得最远的。

  • `EB rel8` / `jmp short` 在任何模式下都是*始终*的 2 字节指令。https://www.felixcloutier.com/x86/jmp。只有 jmp 附近的 rel16/rel32 具有不同的默认操作数大小,具体取决于 16 位模式与否。 (2认同)
  • rel8 范围是 -128 .. +127,不完全是 +/-127。它是相对于指令末尾的有符号 2 的补码相对位移。“跳远”并不是手册中使用的技术术语;而是一个术语。`jmp rel32` 是一个“近”跳转(不改变 CS),不能使用 rel8 编码。(它仍然是一个相对地址,所以它不是“完整的32位地址”。即使在64位模式下,它最多仍然是call/jmp rel32。要使用64位绝对地址,通常是 mov reg,imm64 / jmp 注册) (2认同)