Mac でアセンブリを作成するための優れたツール (IDE を探しています) を知っている人はいますか? Xcode は私には少し面倒です。
また、Intel Mac では、汎用の x86 asm を使用できますか? または、変更された命令セットはありますか? ポストインテルに関する情報。
また、Windowsでは、OSによって作成されたエミュレートされた環境でasmを実行して、コードが独自の専用マシンで実行されていると認識できることを知っています。OS X は同じものを提供しますか?
Intel ベースの Mac をターゲットとする任意のバージョンの Xcode をインストールすると、アセンブリ コードを記述できるようになります。Xcode は一連のツールであり、そのうちの 1 つだけが IDE であるため、使用したくない場合は使用する必要はありません。(とは言っても、もしあなたが不格好だと思う特定のことがあれば、Apple のバグレポーターにバグを報告してください。すべてのバグはエンジニアリングに送られます。) さらに、Xcode をインストールすると、Netwide Assembler (NASM) と GNU Assembler (GAS) の両方がインストールされます。これにより、最も使い慣れたアセンブリ構文を使用できます。
Compiler & Debugging Guidesも参照してください。これらには、Mac OS X が実行されるさまざまなアーキテクチャで使用される呼び出し規約や、バイナリ形式とローダーがどのように機能するかが記載されているためです。特に IA-32 (x86-32) の呼び出し規則は、慣れ親しんだものとは少し異なる場合があります。
もう 1 つ覚えておくべきことは、Mac OS X のシステム コール インターフェイスは、DOS/Windows、Linux、またはその他の BSD フレーバーで慣れ親しんだものとは異なるということです。システム コールは、Mac OS X では安定した API とは見なされません。代わりに、常に libSystem を使用します。これにより、OS のあるリリースから次のリリースに移植可能なコードを作成できるようになります。
最後に、Mac OS X は、32 ビット Core Single からハイエンドのクアッドコア Xeon まで、非常に幅広いハードウェアで実行されることに注意してください。アセンブリでコーディングすると、思ったほど最適化されない可能性があります。あるマシンで最適なことが、別のマシンでは悲観的である可能性があります。Apple は定期的にコンパイラを測定し、「-Os」最適化フラグを使用してその出力を調整して、そのライン全体で適切なものにします。手動で調整された CPU 固有の実装で高いパフォーマンスを得るために使用できる広範なベクトル/マトリックス処理ライブラリがあります。 .
楽しみのためにアセンブリに行くのは素晴らしいことです。最近では、スピードのためにアセンブリに行くことは、気弱な人向けではありません。
前に述べたように、syscall は使用しないでください。ただし、標準の C ライブラリ呼び出しを使用できますが、Apple のIA32 関数呼び出し ABIに従って、スタックを 16 バイトに揃える必要があることに注意してください。
スタックを調整しないと__dyld_misaligned_stack_error
、ライブラリまたはフレームワークのいずれかを呼び出すと、プログラムがクラッシュします。
次のスニペットがアセンブルされ、私のシステムで実行されます。
; File: hello.asm
; Build: nasm -f macho hello.asm && gcc -o hello hello.o
SECTION .rodata
hello.msg db 'Hello, World!',0x0a,0x00
SECTION .text
extern _printf ; could also use _puts...
GLOBAL _main
; aligns esp to 16 bytes in preparation for calling a C library function
; arg is number of bytes to pad for function arguments, this should be a multiple of 16
; unless you are using push/pop to load args
%macro clib_prolog 1
mov ebx, esp ; remember current esp
and esp, 0xFFFFFFF0 ; align to next 16 byte boundary (could be zero offset!)
sub esp, 12 ; skip ahead 12 so we can store original esp
push ebx ; store esp (16 bytes aligned again)
sub esp, %1 ; pad for arguments (make conditional?)
%endmacro
; arg must match most recent call to clib_prolog
%macro clib_epilog 1
add esp, %1 ; remove arg padding
pop ebx ; get original esp
mov esp, ebx ; restore
%endmacro
_main:
; set up stack frame
push ebp
mov ebp, esp
push ebx
clib_prolog 16
mov dword [esp], hello.msg
call _printf
; can make more clib calls here...
clib_epilog 16
; tear down stack frame
pop ebx
mov esp, ebp
pop ebp
mov eax, 0 ; set return code
ret
最近、Mac OS X で Intel x86 をコンパイルする方法を学びたいと思っていました。
-o hello.tmp - outfile
-f macho - specify format
Linux - elf or elf64
Mac OSX - macho
-arch i386 - specify architecture (32 bit assembly)
-macosx_version_min 10.6 (Mac OSX - complains about default specification)
-no_pie (Mac OSX - removes ld warning)
-e main - specify main symbol name (Mac OSX - default is start)
-o hello.o - outfile
./hello.o - execution
nasm -o hello.tmp -f macho hello.s && ld -arch i386 -macosx_version_min 10.6 -no_pie -e _main -o hello.o hello.tmp && ./hello.o
これが役立つかどうか教えてください!
私はここのブログでそれを行う方法を書きました:
http://blog.burrowsapps.com/2013/07/how-to-compile-helloworld-in-intel-x86.html
より詳細な説明については、こちらの Github で説明しました。
ステップバイステップの x86 Mac 固有の紹介については、http://peter.michaux.ca/articles/assembly-hello-world-for-os-xを参照してください。私が試した他のリンクには、Mac 以外の落とし穴がいくつかあります。
また、Intel Mac では、汎用の x86 asm を使用できますか? または変更された命令セットがありますか?Intel Mac の組み立て後の情報は役に立ちます。
これは同じ命令セットです。同じチップです。
使用できる機能は、プロセッサによって異なります。Apple は、他社と同じ Intel 製品を使用しています。そうです、一般的な x86 で問題ないはずです (PPC を使用していないと仮定して :D)。
ツールに関する限り、最善の策はアセンブリを「理解する」優れたテキスト エディタだと思います。
Mac でアセンブラーを作成/実行/コンパイルするための IDE を探すことは忘れてください。ただし、mac は UNIX であることを忘れないでください。http://asm.sourceforge.net/articles/linasm.htmlを参照してください。Linux で GCC を介してアセンブラーを実行するためのまともなガイド (短いですが)。これを真似できます。Mac は Intel チップを使用しているため、Intel の構文を確認する必要があります。