我无意中在《英特尔软件开发人员手册》中发现一条声明:
对于LGDT、LIDT、LLDT、LTR、SGDT、SIDT、SLDT、STR,退出资格接收指令的位移字段的值,如果需要的话,该符号扩展到64位(在不支持英特尔64架构的处理器上的32位)。如果指令没有移位(例如,具有寄存器操作数),则将零存储到退出资格中。
如果我有一个指令LIDT 0xf290,那么“0xf290”是一个位移量吗?我想答案是肯定的。
所以,我的困惑是什么都构成了位移?我当时的印象是,位移是根据当前的eip值计算出来的。
例如,jmp xxx(在段内跳跃中,这将是一个位移。但是对于段间跳转,它应该是绝对地址。)如果是这样,那么为什么LIDT加载相对地址?
最佳答案
位移只是与某个原点的偏移量,可能是ABase+Index*Scale
或0。另一个可以保存大值的操作数x86是immediate,这对于添加常量(例如ADD $42, %eax
)非常有用。
顺便说一下,相对跳跃似乎使用了立即数字段,可能是因为它们修改了一个常量EIP
。
关于linux - LIDT的操作数是位移/绝对地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6142731/