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

Assembly 如何在跳转指令中添加8位或16位偏移量?,assembly,x86,offset,Assembly,X86,Offset,我怀疑在IA-32体系结构中,如果跳转使用8位或16位偏移,将该偏移量添加到EIP寄存器可能会影响在偏移量中没有匹配位的EIP位,或者这就像将在位数上匹配偏移量的EIP寄存器的一部分添加到偏移量?如果您谈论的是像添加EIP,xxx这样的操作,那么它就是32位添加,您不必担心一个操作数的开头更窄 更新-忽略了这实际上是关于相对JMP指令的事实。答案是不,不需要担心相对跳转偏移量操作数的大小,跳转将正常工作 以下是当前的英特尔文档: 短跳转只是EIP和8位或16位(或32ibt)有符号立即数之间的相

我怀疑在IA-32体系结构中,如果跳转使用8位或16位偏移,将该偏移量添加到EIP寄存器可能会影响在偏移量中没有匹配位的EIP位,或者这就像将在位数上匹配偏移量的EIP寄存器的一部分添加到偏移量?

如果您谈论的是像
添加EIP,xxx
这样的操作,那么它就是32位添加,您不必担心一个操作数的开头更窄

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

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


短跳转只是EIP和8位或16位(或32ibt)有符号立即数之间的相加。如果新EIP无法在正确的代码地址启动,则会引发异常

来自英特尔:指令集参考*

近距离和短距离跳跃。在执行 接近跳转时,处理器跳转到 地址(在当前代码内) 段)中指定的 目标操作数。目标操作数 指定绝对偏移 (这是相对于基准面的偏移量 代码段)或相对偏移量 (a)相对于基准面的有符号位移 指令的当前值 EIP寄存器中的指针)。近 跳转到8位的相对偏移量 (rel8)被称为短跑。 CS寄存器在near上未更改 还有短跑。绝对偏移量是 间接指定于 通用寄存器或存储器 位置(r/m16或r/m32)。这个 操作数大小属性确定 目标操作数的大小(16或32 位)。加载绝对偏移量 直接输入EIP寄存器。如果 操作数大小属性为16,则 EIP寄存器的上两个字节 被清除,导致最大 指令指针大小为16位。A. 相对偏移量(rel8、rel16或 rel32)通常指定为 标签位于汇编代码中,但位于 机器代码级别,它被编码为 有符号8位、16位或32位立即数 价值此值将添加到 EIP寄存器中的值。(这里是 EIP寄存器包含 JMP后面的指令 指示)。当使用相对 偏移量,操作码(简称vs。 近跳跃)和操作数大小 属性(用于近相对跳跃) 确定目标的大小 操作数(8、16或32位)


我说的是JMP指令不是ADD。那么你的意思是跳16位偏移量,比如0x8888,然后将其添加到EIP寄存器,将完全类似于跳32位偏移量,然后将其添加到EIP?嗯,0x8888是一个负数,所以它将类似于做0xFF8888的32位相对跳转,但我不认为这是你想表达的意思。0x44的相对跳转与0x0044和0x00000044的相对跳转相同。当你进入大跳转和保护模式操作时,还有很多其他问题,但我想你不需要在这里担心它们。是的,我在签名逻辑中没有任何意思,但你明白我的意思了。