GCC 内联汇编错误:错误:表达式后出现垃圾“(%esp)”

2023-12-03

GCC 内联汇编错误:错误:表达式后出现垃圾“(%esp)”

我正在研究 gcc 内联汇编。我的环境是Win 7 32位,mingw-gcc 4.6.1。

我对“m”约束有疑问。这是我的c函数代码:

static int asm_test(int a, int b)
{

    int c = 0;
    __asm__ __volatile__(".intel_syntax\n"
            "mov eax, %1\n" //error
            "mov edx, %2\n" //error
            "add eax, edx\n"
            "mov %0, eax\n" //error
            ".att_syntax"
            :"=m"(c)\
            :"m"(a),"m"(b)\
            :"eax","edx"
            );
    return c;
}

对于at&t代码,是这样的:

static int asm_test(int a, int b)
{

    int c = 0;
    __asm__ __volatile__(
            "movl %1, $eax\n" //error
            "movl %2, $edx\n" //error
            "addl $edx, $eax\n"
            "movl $eax, %0\n" //error
            :"=m"(c)\
            :"m"(a),"m"(b)\
            :"eax","edx"
            );
    return c;
}

对于操作输入/输出操作数的三行中的每一行,gcc 在编译时都会生成错误,如下所示:

C:\Users\farta\AppData\Local\Temp\cc99HxYj.s:22:错误:表达式后出现垃圾“(%esp)”

如果我使用“r”作为输入/输出约束,则代码将起作用。但我不明白它为什么起作用以及错误代表什么。谁能告诉我吗?据我所知,“m”只是告诉 gcc 不要分配寄存器,而是在内联 asm 代码尝试访问输入/输出操作数时直接访问内存中的寄存器。它是否正确?

多谢。


这里的问题是 GCC 生成 AT&T 语法结构%0, %1 and %2。如果您查看生成的程序集,它看起来像:

.intel_syntax
mov eax, 8(%ebp)
mov edx, 12(%ebp)
add eax, edx
mov -4(%ebp), eax

这不是有效的英特尔语法。

通常,您不需要在内联汇编中包含显式加载/存储操作 - 只需指定寄存器约束,编译器将自行生成加载/存储。这样做的优点是,即使您的变量(参数、局部变量)根本不驻留在内存中,而是位于寄存器中,您的代码仍然是正确的 - 与您显式地将内存加载/存储在那里的情况不同。

对于您的示例,请尝试以下代码,查看程序集(gcc -S)并注意编译器如何自行从参数区域(例如 x86 上的堆栈)执行移动。

