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

标签 gcc assembly compiler-construction x86

gcc 可以生成程序集,但如何使用 gcc 或其他编译器编译纯程序集?我知道 x86 汇编很困难,而且还有另一种指令集而不是我正在查看的 MIPS 和 Nios,但现在我想尝试直接编译 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 Assembler)的程序,可以用它来将x86汇编翻译成机器码吗?

测试

代码 (32.s)
.globl  _start

.text
_start:
        movl    $len, %edx
        movl    $msg, %ecx
        movl    $1, %ebx
        movl    $4, %eax
        int     $0x80

        movl    $0, %ebx
        movl    $1, %eax
        int     $0x80
.data
msg:
        .ascii  "Hello, world!\n"
        len =   . - msg

脚步
$ gcc -c 32.s 
$ ls 32*
32.o  32.s
$ gcc -o 32 32.o 
32.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o:(.text+0x0): first defined here
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'

所以看起来它可能混合了 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_functions.o .目标文件是包含机器代码的“可链接”(相对于“可加载”)文件,还有一些关于链接器在链接时如何修改代码的额外说明。 gcc程序本身只是一个驱动程序,它运行 as幕后为您制作asm_functions.o .所以你可以选择运行 as直接,但通常更容易运行 gcc前端。

关于gcc - gcc 可以编译 x86 程序集还是只是链接它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14930830/

相关文章:

c++ - 警告 : second argument of ‘int main(int, char***)’ should be ‘char **’ [-Wmain] (GNU C++ compiler; Ubuntu 12. 10)

c++ - 模棱两可的模板怪异

c - 为什么每次在 GDB 中构建 + 反汇编函数时都会得到相同的地址?

c - GDB 调用不在 main 中的函数

无法使用 TMR4、T4CON 等访问定时器 4 pic32

assembly - 任何汇编语言被认为有用所需的最低指令集是多少?

python - 编译器 : How to parse function calls and function definitions

c - 这种 union 的使用是否严格符合要求?

compiler-construction - 从编译器的角度来看,Expression、Statements 和 Declaration 有什么区别?

java - 在编译时禁用 Java 日志记录