26

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

しかし、x86 asm を gcc で直接コンパイルできるステップがわかりません。GNU (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
4

2 に答える 2

20

あなたはすでにそれをやっています。

gcc -c asm_functions.S

この手順により、オブジェクト ファイルasm_functions.o. オブジェクト ファイルは、マシン コードを含む (「読み込み可能」ではなく) 「リンク可能」なファイルであり、リンク時にリンカーがコードを変更する方法に関する追加の指示が含まれています。gccプログラム自体は単なるドライバーであり、作成asするために舞台裏で実行されますasm_functions.oasしたがって、直接実行するオプションもありますが、多くの場合、gccフロントエンドを実行する方が簡単です。

于 2013-02-18T06:49:38.043 に答える