汇编程序64位多重定义错误

时间:2014-05-08 11:06:34

标签: c assembly compilation

我正在尝试学习汇编,并将其与64位一起使用。我想在C中编译一个内联汇编程序,但每次都会出错。

#include <stdio.h>

int main() {

__asm__ ( "mov %rdx, 10;"
          "mov %rcx, 20;"
          "add %rdx, rcx;"
);


__asm__ ( "mov %rdx, 10;"
          "mov %rcx, 20;"
          "sub %rcx, %rdx;"
);

__asm__ ( "mov %rdx, 10;"
          "mov %rcx, 20;"
          "sub %rcx, %rdx;"
);


__asm__ ( "mov %rdx, 10;"
          "mov %rcx, 20;"
          "imul %rdx, %rcx;"
);

return 0 ;
}

如果我尝试编译,我会收到以下错误:

gcc -o onetest onetest.o onetest.c

/tmp/ccXkj6UQ.o: In function `main':

onetest.c:(.text+0x0): multiple definition of `main'

onetest.o:onetest.c:(.text+0x0): first defined here

/tmp/ccXkj6UQ.o: In function `main':

one.c:(.text+0x18): undefined reference to `rcx'

collect2: error: ld returned 1 exit status

一开始我有一些寄存器问题,但现在也是这样!

1 个答案:

答案 0 :(得分:2)

这不是汇编程序的问题,而是链接器。

gcc -o onetest onetest.o onetest.c

尝试编译&amp;将onetest.oonetest.c联系在一起,我假设onetest.o来自onetest.c。你正在编译那个东西两次。尝试

gcc -o onetest onetest.c

修改

如果你想让你的asm与你的C代码交互,那么你最好使用扩展的asm。例如:

int64_t result = 10; // one of the arguments
asm (
    "add %1, %0"
    : "+r" (result) // input-output variable
    : "g" (20)      // second argument
    : "cc"
    );

printf("result = %lld\n", result);

请注意,在AT&amp; T x86语法中,add, %a, %b的格式为%b += %a

对于扩展的asm约束:"+r"指示编译器在其选择的寄存器中提供result(在asm中可用作%0)用于输入和输出。 "g"指示您的编译器以其认为仅适合输入的任何形式提供20(在asm中可用作%1)。 "cc"向您的编译器发出信号,指出x86中的条件标志寄存器EFLAGS将被您的asm更改(add的副作用)。