gcc可以编译x86程序集还是只链接它?

gcc可以编译x86程序集还是只链接它?,gcc,assembly,compiler-construction,x86,Gcc,Assembly,Compiler Construction,X86,gcc可以生成程序集,但如何使用gcc或其他编译器编译纯程序集?我知道x86汇编很难,而且是另一个指令集,而不是我刚才看到的MIPS和Nios,但现在我想尝试编译direct x86 asm。有关于如何做的说明,但有一个C文件包括在内,我不需要为我的第一个最基本的编译C文件 gcc -o test_asm asm_functions.S test_asm.c 这是创建.o文件的步骤 gcc -c asm_functions.S gcc -c test_asm.c gcc -o test_asm

gcc可以生成程序集,但如何使用gcc或其他编译器编译纯程序集?我知道x86汇编很难,而且是另一个指令集,而不是我刚才看到的MIPS和Nios,但现在我想尝试编译direct x86 asm。有关于如何做的说明,但有一个C文件包括在内,我不需要为我的第一个最基本的编译C文件

gcc -o test_asm asm_functions.S test_asm.c
这是创建
.o
文件的步骤

gcc -c asm_functions.S
gcc -c test_asm.c
gcc -o test_asm asm_functions.o test_asm.o
但我看不到可以直接用gcc编译x86 asm的步骤。还有另一个名为GNU as(GNU汇编程序)的程序,它可以用来将x86汇编翻译成机器代码吗

试验 代码(32.s)

台阶

看来它可能混合了32位和64位,我必须告诉编译器程序集是32位还是64位指令吗

更新 这个测试与gcc一起工作

$ cat hello.s
.data
.globl hello
hello:
.string "Hi World\n"

.text
.global main
main:
    pushq   %rbp
    movq    %rsp,       %rbp
    movq    $hello,     %rdi
    call    puts
    movq    $0,         %rax
    leave
    ret
$ gcc hello.s -o hello
$ ./hello 
Hi World

你已经在做了

gcc -c asm_functions.S

该步骤生成一个对象文件,
asm\u functions.o
。对象文件是包含机器代码的“可链接”(与“可加载”相反)文件,并附带链接器在链接时应如何修改代码的一些额外说明。
gcc
程序本身只是一个驱动程序,它在后台运行
作为
为您生成
asm\u函数.o
。因此,您可以选择直接以的形式运行
,但通常运行
gcc
前端会更容易。

虽然更新可以工作,但原始代码可以通过使用
gcc-nostlib
来编译。比如说,

gcc -nostdlib 32.s -o 32 DarrylW

是的,这正是
作为(1)
所做的。对于定义
\u start
main
,带有/不带libc的程序,请参阅如何使用gcc进行汇编和链接。但是当我尝试仅链接从纯汇编创建的对象文件时,我会收到一条错误消息,我无法理解(
函数中的
\u start':(.text+0x0):多重定义
\u start'/usr/lib/gcc/x86\u 64-linux-gnu/4.6/../../../../../x86\u 64-linux-gnu/crt1.o:(.text+0x0):首先在这里定义/usr/lib/gcc/x86\u 64-linux-gnu/4.6/../../../../x86\u 64-linux-gnu/crt1.o:在函数中:对
main'
的未定义引用感谢您的回答。这是一个链接问题,而不是编译问题!如果您使用
gcc
链接,默认情况下将获得C运行时,您的入口点应为
main
。谢谢。它可以正常工作(
gcc hello.s-o hello
)现在编译并运行到x86程序集。我用我使用的代码和cmd更新了问题。我没有尝试此代码是否适用于linux,它可能是其他操作系统的其他程序集,
as
程序也可以编译它,但在这种情况下,我可以使用
gcc
和一个简单的hello world程序来编译和运行x86程序集。不太可能把你的名字作为参数传递会有多大影响。那是什么呢?使用换行符和代码格式将使你的答案更具可读性。
gcc -c asm_functions.S
gcc -nostdlib 32.s -o 32 DarrylW