Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将特定于GCC的ASM代码移植到MSVC_C++_Visual C++_Assembly - Fatal编程技术网

C++ 将特定于GCC的ASM代码移植到MSVC

C++ 将特定于GCC的ASM代码移植到MSVC,c++,visual-c++,assembly,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" "m

基于我在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;
}
我想在visual studio中转换它,我尝试过,但失败了。我甚至不知道这是否可能。你能不能帮我转换一下,或者至少给我一个类似的方法来得到同样的结果


非常感谢。

Visual Studio的内联程序集不支持标签IIRC,如果没有标签IIRC,整个代码段将毫无用处。你首先想完成什么

当函数执行时,您可以在VS的内联程序集中捕获EIP的当前值,但不能在外部捕获

顺便说一下,即使在GCC中,它也不会捕获整个函数体的地址和长度。它将捕获函数的地址和长度,无需序言和尾声代码。要获得函数的实际范围,请生成映射文件并对其进行解析


我隐约记得VisualStudio的序言/尾声大小是预定义的宏。在这一点上我可能弄错了。

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

__asm__是gcc的扩展。MSVC有类似的扩展,但语法不同,请在文档中查找。注意:GCC与VS非常不同@整个asm片段就是gcc所称的扩展asm,因此这基本上是一个C程序,其中包含专门为gcc编写的asm代码@用户2485710是的,你想从我这里得到什么?“我不是说得很对吗?”帕拉奈克说,这不仅仅是“asm”关键字;