00025846 <zz0016d832>: 25846: 53 push %ebx ;allocate 2 longs on the stack 25847: 83 ec 08 sub $0x8,%esp 2584a: 8b 5c 24 10 mov 0x10(%esp),%ebx ;magic number 0xe0 = 224 on the stack 2584e: c7 04 24 e0 00 00 00 movl $0xe0,(%esp) ;get the current position 25855: e8 fc ff ff ff call 25856 <zz0016d832+0x10> ;put eax onto this struct. What is eax? 2585a: 89 83 ec 5b 00 00 mov %eax,0x5bec(%ebx) ;if (eax != 0) 25860: 85 c0 test %eax,%eax ;jump to l1 25862: 75 14 jne 25878 <zz0016d832+0x32> ;else ;eax = piece on the stack 25864: 8b 44 24 14 mov 0x14(%esp),%eax ;*eax = 2 25868: c7 00 02 00 00 00 movl $0x2,(%eax) ;eax = 0 2586e: b8 00 00 00 00 mov $0x0,%eax ;jump to l2 25873: e9 90 00 00 00 jmp 25908 <zz0016d832+0xc2> ;end if l1: ;put 0x80 = 128 onto the struct pointed to 25878: c7 83 7c 73 00 00 80 movl $0x80,0x737c(%ebx) 2587f: 00 00 00 ;put 0x80 = 128 onto the stack 25882: c7 04 24 80 00 00 00 movl $0x80,(%esp) ;get the current position 25889: e8 fc ff ff ff call 2588a <zz0016d832+0x44> ;put eax onto the struct pointed to 2588e: 89 83 78 73 00 00 mov %eax,0x7378(%ebx) ;if (eax != 0) 25894: 85 c0 test %eax,%eax ;jump to l3 25896: 75 11 jne 258a9 <zz0016d832+0x63> ;else ;eax = piece on the stack 25898: 8b 44 24 14 mov 0x14(%esp),%eax ;*eax = 2 2589c: c7 00 02 00 00 00 movl $0x2,(%eax) ;eax = 0 258a2: b8 00 00 00 00 mov $0x0,%eax ;jump to l2 258a7: eb 5f jmp 25908 <zz0016d832+0xc2> ;end if l3: ;put 0x40 = 64 onto the struct pointed to (see similar call @l1) 258a9: c7 83 7c 73 00 00 40 movl $0x40,0x737c(%ebx) 258b0: 00 00 00 ;put 0x26d49 onto the struct pointed to 258b3: c7 83 a8 58 00 00 49 movl $0x26d49,0x58a8(%ebx) 258ba: 6d 02 00 ;put 0x26950 onto the struct pointed to 258bd: c7 83 ac 58 00 00 50 movl $0x26950,0x58ac(%ebx) 258c4: 69 02 00 ;put 0x25350 onto the struct pointed to 258c7: c7 83 b0 58 00 00 50 movl $0x25350,0x58b0(%ebx) 258ce: 53 02 00 ;put 0x26a28 onto the struct pointed to 258d1: c7 83 b4 58 00 00 28 movl $0x26a28,0x58b4(%ebx) 258d8: 6a 02 00 ;put 0x2613d onto the struct pointed to 258db: c7 83 b8 58 00 00 3d movl $0x2613d,0x58b8(%ebx) 258e2: 61 02 00 ;put 0x2590d onto the struct pointed to 258e5: c7 83 bc 58 00 00 0d movl $0x2590d,0x58bc(%ebx) 258ec: 59 02 00 ;put 0x2562b onto the struct pointed to 258ef: c7 83 c0 58 00 00 2b movl $0x2562b,0x58c0(%ebx) 258f6: 56 02 00 ;put 0 onto the struct pointed to 258f9: c7 83 c4 58 00 00 00 movl $0x0,0x58c4(%ebx) 25900: 00 00 00 ;eax = 1 25903: b8 01 00 00 00 mov $0x1,%eax l2: ;dellocate 2 longs on the stack 25908: 83 c4 08 add $0x8,%esp ;take the stored ebx off the stack 2590b: 5b pop %ebx ;return; 2590c: c3 ret ;Note: all code paths end here, so that's the end of the function. ;The purpose of the above function is pretty interesting ;A new function starts here it's pretty obvious by the pushes. ;function initialization 2590d: 55 push %ebp 2590e: 57 push %edi 2590f: 56 push %esi 25910: 53 push %ebx ;allocate 1036 bytes on the stack, owch 25911: 81 ec 0c 04 00 00 sub $0x40c,%esp ;eax = long in a struct on the stack 25917: 8b 84 24 20 04 00 00 mov 0x420(%esp),%eax ;put eax onto local variable list 2591e: 89 44 24 28 mov %eax,0x28(%esp) ;edx = extend word to long on struct at eax ;http://en.wikibooks.org/wiki/X86_Assembly/Data_Transfer#Move_and_Extend 25922: 0f b7 90 d4 01 00 00 movzwl 0x1d4(%eax),%edx ;eax = edx 25929: 89 d0 mov %edx,%eax ;eax &= 0xf0 2592b: 25 f0 00 00 00 and $0xf0,%eax ;eax -= 0x30 25930: 83 e8 30 sub $0x30,%eax ;if ((unsigned int)eax > 0x3f) ;http://en.wikibooks.org/wiki/X86_Assembly/Control_Flow#Jump_if_Greater 25933: 83 f8 3f cmp $0x3f,%eax ;jump to l4 25936: 77 24 ja 2595c <zz0016d832+0x116> ;if (dx == 0x35) 25938: 66 83 fa 35 cmp $0x35,%dx ;jump to l5 2593c: 74 14 je 25952 <zz0016d832+0x10c> ;if (dx == 0x45) 2593e: 66 83 fa 45 cmp $0x45,%dx ;jump to l5 25942: 74 0e je 25952 <zz0016d832+0x10c> ;if (dx == 0x46) 25944: 66 83 fa 46 cmp $0x46,%dx ;jump to l5 25948: 74 08 je 25952 <zz0016d832+0x10c> ;if (dx != 0x36) 2594a: 66 83 fa 36 cmp $0x36,%dx ;nop? 2594e: 66 90 xchg %ax,%ax ;jump to l4 25950: 75 0a jne 2595c <zz0016d832+0x116> l5: ;put 2 onto the stack (local var) 25952: c7 44 24 2c 02 00 00 movl $0x2,0x2c(%esp) 25959: 00 ;jump to l6 2595a: eb 08 jmp 25964 <zz0016d832+0x11e> l4: ;put 1 on the stack (local var) see same var value @l5 2595c: c7 44 24 2c 01 00 00 movl $0x1,0x2c(%esp) 25963: 00 l6: ;edx = local var on the stack 25964: 8b 94 24 2c 04 00 00 mov 0x42c(%esp),%edx ;eax = *edx 2596b: 8b 02 mov (%edx),%eax ;eax &= 0x701f0 2596d: 25 f0 01 07 00 and $0x701f0,%eax ;if (eax == 0xd0) 25972: 3d d0 00 00 00 cmp $0xd0,%eax ;jump to l7 25977: 74 73 je 259ec <zz0016d832+0x1a6> ;if ((unsigned int)eax > 0xd0) 25979: 3d d0 00 00 00 cmp $0xd0,%eax ;jump to l8 2597e: 77 18 ja 25998 <zz0016d832+0x152> ;if (eax == 0xa0) 25980: 3d a0 00 00 00 cmp $0xa0,%eax ;jump to l9 25985: 74 4a je 259d1 <zz0016d832+0x18b> ;if (eax != 0xc0) 25987: 3d c0 00 00 00 cmp $0xc0,%eax ;nop? 2598c: 8d 74 26 00 lea 0x0(%esi),%esi ;jump to l10 25990: 0f 85 47 07 00 00 jne 260dd <zz0016d832+0x897> ;jump to l7 25996: eb 54 jmp 259ec <zz0016d832+0x1a6> l8: ;if (eax == 0x150) 25998: 3d 50 01 00 00 cmp $0x150,%eax ;nop? 2599d: 8d 76 00 lea 0x0(%esi),%esi ;jump to l11 259a0: 74 14 je 259b6 <zz0016d832+0x170> ;if (eax == 0x800) 259a2: 3d 00 08 00 00 cmp $0x800,%eax ;jump to l11 259a7: 74 0d je 259b6 <zz0016d832+0x170> ;if (eax != 0x140) 259a9: 3d 40 01 00 00 cmp $0x140,%eax ;nop? 259ae: 66 90 xchg %ax,%ax ;jump to l10 259b0: 0f 85 27 07 00 00 jne 260dd <zz0016d832+0x897> l11: 259b6: 8b 4c 24 28 mov 0x28(%esp),%ecx 259ba: 81 c1 d4 4b 00 00 add $0x4bd4,%ecx 259c0: 89 4c 24 30 mov %ecx,0x30(%esp) 259c4: 8b 44 24 28 mov 0x28(%esp),%eax 259c8: 0f b7 90 d8 3e 00 00 movzwl 0x3ed8(%eax),%edx 259cf: eb 33 jmp 25a04 <zz0016d832+0x1be> l9: 259d1: 8b 54 24 28 mov 0x28(%esp),%edx 259d5: 81 c2 e0 4b 00 00 add $0x4be0,%edx 259db: 89 54 24 30 mov %edx,0x30(%esp) 259df: 8b 4c 24 28 mov 0x28(%esp),%ecx 259e3: 0f b7 91 da 3e 00 00 movzwl 0x3eda(%ecx),%edx 259ea: eb 18 jmp 25a04 <zz0016d832+0x1be> l7: