我偶然发现了英特尔软件开发人员手册中的声明: “对于LGDT,LIDT,LLDT,LTR,SGDT,SIDT,SLDT,STR,退出限定接收指令位移字段的值,必要时将其符号扩展为64位(不支持Intel的处理器上为32位) 64架构)如果指令没有位移(例如,有一个寄存器操作数),则零存储在退出限定中。“
现在,如果我有一个指令LIDT 0xf290,那么“0xf290”是一个位移吗?我认为答案是肯定的。
那么,我的困惑是什么都构成了流离失所?我的印象是,位移是根据当前的eip值计算的。 例如。 jmp xxx(在段内跳转中,这将是一个位移。但对于段间跳转,它应该是绝对地址。)如果是这种情况那么为什么LIDT会加载相对地址?
答案 0 :(得分:1)
位移只是某个原点的偏移量,可能是Base+Index*Scale
或0.另一个操作数x86可以容纳大值立即,这对于添加常量(例如ADD $42, %eax
)等非常有用。
顺便说一句,相对跳转似乎使用立即字段,可能是因为它们将EIP
修改为常量。