![]() |
1
0
你的当前版本
如果它崩溃了,你真正的问题就在其他地方,所以你应该使用调试器找出原因 它崩溃了
宣布重拳出击
您不需要也不应该为此使用内联asm(在这种情况下:堆栈参数处于32位模式,这通常是默认模式)。 它是一个有效的C++,它将一个整数转换为函数指针。 ,如果在那个地址上真的有一个函数的话,这甚至不是未定义的行为。
另外,与asm版本相比,MSVC的编译效率也更高。
可以在函数指针上使用GCC函数属性显式指定调用约定
查看编译器的asm输出
on the Godbolt compiler explorer
. 我使用了“intel syntax”选项,因此gcc输出来自
,但是
MSVC的
但是使用内联asm的版本要糟糕得多 :
MSVC内联asm语法基本上很糟糕,因为与gnucasm语法不同的是,输入总是必须在内存中,而不是在寄存器或立即器中。因此,您可以更好地使用gnuc,但不如完全避免内联asm那么好。 https://gcc.gnu.org/wiki/DontUseInlineAsm 通常要避免从内联asm调用函数;当编译器知道发生了什么时,这样更安全、更高效。 |
![]() |
2
-4
下面是一个使用gcc的内联汇编的示例。 例程“vazio”承载例程“rotina”的汇编代码(vazio和rotina只是标签)。注意,Intel语法是通过指令使用的;gcc默认为AT&T。 我从一个旧的子目录中恢复了这段代码;汇编代码中的变量以“U”作为前缀,这是标准的C约定。我承认,此时此地,我不知道为什么编译器接受“str”。。。不管怎样: 使用gcc/g++版本5和7正确编译!希望这有帮助。如果您想查看asm结果,只需调用“gcc main.c”或“gcc-S main.c”,对于intel输出,则调用“gcc-smasm=intel main.c”。
|
![]() |
wubw · Skybox渲染的VkRenderPass加载操作问题 7 年前 |
![]() |
motam79 · 英特尔TBB流程图开销 7 年前 |
![]() |
sjso · 使用影子分页在ubuntu中运行vm? 7 年前 |
![]() |
BeeOnRope · 在x86中是否允许访问跨越零边界的内存? 7 年前 |