基于我在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;
}
我想在视觉工作室转换它,我试过但我失败了。我甚至不知道这是否可能。你能否为我转换它或者至少给我一个类似的方法来获得相同的结果?
非常感谢。
答案 0 :(得分:0)
Visual Studio的内联汇编不支持标签IIRC,如果没有它们,整个代码段就没用了。你想在一开始就想要完成什么?
您可以在VS的内联汇编中捕获EIP的当前值,因为函数正在执行,但不能从外部捕获。
顺便说一句,即使在GCC中,它也不会捕获整个函数体的地址和长度。它将捕获序言的地址和长度,而不是序言和结尾代码。要获得函数的实际范围,请生成MAP文件并解析它。
我模糊地回忆起Visual Studio的序言/结尾大小是预定义的宏。我可能会误解这个。
答案 1 :(得分:0)
您可以尝试使用函数指针来获取函数的起始地址,但在Visual Studio的情况下,在调试模式下,它是指向分支指令(分支表的一部分)的指针。功能。这将要求您检查指针是否指向分支指令,如果是,则解码分支指令以确定实际函数的开始。