Xcodeでx86アセンブリを書く


Xcode 6です。

ファイル作成

新規プロジェクト作成でCommand Line Toolを選びます。

言語はCを選ぶ。

main.cは消しちゃいます。

新規ファイル作成から、

Assembly Fileを選びます。

こういうコードを書きます。

.global _main

.text
_main:
    movl    $1, %eax
    subl    $12, %esp
    int     $0x80

たぶんgasのAT&Tシンタックスというやつだと思います。(自信ない)

Intelシンタックス

Intelシンタックスを使うには .intel_syntax noprefix をつけます。

.intel_syntax noprefix

.global _main

.text
_main:
    mov     eax, 1
    sub     esp, 12
    int     0x80

ビルド

このままだと64bitでコンパイルされると思うので、32bitでコンパイルされるようにします。

ビルドしてできるファイルを file コマンドで見てみると、x86_64からi386に変わっているのがわかります。

% file ams-test: Mach-O 64-bit executable x86_64
% file ams-test: Mach-O executable i386

デバッグ

ブレークポイントも置けます。

デバッガーのパネルではAll Variables, Registers, Globals and Statisticsを選択しておくとレジスタの値が見られます。

それから、Debug→Debug Workflow→Always Show Disassemblyにチェックを入れておくと、

ブレークポイントで止まるときにこういうのが出てきます。

ここはソースコードをintelシンタックスで書いたとしてもAT&Tシンタックスで表示されます。

また、そのすぐ下のView Memoryを選ぶとこういう画面が出てきます。

Addressというところに例えばespレジスタ周辺の値を入れると、スタックのメモリレイアウトが見られます。