title: What's going on in Apple LLVM-gcc x86 assembly?
body: <p>I'm interested in learning more x86/x86_64 assembly. Alas, I am on a Mac. No problem, right?</p>
  
  <pre><code>$ gcc --version
  i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 
  5658) (LLVM build 2336.11.00)
  Copyright (C) 2007 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO 
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  </code></pre>
  
  <p>I wrote a simple "Hello World" in C to get a base-line on what sort of code I'll have to write. I did a little x86 back in college, and have looked up numerous tutorials, but none of them look like the freakish output I'm seeing here:</p>
  
  <pre><code>.section    __TEXT,__text,regular,pure_instructions
  .globl  _main
  .align  4, 0x90
  _main:
  Leh_func_begin1:
  pushq   %rbp
  Ltmp0:
  movq    %rsp, %rbp
  Ltmp1:
  subq    $32, %rsp
  Ltmp2:
  movl    %edi, %eax
  movl    %eax, -4(%rbp)
  movq    %rsi, -16(%rbp)
  leaq    L_.str(%rip), %rax
  movq    %rax, %rdi
  callq   _puts
  movl    $0, -24(%rbp)
  movl    -24(%rbp), %eax
  movl    %eax, -20(%rbp)
  movl    -20(%rbp), %eax
  addq    $32, %rsp
  popq    %rbp
  ret
  Leh_func_end1:
  
  .section    __TEXT,__cstring,cstring_literals
  L_.str:
  .asciz   "Hello, World!"
  
  .section    __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
  EH_frame0:
  Lsection_eh_frame:
  Leh_frame_common:
  Lset0 = Leh_frame_common_end-Leh_frame_common_begin
  .long   Lset0
  Leh_frame_common_begin:
  .long   0
  .byte   1
  .asciz   "zR"
  .byte   1
  .byte   120
  .byte   16
  .byte   1
  .byte   16
  .byte   12
  .byte   7
  .byte   8
  .byte   144
  .byte   1
  .align  3
  Leh_frame_common_end:
  .globl  _main.eh
  _main.eh:
  Lset1 = Leh_frame_end1-Leh_frame_begin1
  .long   Lset1
  Leh_frame_begin1:
  Lset2 = Leh_frame_begin1-Leh_frame_common
  .long   Lset2
  Ltmp3:
  .quad   Leh_func_begin1-Ltmp3
  Lset3 = Leh_func_end1-Leh_func_begin1
  .quad   Lset3
  .byte   0
  .byte   4
  Lset4 = Ltmp0-Leh_func_begin1
  .long   Lset4
  .byte   14
  .byte   16
  .byte   134
  .byte   2
  .byte   4
  Lset5 = Ltmp1-Ltmp0
  .long   Lset5
  .byte   13
  .byte   6
  .align  3
  Leh_frame_end1:
  
  
  .subsections_via_symbols
  </code></pre>
  
  <p>Now...maybe things have changed a bit, but this isn't exactly friendly, even for assembly code. I'm having a hard time wrapping my head around this...Would someone help break down what is going on in this code and why it is all needed? </p>
  
  <p>Many, many thanks in advance.</p>