将GCC特定ASM代码移植到MSVC

时间:2014-02-11 23:34:24

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

基于我在google上找到的代码(在GCC编译器上工作正常)

#define ASM __asm__ __volatile__
void MyFunc()
{
    ASM("enc_start:\n\t");
    printf("Hello, world!");
    ASM("enc_end:\n\t");
}
int main()
{
    unsigned int addr, len;
    ASM("movl   $enc_start, %0\n\t"
        "movl   $enc_end, %1\n\t"
        : "=r"(addr), "=r"(len));
    printf("Address of begin of function: %X", addr);
    printf("Len is of: %d bytes", len);
    return 0;
}

我想在视觉工作室转换它,我试过但我失败了。我甚至不知道这是否可能。你能否为我转换它或者至少给我一个类似的方法来获得相同的结果?

非常感谢。

2 个答案:

答案 0 :(得分:0)

Visual Studio的内联汇编不支持标签IIRC,如果没有它们,整个代码段就没用了。你想在一开始就想要完成什么?

您可以在VS的内联汇编中捕获EIP的当前值,因为函数正在执行,但不能从外部捕获。

顺便说一句,即使在GCC中,它也不会捕获整个函数体的地址和长度。它将捕获序言的地址和长度,而不是序言和结尾代码。要获得函数的实际范围,请生成MAP文件并解析它。

我模糊地回忆起Visual Studio的序言/结尾大小是预定义的宏。我可能会误解这个。

答案 1 :(得分:0)

您可以尝试使用函数指针来获取函数的起始地址,但在Visual Studio的情况下,在调试模式下,它是指向分支指令(分支表的一部分)的指针。功能。这将要求您检查指针是否指向分支指令,如果是,则解码分支指令以确定实际函数的开始。