Personalmente ti posso segnalare "Programming from the ground up", lo trovi free su savannah, cerca pure con Google.
In aggiunta dovresti scaricarti i manuali AMD (io ho scaricato quelli Intel ma immagino che da qualche parte sul sito di AMD ci siano anche per AMD). ...buona lettura...
Queste istruzioni non modificano lo stack pointer:
8 0x0804835d <main+17>: movl $0x3,0x8(%esp)
9 0x08048365 <main+25>: movl $0x2,0x4(%esp)
10 0x0804836d <main+33>: movl $0x1,(%esp)
ma spostano dei valori 1,2 e 3 (nota l'ordine in cui vengono messi nello stack pointer) nelle posizioni +8, +4 e 0 (lo stack parte dall'alto e si muove verso il basso) partendo da dove punta %esp (di 4 byte alla volta dato che sei su una architettura a 32 bit).
ret
3
2
1 <- %esp
il puntamento di %esp e' stato spostato prima con questa istruzione:
sub $0xc,%esp in modo da riservarti spazio
cioe' di 12 posizioni, 3 per i valori e un intero per l'indirizzo di ritorno (se non erro dato che hai messo void non c'e' valore che restituisce la funzione).
quello che succede dopo sono le solite cose...ripristino del base pointer e dello stack pointer.
Non so esattamente perche' esegue le prime istruzioni ma devi sapere che in un programma in C, ci sono alcune funzioni che sono nascoste e che vengono chiamate quando si esegue un programma. Queste funzioni vengono aggiunte dal gcc e in qualche modo si possono eliminare (ci sono degli articoli in rete). Sono le famose funzioni di quando metti le keyword in C di __init e __fin (qualcosa del genere, fai riferimento al gapil o usa objdump/readelf). Per cui il ret che ti trovi alla fine del main, non e' affatto (e spero di non sbagliarmi) l'istruzioni di exit dal programma che avviene con un int 0x80 (dopo aver impostato alcuni registry). Quindi un programma non inizia dal main una volta compilato.
Questo secondo me spiegherebbe parzialmente perche' salva e ripristina 0x4(%esp) in %ecx:
1 0x0804834c <main+0>: lea 0x4(%esp),%ecx
...
lea -0x4(%ecx),%esp
per quanto riguarda questo and:
2 0x08048350 <main+4>: and $0xfffffff0,%esp
no idea

potrebbe essere una specie di allineamento? E poi il tutto viene ripristinato come prima.
Sembrerebbe funzionare. Una specie di finestra nello stack.
Spero di non aver detto troppe idiozie.
ciao