如何在跳转指令中添加8位或16位偏移?

时间:2011-01-18 09:08:14

标签: assembly x86 offset

我怀疑在使用8位或16位偏移的跳转情况下是否在IA-32架构中,将该偏移添加到EIP寄存器会影响EIP的位,这些位在偏移中没有匹配位好吧,或者它只是添加EIP寄存器的一部分,将偏移量与偏移量相匹配?

2 个答案:

答案 0 :(得分:1)

如果您正在谈论像add eip,xxx这样的操作,那么它是一个32位的添加,您不必担心一个操作数开始变窄的事实。

更新 - 错过了这实际上是关于相对JMP指令的事实。答案就是不,你不需要担心相对跳转偏移操作数的大小,跳转就能正常工作。

以下是当前的英特尔文档:

http://www.intel.com/products/processor/manuals/

答案 1 :(得分:0)

短跳转只是EIP与8位或16位(或32位)签名立即值之间的补充。如果新的EIP不能从正确的代码地址开始,那么异常将会提升。

来自英特尔:说明书参考*

  

近距离和短距离跳投。执行时   接近跳跃,处理器跳到了   地址(在当前代码中   使用。指定的段)   目标操作数。目标操作数   指定绝对偏移量   (这是从基数的偏移   代码段)或相对偏移量   (相对于   指令的当前值   EIP寄存器中的指针)。一只耳朵   跳转到8位的相对偏移量   (rel8)被称为短跳。   CS寄存器在附近没有改变   和短距离跳跃。绝对偏移量是   间接指定的   通用寄存器或存储器   位置(r / m16或r / m32)。该   operand-size属性决定了   目标操作数的大小(16或32   位)。加载绝对偏移量   直接进入EIP寄存器。如果   operand-size属性是16 ,.   EIP寄存器的高位两个字节   被清除,导致最大值   指令指针大小为16位。一个   相对偏移量(rel8,rel16,或   rel32)通常指定为   汇编代码中的标签,但在   机器代码级别,它被编码为   立即签名8,16或32位   值。此值将添加到   EIP寄存器中的值。 (这里,   EIP寄存器包含地址   JMP之后的指令   指令)。使用亲戚时   偏移,操作码(简称vs.   接近跳跃)和操作数大小   属性(用于近乎相对跳跃)   确定目标的大小   操作数(8,16或32位)。