(a)
int foo(int x, int y) { while (b(x,y)) if (c(x,y)) return 1; return 0; }(b)
004011F0 @foo@8: 004011F0 56 push esi 004011F1 57 push edi 004011F2 8BF2 mov esi,edx 004011F4 8BF9 mov edi,ecx 004011F6 E869FEFFFF call fn_00401064 ; _b 004011FB 85C0 test eax,eax 004011FD 741A jz loc_00401219 004011FF loc_004011FF: 004011FF 8BD6 mov edx,esi 00401201 8BCF mov ecx,edi 00401203 E857FEFFFF call fn_0040105F ; _c 00401208 85C0 test eax,eax 0040120A 7512 jnz loc_0040121E 0040120C 8BD6 mov edx,esi 0040120E 8BCF mov ecx,edi 00401210 E84FFEFFFF call fn_00401064 ; _b 00401215 85C0 test eax,eax 00401217 75E6 jnz loc_004011FF 00401219 loc_00401219: 00401219 5F pop edi 0040121A 33C0 xor eax,eax 0040121C 5E pop esi 0040121D C3 ret 0040121E loc_0040121E: 0040121E 5F pop edi 0040121F B801000000 mov eax,1 00401224 5E pop esi 00401225 C3 ret(c)
call,test,jz,loc,call,test,jnz,call,test,jnz,loc,xor,ret,loc,ret(d)
EEC1E2A53DA3D4FCF3E57850F302412D(e)
int bar(int x, int y, int z) { while (g(x,y,666)) if (h(1234,x,y)) return 1; return 0; }
Figure 1: (a) A small C function; (b) disassembly of a compiled version; (c) its opstring; (d) its function digest; (e) and a slightly different C function that yields the same opstring and function digest.