获取FS的线性地址:32位保护模式下的[0] / MSVC内联asm

时间:2017-12-01 08:24:08

标签: assembly visual-c++ x86 inline-assembly

我在Visual C ++内联汇编中使用了这条指令

lea eax, FS:[0]

为什么eax得到零?

如何获得FS:[0]的线性地址?

2 个答案:

答案 0 :(得分:6)

假设FS指向Windows Thread Information Block(TIB),也称为线程环境块(TEB),则通过读取fs:[0x18]处的32位值来获取TIB的线性地址。在Visual C ++中执行此操作的最佳方法是使用__readfsdword内在函数:

TEB *teb = (TEB *) __readfsdword(0x18);

答案 1 :(得分:3)

LEA指令(“加载有效地址”)命名错误(例如应该称为LEO /“加载有效偏移”),因为它只计算段内的偏移量。