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

问题描述 投票:-1回答:2

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

assembly x86 offset
2个回答
1
投票

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

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

这是当前的英特尔文档:

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


0
投票

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

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

近距离和短距离跳投。执行近跳转时,处理器跳转到使用目标操作数指定的地址(在当前代码段内)。目标操作数指定绝对偏移量(即距离代码段基址的偏移量)或相对偏移量(相对于EIP寄存器中指令指针的当前值的有符号位移)。近似跳转到8位(rel8)的相对偏移被称为短跳转。 CS寄存器在近跳和短跳时不会改变。绝对偏移量在通用寄存器或存储单元(r / m16或r / m32)中间接指定。 operand-size属性确定目标操作数的大小(16或32位)。绝对偏移直接加载到EIP寄存器中。如果操作数大小属性为16,则清除EIP寄存器的高两个字节,导致最大指令指针大小为16位。相对偏移量(rel8,rel16或rel32)通常在汇编代码中指定为标签,但在机器代码级别,它被编码为带符号的8位,16位或32位立即值。该值将添加到EIP寄存器中的值。 (这里,EIP寄存器包含JMP指令之后的指令的地址)。使用相对偏移时,操作码(对于短跳转与近跳转)和操作数大小属性(对于近似相对跳转)确定目标操作数的大小(8,16或32位)。

© www.soinside.com 2019 - 2024. All rights reserved.