我怀疑在使用8位或16位偏移的跳转情况下是否在IA-32架构中,将该偏移添加到EIP寄存器会影响EIP的位,这些位在偏移中没有匹配位好吧,或者它只是添加EIP寄存器的一部分,将偏移量与偏移量相匹配?
答案 0 :(得分:1)
如果您正在谈论像add eip,xxx
这样的操作,那么它是一个32位的添加,您不必担心一个操作数开始变窄的事实。
更新 - 错过了这实际上是关于相对JMP指令的事实。答案就是不,你不需要担心相对跳转偏移操作数的大小,跳转就能正常工作。
以下是当前的英特尔文档:
答案 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位)。