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