【问题标题】:How can I run C-code with assembly inserts [duplicate]如何使用程序集插入运行 C 代码 [重复]
【发布时间】:2021-02-15 12:44:10
【问题描述】:

我有带有汇编插入的 C 程序。 这是代码: main.c:

#include <stdio.h>

int f() {
    int a = 0, b;
    __asm__ (".intel_syntax noprefix\n\t"
             "mov edx, 1\n\t"
             :"=r"(b)
             :"r"(a)
             :"eax"
            );
    return b;
}

int  main() {
    printf("%d", f());
}

我已经找到了如何编译这段代码(gcc -std=c11 -S main.c -o main),但是当我运行它时(./main) - 这是终端中的一个问题: bash: ./main: 权限被拒绝。

当我尝试在没有 -S 标志的情况下编译它时,会出现许多不合理的错误:

/tmp/ccw3H0Mb.s: Assembler messages:
/tmp/ccw3H0Mb.s:23: Error: Instruction does not exist: «movl%edx,-4(%rbp)»
/tmp/ccw3H0Mb.s:24: Error: Instruction does not exist: «movl4(%rbp),%eax»
/tmp/ccw3H0Mb.s:46: Error: Instruction does not exist: «movl$0,%eax»
/tmp/ccw3H0Mb.s:48: Error: Instruction does not exist: «movl%eax,%esi»
/tmp/ccw3H0Mb.s:49: Error: Garbage «(%rip)» after expression
/tmp/ccw3H0Mb.s:50: Error: Instruction does not exist: «movl$0,%eax»
/tmp/ccw3H0Mb.s:52: Error: Instruction does not exist: «movl$0,%eax»

什么是错误,如何修复它以正确运行我的代码? 谢谢! :)

【问题讨论】:

  • 选项-S 导致生成汇编代码。它不会产生二进制文件。去掉-S选项,你应该会得到一个可执行的二进制文件。
  • 您的内联汇编已损坏。你硬编码edx,但你告诉编译器它可以为输出操作数选择任何寄存器。

标签: c gcc compilation inline-assembly intel-syntax


【解决方案1】:

我只需要在编译命令中添加 -masm=intel,当然,我还删除了 -S 标志(感谢 fuz)。这很重要,因为我使用的是 Intel 语法,所以 gcc 必须注意它。

现在看起来像:

gcc -std=c11 -masm=intel main.c -o main

【讨论】:

    猜你喜欢
    • 2021-01-16
    • 2015-02-17
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    相关资源
    最近更新 更多