Figures

Figure 1 inlining.cpp
  extern "C" int Goober( int x, float y );
int main(int argc, char * argv[] )
{
    float f = 2.3;
    int x = argc;
    x = Goober( x, f );
    return x+1;    
}

Figure 2 inlining2.cpp
  extern "C" int Goober( int x, float y )
{
    if ( x > 1 )
        return x * y;
    return
        x;
}

Figure 3 Inlining_wiithout.lst
  _main:
    mov         eax,dword ptr [esp+4]    ; Load 'x' (EAX) with argc
    push        40133333h                ; Push 'f' (2.3)
    push        eax                      ; push 'x'
    call        _Goober
    add         esp,8                    ; Clean up stack
    inc         eax                      ; Add 1 to function ret value
    ret
_Goober:
    mov         eax,dword ptr [esp+4]
    cmp         eax,1
    jle         0040102D
    fild        dword ptr [esp+4]
    fmul        dword ptr [esp+8]
    jmp         __ftol
    ret

Figure 4 Inlining.lst
  _main:
    // int x = argc;    ('x' stored in EAX register here)
    mov         eax,dword ptr [esp+4]
    // if ( x > 1 )
    cmp         eax,1
    jle         00401018
    // return x*y;
    fild        dword ptr [esp+4]
    fmul        dword ptr [__real@40133333]
    call        __ftol2
    // return x+1;
    inc         eax
    ret

Figure 5 ccc.cpp
  extern "C" __declspec(noinline)
int foo(int i, int *j, int *k, int l)
{
    *j = *k;
    *k = i + l;
    return i + *j + *k + l;
}
int main( int argc, char * argv[] )
{
    int i,j, k, l;
    l = i = argc;
    int x = foo( i, &j, &k, l );
    return x * argc;
}

Figure 6 ccc.lst
  _foo:
    // k = EAX
    // j = ESI
    // l = EDI
    // i = EDX
    //     *j = *k;
    mov         ecx,dword ptr [eax]
    mov         dword ptr [esi],ecx
    //    *k = i + l;
    lea         ecx,[edi+edx]
    mov         dword ptr [eax],ecx
    //    return i + *j + *k + l;
    mov         eax,dword ptr [esi]    // *j
    add         eax,ecx                // *k sub-expression (from 
                                       // previous line)
    add         eax,edi                // l
    add         eax,edx                // i
    ret
_main:
    push        ecx                   // preserve ECX
    mov         edx,dword ptr [esp+8] // i =argc
    push        esi                   // preserve ESI
    push        edi                   // preserve EDI
    lea         eax,[esp+10h]         // &k
    lea         esi,[esp+8]           // &j
    mov         edi,edx               // l = i
    call        _foo
    imul        eax,edx               // multiply return value by argc
    pop         edi                   // restore previously preserved 
                                      // regs
    pop         esi
    pop         ecx
    ret

Figure 7 tls.cpp
  __declspec(thread) int i = 1;
int main()
{
    i = 4;
    return i;
}

Figure 8 Tls_without.lst
  _main:
    mov         eax,dword ptr [__tls_index]
    mov         ecx,dword ptr fs:[2Ch]
    mov         ecx,dword ptr [ecx+eax*4]
    push        4
    pop         eax
    mov         dword ptr [ecx+4],eax
    ret

Figure 9 Tls.lst
  _main:
    mov         eax,dword ptr fs:[0000002Ch]
    mov         ecx,dword ptr [eax]
    mov         eax,4
    mov         dword ptr [ecx+8],eax
    ret