我正在尝试学习汇编,并将其与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
一开始我有一些寄存器问题,但现在也是这样!
答案 0 :(得分:2)
这不是汇编程序的问题,而是链接器。
gcc -o onetest onetest.o onetest.c
尝试编译&amp;将onetest.o
和onetest.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
的副作用)。