c - 为什么我不能使用 CodeBlocks 从我的 C 源代码调用汇编函数?

标签 c assembly mingw codeblocks

我试图调用一个简单的程序集(作为稍后对更复杂的东西的测试),但是当我尝试运行该程序时它崩溃了(该程序已停止响应)。

ma​​in.c:

#include <stdio.h>
#include <stdlib.h>

extern int bar(int param);

int main()
{
    int i=8;

    i = bar(i);

    printf("Hello world! - %i\n",i);
    return 0;
}

bar.S

.file "bar.S"
.text

.align 8
.global bar
bar:
    add %rdi,1000;
    mov %rax,%rdi;
    ret;

我担心这可能与我的编译器配置方式有关(我更习惯手持 Visual Studio 而不是处理真实环境)。

最佳答案

您正在使用 at&t 语法汇编,但您显然不熟悉它。简单的解决方案是将 .intel_syntax noprefix 粘贴到 bar.S 中,以便您可以使用英特尔语法。

At&t 语法使用相反的操作数顺序和不同的有效地址格式等。你崩溃了,因为 add %rdi, 1000 在 intel 语法中的意思是 add [1000], rdi,即将 rdi 的内容添加到超出范围的内存位置 1000。假设您想要add $1000, %rdi。要返回值,您还需要交换 mov %rax, %rdi 的操作数。

关于c - 为什么我不能使用 CodeBlocks 从我的 C 源代码调用汇编函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24932011/

相关文章:

c - ISO 8601 周数(C 语言)

opengl - 在 MinGW 上链接 GLFW 时出现未定义的引用错误

c - 在 C 中非常快速地发送多个包

汇编语言je跳转函数

c - 串行端口 IAR 上的 Sprintf 和浮点值

Python程序变成标准程序集?

linux - 将 Linux x86-64 程序集 hello world 程序与 ld 链接失败

c - socket() 返回 -1 但 errno 0

c - 如何在 Delphi 中比较两个数字是否相等?

c - C 中嵌套函数的作用域如何受到影响?