【问题标题】:VS C++ ASM to GCC ASMVS C++ ASM 到 GCC ASM
【发布时间】:2013-06-01 15:14:32
【问题描述】:

我的转换是否正确?

原始VS C++版本:

 _TEB *pTeb = NULL;

        _asm
        {
            mov eax, fs:[0x18];
            mov pTeb, eax;
        }

我的尝试(GCC):

 _TEB *pTeb = NULL;

        asm ("movl %%fs:0x18, %%eax\n\t"
             "movl %%eax, %0"
            : "=rm" (pTeb) : : "%eax");

【问题讨论】:

  • 您是否尝试过对其进行测试以查看它是否正确编译并产生相同的结果?
  • 对我来说看起来是正确的,只要两者都在 Windows 上运行(TIB 中的 ptibSelf 在其他地方不可用)。如果它是另一个平台的端口,您需要重新考虑功能:)
  • 感谢 cmets,我是用手机写的,没有编译器可以检查。

标签: c++ assembly


【解决方案1】:

如果您需要 GCC 语法来处理与 Windows 相关的代码,一个很好的检查源是 ReactOS 源。这是他们对NtCurrentTeb() 的实现(删除了不相关的部分):

unsigned long __readfsdword(const unsigned long Offset)
{
    unsigned long value;
    __asm__ __volatile__("movl %%fs:%a[Offset], %k[value]" : [value] "=r" (value) : [Offset] "ir" (Offset));
    return value;
}

struct _TEB * NtCurrentTeb(VOID)
{
  return (PTEB)__readfsdword(0x18);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多