質問

Mac でアセンブリを書くための良いツール (IDE を探しています) を知っている人はいますか。Xcodeは私にとって少し面倒です。

また、Intel Mac では汎用の x86 asm を使用できますか?それとも変更された命令セットがあるのでしょうか?ポストインテルに関するあらゆる情報。

また:Windows では、OS によって作成されたエミュレートされた環境で asm を実行して、コードに独自の専用マシンで実行されていると認識させることができることはわかっています。OS X も同じものを提供しますか?

役に立ちましたか?

解決

Intel ベースの Mac を対象とする Xcode の任意のバージョンをインストールすると、アセンブリ コードを作成できるようになります。Xcode は一連のツールですが、IDE はその 1 つだけなので、使いたくない場合は使用する必要はありません。(とはいえ、不格好に感じる特定の点がある場合は、次のアドレスにバグを報告してください。 Appleのバグレポーター - すべてのバグはエンジニアリングに送られます。) さらに、Xcode をインストールすると、Netwide Assembler (NASM) と GNU Assembler (GAS) の両方がインストールされます。これにより、最も使いやすいアセンブリ構文を使用できるようになります。

こちらもご覧ください。 コンパイラおよびデバッグ ガイド, これらは、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 ビット コア シングルからハイエンド クアッドコア Xeon に至るまで、非常に幅広いハードウェアで動作することに留意してください。アセンブリでコーディングしても、思っているほど最適化されていない可能性があります。あるマシンでは最適であっても、別のマシンでは悲観的になる可能性があります。Apple は定期的にコンパイラを測定し、その製品ライン全体で適切な出力になるように「-Os」最適化フラグを使用して出力を調整しています。手動で調整された CPU 固有の実装で高いパフォーマンスを得るために使用できる広範なベクトル/行列処理ライブラリがあります。 。

楽しみのために集会に行くのは素晴らしいことです。最近、スピードを求めて集会に行くのは、気の弱い人には向いていません。

他のヒント

前に述べたように、syscall は使用しないでください。標準の C ライブラリ呼び出しを使用することもできますが、スタックは Apple の仕様に従って 16 バイトにアライメントされている必要があることに注意してください。 IA32 関数呼び出し ABI.

スタックを調整しないと、プログラムがクラッシュします。 __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

x86 Mac 固有のステップバイステップの優れた紹介については、「」を参照してください。 http://peter.michaux.ca/articles/assembly-hello-world-for-os-x. 。私が試した他のリンクには Mac 以外の落とし穴がいくつかあります。

最近、Mac OS X 上で Intel x86 をコンパイルする方法を学びたいと思いました。

ナスムの場合:

-o hello.tmp - outfile
-f macho - specify format
Linux - elf or elf64
Mac OSX - macho

ld の場合:

-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 で説明しています。

https://github.com/jaredsburrows/Assembly

Mac 上でアセンブリ コードを実行するのはわずか 3 ステップです。XCODE を使用して実行することもできますが、NASM コマンド ライン ツールを使用することをお勧めします。念のため、私はすでに Xcode をインストールしました。Xcode がインストールされている場合は、それが役に立ちます。

ただし、XCode なしでも実行できます。

フォローしてください:

  1. まず Homebrew を使用して NASM をインストールします brew install nasm
  2. このコマンドを使用して .asm ファイルを Obj ファイルに変換します nasm -f macho64 myFile.asm
  3. Obj Fileを実行してコマンドを使用して出力を確認します ld -macosx_version_min 10.7.0 -lSystem -o OutPutFile myFile.o && ./64

便宜上、myFile.asm という名前の単純なテキスト ファイルを以下に示します。

global start
section .text

start:
    mov     rax, 0x2000004 ; write
    mov     rdi, 1 ; stdout
    mov     rsi, msg
    mov     rdx, msg.len
    syscall

    mov     rax, 0x2000001 ; exit
    mov     rdi, 0
    syscall

section .data

msg:    db      "Assalam O Alaikum Dear", 10
.len:   equ     $ - msg

また、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 の構文を確認する必要があります。

Windows とは異なり、すべての Unix ベースのシステムでは、Windows とは異なり、宛先の前にソースが必要であることを忘れないでください。

Windows の場合:

mov $source 、 %destination

しかし、Mac ではその逆になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top