5

非常に単純なプログラムを64ビットでコンパイルして実行したいと思います。

section .text 
global _start 
_start: 
   mov     rdx,len 
   mov     rcx,msg 
   mov     rbx,1 
   mov     rax,4 
   int     0x80 
   mov    rbx,0 
   mov     rax,1 
   int     0x80 
section .data 
msg     db      "Hello, world!",0xa 
len     equ     $ - msg 

それをコンパイルする行:

yasm -f elf64 -g dwarf2 example.asm

$ yasm --version
yasm 1.2.0

また、別の形式で試しましたが、macho[|32|64], elf[|32] binどれも成功しませんでした。

それをリンクする行:

gcc -o example example.o

ld: warning: ignoring file example.o, file was built for unsupported file format ( 0x7f 0x45 0x4c 0x46 0x 2 0x 1 0x 1 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 ) which is not the architecture being linked (x86_64): example.o
Undefined symbols for architecture x86_64:
"_main", referenced from:
  start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

gccまた、などのいくつかのオプションを試してみました-m64 -arch x86_64

4

2 に答える 2

8

を使用してOSXのアセンブリ言語に取り組んでいyasmます。アセンブルラインは次のとおりです。

yasm -f macho64 -l file.lst file.asm

次に、とリンクしldます:

ld -o file file.o

startOSXではなく使用する必要があります_start

その後、gdbの使用に問題があります。OSXで使用できるデバッグ形式はないようです。

あなたはebeという名前の私のIDEを試すことに興味があるかもしれません。ブレークポイントとデバッグをうまく機能させることができました。現在、浮動小数点コードのデバッグに問題があります。gdbはymmレジスタを認識していないようで、デフォルトバージョンのgdbにはxmmレジスタの一部が逆方向に含まれていました。

あなたはエベが好きかもしれません。を使用してsourceforgeからダウンロードします

git clone git://git.code.sf.net/p/ebe-ide/code ebe

xterm、python、tkinter、pmw(pythonライブラリ)が必要です。

于 2012-11-07T22:38:50.617 に答える
6

ここでいくつかの問題があります:

1)ELFはOS Xではサポートされておらず、Mach-Oでのみサポートされています。

2)リンカがx​​86_64アーキテクチャのMach-Oを探していますが、見つかりません。

ld: warning: ignoring file example.o, file was built for unsupported file format ( 0x7f 0x45 0x4c 0x46 0x 2 0x 1 0x 1 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 ) which is not the architecture being linked (x86_64): example.o

x86_64用にアセンブルしていることを確認するか-m32、GCCに渡してx86を使用してみてください。

3)リンカがCランタイムライブラリcrt1.10.6.oをインクルードしようとしていますが、_main関数を定義していないため、希望どおりに表示されません。おそらく、GCCを介して呼び出すのではなく、リンカを直接呼び出すか、これを回避するためにリンカに渡すフラグの適切な組み合わせを見つける必要があります。

私があなただったら、次の手順から始めます。

a)hello worldをCで記述し、clangにアセンブリファイル(-s)を出力させてから、clangだけを使用してそれをアセンブルおよびリンクできるかどうかを確認します。これはかなり簡単なはずです。

b)それが機能したら、とを使用fileotoolてオブジェクトファイルがどのように表示されるかを決定し、yasmを使用してそれを生成してみます。

于 2012-10-22T22:40:41.233 に答える