int asm_test(int a, int b)
{
  __asm__ __volatile__ (
                        ".intel_syntax\n"
                        "add %0, %1 \n"
                        ".att_syntax \n"
                        :"+r"(a)
                        :"r"(b));
  return a;

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC 内联汇编错误:错误:表达式后出现垃圾“(%esp)” 的相关文章

  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • Grub 和进入实模式(低级汇编语言编程)

    我一直在开发一个玩具操作系统 并一直使用 grub 作为我的引导加载程序 最近尝试使用 VGA 时 我发现无法使用硬件中断 我发现这是因为我被 grub 置于保护模式 有人知道如何在不删除 grub 的情况下回到实模式吗 如果您使用 GRU
  • CISC 机器 - 它们不只是将复杂指令转换为 RISC 吗?

    也许我在架构上存在误解 但如果机器有 比如说 乘法指令 该指令是否未转换为更小的指令 或者过于复杂以至于最终与等效的 RISC 指令具有相同的速度 乘法是一个不好的例子 它在两种体系结构中都是一条指令 将上面的 乘法 替换为 CISC 中更
  • constexpr lambda / ‘x’ 不命名类型;您指的是“x”吗?

    我正在尝试使用 C 17 的 constexpr lambda 来获取编译时字符串 include
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 出现“重定位符号索引无效”错误时会发生什么?

    这是重现问题的测试 echo void whatever gt prog c gcc prog c 这会在 GCC 4 8 4 上产生以下错误 usr bin ld usr lib debug usr lib x86 64 linux gn
  • Qt 编译器标志顺序

    我的目标是消除某些类型的编译器警告 我发现可以通过在 pro 文件中添加编译器标志来做到这一点 QMAKE CXXFLAGS Wno unused variable Wno reorder 问题是它们被添加在 Qt 构建系统生成的标志之前
  • 68000 汇编语言 - CMPI.B

    What are the contents of the CCR and D3 after the following instructions sequence executes Perform the calculation by ha
  • 64 位 Windows 汇编器

    我想对 64 位 Windows 程序集进行编程 最好使用 NASM 我在 google 上查了一下 但似乎找不到 64 位 Windows 编译器 有些网站提到了ml64 但它似乎不再包含在VC 中 我尝试过 32 位程序集 但显然它在我
  • 为什么 g++ 在编译的二进制文件中存储类名?

    我注意到如果我跑strings在我编译的程序上g 输出包含它使用的各种类的名称 该程序是用 O3并且没有 g or p 并且当我剥离二进制文件时 类名仍然存在 我想知道为什么有必要g 将此信息存储在二进制文件中 出现的类名似乎都是使用虚函数
  • x86 程序集 Pushl/popl 不适用于“错误:后缀或操作数无效”

    我是汇编编程的新手 正在努力解决编程基础 http savannah nongnu org projects pgubook 在带有 GNU 汇编器 v2 20 1 的 Ubuntu x86 64 桌面上 我已经能够汇编 链接执行我的代码
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • 如何将 elf 解释器(ld-linux.so.2/ld-2.17.so)构建为静态库?

    如果我的问题不准确 我深表歉意 因为我没有太多 Linux 相关经验 我目前正在构建一个 Linux 从头开始 主要遵循 linuxfromscratch org 版本的指南 7 3 我遇到了以下问题 当我构建可执行文件时 获取一个称为 E
  • 将十进制转换为十六进制

    首先 这是家庭作业 我正在尝试将 5 位数字读入寄存器 bx 假定该数字不大于 65535 16 位 以下是我尝试这样做的方法 但是 当我尝试打印该号码时 我仅打印输入的最后一位数字 这让我猜测 当我向 bx 添加另一个数字时 它会覆盖以前
  • 将以下机器语言代码(0x2237FFF1)翻译成MIPS汇编

    到目前为止我已经翻译了这段代码 但我不明白的是如何计算 计算 16 位立即地址的数量 0x2237FFF1 转为二进制 0010 0010 0011 0111 1111 1111 1111 0001 现在我正在读取操作码 001000 并知
  • movsbl指令的作用是什么? [复制]

    这个问题在这里已经有答案了 我在网上搜索过 但找不到明确的示例来理解该指令的作用 因此 如果有人可以举一个例子 这对我来说将会非常有帮助 用符号从字节扩展到长字移动 在Intel语法中 该指令的助记符是MOVSX 当变量类型为 C 时 C
  • 测试 xmm/ymm 寄存器是否为零的更快方法?

    It s fortunate that PTEST does not affect the carry flag but only sets the rather awkward ZF also affects both CF and ZF
  • INT 13h 无法读取超出特定扇区的数据

    我正在为我的操作系统编写内核 在将磁盘扇区加载到内存时遇到问题 以下是从磁盘加载扇区的函数代码部分 mov ax 0x3000 mov es ax mov ax 0x0201 mov bx word ptr bp 6 bx 0x000 0x
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保

随机推荐

  • mybatis使用foreach进行批量插入

    我正在使用 mybatis 我想将 ArrayList 插入到某个表中 好吧 在映射器中使用 foreach 这最终会导致 Oracle 异常 ORA 00933 这是 mybatis 映射器
  • chrome 扩展有自己的 document.cookie 吗?

    我正在写一个 chrome 扩展 我想在浏览器cookie中存储一些数据 以便以后使用 Cookie 是实现这一点的完美方法 chrome 扩展程序是否像所有网站一样有自己的文档 cookie 当我做了一些研究时我得到了这个结果https
  • 如何继承WPF风格的Button行为?

    我已经覆盖了 WPF 默认的最大化 最小化按钮 如所解释的here 但是 就我而言 不是使用Image为了覆盖该按钮的背景图像 我想添加我自己的模板 所以我创建了一个ResourceDictionary应用最大化 最小化 恢复 关闭按钮的样
  • 使用 jar 文件中的字节数组缓存声音

    我可以使用 播放Clip 解决方案来自java声音标记维基页面 然而 对于经常播放的声音 例如 快速的激光枪声音 脚步声等 每次想要创建新的声音时都打开流并重新读取文件 这对我来说很不舒服 Clip 所以 我试图将读取的文件缓存到byte
  • Angular4 - 从组件而不是模板更改状态

    在 AngularJS 中 我使用 ui router 在我的应用程序内部进行重定向 更改状态 它有 2 个可能的重定向选项 在模板中ui sref stateName 在控制器中 state go 我刚刚开始使用 Angular 4 我找
  • 在root后的android上执行at命令并得到结果

    我是 stackoverflow 的初学者 所以我无法添加评论 我看到了这个页面 读取 su 进程内的命令输出 我尝试了这个答案 没问题 Process p Runtime getRuntime exec new String su c s
  • React 中的过滤状态而不删除数据

    我正在尝试制作一个反应组件 它可以根据从下拉框中选择的值来过滤列表 自从setState从数组中删除所有数据我只能过滤一次 如何过滤数据并仍保持原始状态 我希望能够进行不止一次搜索 数组列表 state tree id 1 fileType
  • Hibernate 或 SQL 查询带有集合的 M-N 成员?

    给定一个具有 ElementCollection 字符串的类 并给定一个字符串输入集合 public class FooBar ElementCollection private Set
  • Visual Studio 2017 外部工具 npm 不起作用

    我有一个需要 npm 3 的打字稿项目 我已将其安装到 C Program Files nodesjs 并将系统环境变量设置为指向那里 但在 Visual Studio 2017 中 当我设置外部工具位置时 它仍然无法获取 npm 版本 3
  • 检测iframe内的点击事件

    我正在为 TinyMCE 编写一个插件 并且在检测 iframe 内的点击事件时遇到问题 通过我的搜索 我得出了这个 加载 iframe iframe 内的 HTML
  • 类类型重新定义 C++

    我以前见过其他人问过这个问题 但他们收到的答案对于他们的程序来说是独一无二的 不幸的是对我没有帮助 首先 我有一个形状类 分为 h 和 cpp 文件 形状 h include
  • Prettyfaces:在观察特定的 url 模式时将 bean 属性设置为某个常量值

    在编写 Prettyfaces 的 URL 映射规则时pretty config xml我想添加一条规则 每当在 URL 中观察到特定模式时 就为 bean 属性设置一个特定的常量值 例如当有这样的模式时 products electron
  • 使用curl从GitHub运行bash脚本

    我想使用curl 运行来自GitHub 的脚本 我可以使用以下命令轻松完成此操作 This is safe to run but will add a few lines to bashrc vimrc inputrc to add som
  • 如何从 NTFS 文件系统上的 MFT 获取文件的 LBA(逻辑块寻址)?

    我访问了 MFT 文件并提取了文件属性 给定MFT的文件属性 如何从NTFS文件系统上的MFT记录中获取文件的LBA 为了计算LBA 我知道文件的簇数 可以用簇数来计算吗 我不完全确定你的问题 但如果你只是想找到文件在磁盘上的逻辑位置 有各
  • 未捕获的参考错误:谷歌未定义谷歌图表

    我正在尝试在 Android 应用程序中加载 Google 图表 但是 它给我带来了谷歌未定义的错误 下面是我的 HTML 文件和 JavaScript 文件
  • XML 文档到字符串?

    我已经摆弄这个问题二十多分钟了 但我的 Google foo 失败了 假设我有一个用 Java 创建的 XML 文档 org w3c dom Document DocumentBuilderFactory docFactory Docume
  • 当表被删除时,依赖的触发器会发生什么?

    我有一张桌子backup我在其上应用了一个触发器upd trig 现在 我删除了表 然后检查所有关联的触发器 索引是否也会被删除或保留在那里 当我发现一些讨论here 他们说一旦我们删除表 触发器 索引都将被删除 但看来 触发因素仍然存在
  • 单个 api 中的多个查询

    我正在尝试在nodejs中编写一个api 其中包含两个查询 从查询中获取的数据应该合并 并且应该从服务器发送单个json响应 我尝试了以下方法 但不知何故我得到了空值 app get api task details function re
  • React - 在数组中显示项目的问题

    我有一个位置数组试图在我的页面上显示其值 我使用以下代码来遍历该数组 this props locations this props locations forEach loc gt console log Location loc ret
  • GCC 内联汇编错误:错误:表达式后出现垃圾“(%esp)”

    GCC 内联汇编错误 错误 表达式后出现垃圾 esp 我正在研究 gcc 内联汇编 我的环境是Win 7 32位 mingw gcc 4 6 1 我对 m 约束有疑问 这是我的c函数代码 static int asm test int a