gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:41:08 27 4
gpt4 key购买 nike

我正在尝试学习 Assembly,并将其用于 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

一开始我在寄存器方面遇到了一些问题,但现在也是!

最佳答案

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

gcc -o onetest onetest.o onetest.c

尝试将 onetest.oonetest.c 编译并链接在一起,我假设 onetest.o 派生自 一个测试.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&T x86 语法中,add, %a, %b 相当于 %b += %a

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

关于c - 汇编程序 64 位多重定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23540006/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com