これを学習する簡単な方法の 1 つは、C コンパイラーにアセンブラー・テンプレートを生成させることです。C で同等のものから始めます。
main()
{
write(1, "hi!\n", 4);
return 0;
}
次に、コンパイラにアセンブリ コードを作成させます。
cc -S hello.c
結果のアセンブリ コードは、アセンブル (および C ライブラリとのリンク) の準備ができているはずです。
.file "hello.c"
.section .rodata
.LC0:
.string "hi!\n"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB2:
pushq %rbp
.LCFI0:
movq %rsp, %rbp
.LCFI1:
movl $4, %edx
movl $.LC0, %esi
movl $1, %edi
movl $0, %eax
call write
movl $0, %eax
leave
ret
.LFE2:
.size main, .-main
.section .eh_frame,"a",@progbits
.Lframe1:
.long .LECIE1-.LSCIE1
.LSCIE1:
.long 0x0
.byte 0x1
.string "zR"
.uleb128 0x1
.sleb128 -8
.byte 0x10
.uleb128 0x1
.byte 0x3
.byte 0xc
.uleb128 0x7
.uleb128 0x8
.byte 0x90
.uleb128 0x1
.align 8
.LECIE1:
.LSFDE1:
.long .LEFDE1-.LASFDE1
.LASFDE1:
.long .LASFDE1-.Lframe1
.long .LFB2
.long .LFE2-.LFB2
.uleb128 0x0
.byte 0x4
.long .LCFI0-.LFB2
.byte 0xe
.uleb128 0x10
.byte 0x86
.uleb128 0x2
.byte 0x4
.long .LCFI1-.LCFI0
.byte 0xd
.uleb128 0x6
.align 8
.LEFDE1:
.ident "GCC: (GNU) 4.2.1 20070831 patched [FreeBSD]"
.section .note.GNU-stack,"",@progbits
本当に必要な .size ディレクティブを超えた後続のものがどれだけあるかは (私には) すぐにはわかりませんが、これで問題は解決するはずです。