我试图调用一个简单的程序集(作为稍后对更复杂的程序的测试),但是当我尝试运行该程序时,它会崩溃(该程序已停止响应)。
主要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;
}

酒吧
.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中,这样就可以使用intel语法。
At&t语法使用反向操作数顺序和不同的有效地址格式等。因为add %rdi, 1000在intel语法中是指add [1000], rdi,也就是将rdi的内容添加到超出界限的内存位置1000中,所以发生了崩溃。可能你想做add $1000, %rdi。要返回值,还需要交换mov %rax, %rdi的操作数。

10-04 12:24