http://qiita.com/items/b7ed1c9feef1b570a6b9 の続き。x86-64では引数を渡す際に,可能な限りレジスタを用いる。
hello2.s
.text
.globl _main
msg: .asciz "hello, world."
_main:
# スタックポインタを16バイト境界に合わせる (ABIの規約)
subq $8, %rsp
# 第1引数 (%rdi) に文字列のポインタを指定
leaq msg(%rip), %rdi
# ベクタレジスタ数 (%rax) を0に設定
movq $0, %rax
# putsを呼ぶ
callq _puts
# スタックポインタを_mainの呼び出し前の状態に戻す
addq $8, %rsp
# 戻り値として0を返す
movq $0, %rax
ret
実行方法:
$ gcc -o hello2 hello2.s
$ ./hello2
hello, world.
gcc を使わずに,ld コマンドだけで libc とリンクする方法は,よく分からない。
参考: x86-64 (amd64) の ABI (Application Binary Interface)
http://www.x86-64.org/documentation.html
追記 (8/5)
正しいやり方か確信がもてないが,以下の方法で ld コマンドでアセンブルできる。
$ as -o hello2.o hello2.s
$ ld -o hello2 -macosx_version_min 10.7 -lSystem /usr/lib/crt1.o hello2.o
$ ./hello2
hello, world.