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
答案 0 :(得分:19)
你已经在做了。
gcc -c asm_functions.S
该步骤生成一个目标文件asm_functions.o
。目标文件是包含机器代码的“可链接”(而不是“可加载”)文件,以及链接器在链接时如何修改代码的一些额外说明。 gcc
程序本身只是一个驱动程序,它在幕后运行as
,以便您生成asm_functions.o
。因此,您可以选择直接运行as
,但通常可以更轻松地运行gcc
前端。
答案 1 :(得分:2)
虽然更新有效,但原始代码可以通过简单地使用gcc -nostdlib
进行编译。例如,
gcc -nostdlib 32.s -o 32 DarrylW