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