C++ 将特定于GCC的ASM代码移植到MSVC
基于我在google上找到的代码,它在GCC编译器上运行良好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
#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”关键字;