int x; char c; x = x + c; x = x + (int)c; x: .int 0 c: .fill 1 junk: .int 23432 # wrong method 1 movl c,%eax addl %eax,x # wrong method 2 movb c,%al addl %eax,x # wrong method 3 movb c,%al addb %al,x # obvious wrong method 4 movl c,%eax addb %al,x # right method 1 movl $0,%eax movb c,%al addl %eax,x # right method (scenic route) 2 movb c,%al addb %al,x adcb $0,x+1 adcb $0,x+2 adcb $0,x+3 void sub1(int x, int y) { int z; ... } static allocation for parameters 2000 subroutines 30 bytes of parameters for each subroutine 2000*30=60,000 bytes for parameters on-demand allocation for parameters 2000 subroutines 30 bytes of parameters for each subroutine max 10 levels of embeded subroutine calls 10*30=300 bytes for parameters