使用Intel语法的内联汇编,链接到局部变量[英] Inline assembly with the Intel syntax, linking to local variables

本文是小编为大家收集整理的关于使用Intel语法的内联汇编,链接到局部变量的处理方法,想解了使用Intel语法的内联汇编,链接到局部变量的问题怎么解决?使用Intel语法的内联汇编,链接到局部变量问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在将现有代码从 Windows 移植到 Linux(Visual C++ 到 g++).它包括内联汇编部分.

g++ 支持编译开关 (-masm=intel),告诉它接受 Intel 语法而不是 AT&T 语法.到目前为止一切顺利,应该避免痛苦地重写数千行.

无论如何,在内联汇编块之外引用 C++ 变量存在问题.

例如,建筑

void Test(){int i;asm("mov [i], 5");...}

导致链接器error undefined reference to `i''.而且汇编器似乎对分支标签感到困惑.

从网络搜索来看,使用 Intel 语法时,似乎无法从程序集中引用局部变量:-(.我找到了几个相关的帖子,但没有一个能救我.

这很烦人,因为我无法将变量设为全局变量.(这会破坏多线程安全性,并且似乎与命名空间不兼容).

任何提示?

推荐答案

你必须同时使用这两种语法..


例)
#define TEST(out, in) \ asm\( \"mov %1, 5\n\t"\".intel_syntax noprefix;" \--------英特尔语法--------".att_syntax;" \:"=g" (out)\:"g" (in)\);\



并在没有-masm=intel的情况下编译

在技术难点面前,我放弃了使用内联汇编的想法.

在任何情况下都需要对源代码进行全面返工,这会带来新的选择.

我选择的选项是切换到 SSE 内在函数调用,因为它们可以在 Microsoft 和 GNU 编译器之间移植,并且似乎是矢量化的未来.使用这些内在函数进行编程要容易得多,因为您不必担心寄存器分配.此外,Visual C++ 编译器不支持 64 位处理器的内联汇编,因此必须使用内部函数.

本文地址:https://www.itbaoku.cn/post/1356090.html