_start XXXXXXX <-- SP pushl %ebp XXXXXXX [oldBP:4] <-- SP movl %esp,%ebp XXXXXXX [oldBP:4] <-- SP <-- EBP addl $lastLocal,%esp XXXXXXX [oldBP:4] <-- EBP [result:2] [totalWc:2] <-- SP call readword XXXXXXX [oldBP:4] <-- EBP <-- oldBP(%ebp) [result:2] <-- result(%ebp) [totalWc:2] <-- totalWc(%ebp) [retaddr:4] <-- SP struct Rec { int x, y, z; float a, b, c; char buffer[20]; }; struct Rec f(void) { struct Rec temp; ... return temp; } void caller(void) { struct Rec temp; temp = f(); } aosdifjoasd <-- SP # assume Rec_size is the size of struct Rec subl $Rec_size,%esp pushl param3 pushl param2 pushl param1 aosdifjoasd [...:Rec_size] [param3:..] [param2:..] [param1:..] <-- SP call f aosdifjoasd [...:Rec_size] [param3:..] [param2:..] [param1:..] [retaddr:4] <-- SP f: pushl %ebp movl %esp,%ebp addl $lastLocal,%esp aosdifjoasd [...:Rec_size] [param3:..] [param2:..] [param1:..] [retaddr:4] [oldBP:4] <-- EBP [local1:..] [local2:..] [local3:..] <-- SP ret aosdifjoasd [...:Rec_size] [param3:..] [param2:..] [param1:..] <-- SP addl $..,%esp aosdifjoasd [...:Rec_size] <-- SP