====== level9 ====== imul - integer multiplication. 0x080485c5 <+85>: mov -0x10(%ebp),%eax eax = ebp_10; 0x080485c8 <+88>: imul -0x10(%ebp),%eax imul is a multiplication instruction. eax = eax * ebp_10; So, it is ebp_10 * ebp*10 0x080485cc <+92>: cmp -0x8(%ebp),%eax 0x080485cf <+95>: jle 0x80485f0 if(ebp_10 * ebp_10 > ebp_8)... idiv - integer division operation. Use a special instruction (cltd) right before idivl (idiv - long, 32bit), and 'cltd' (or CDQ) is for asserting using %edx:%eax as a 64bit integer, %edx for the top 32 bit (bit 63 - 32), and %eax for the lower 32 bit (bit 31 - 0). 0x080485f0 <+128>: mov -0x8(%ebp),%eax eax = ebp_8 0x080485f3 <+131>: cltd edx = 0, eax = ebp_8, as a 64bit integer of %edx:%eax = ebp_8 0x080485f4 <+132>: idivl -0x10(%ebp) divide that value (edx:eax) using ebp_10. Quotient will be stored in eax, and remainder will be stored in edx. 0x080485f7 <+135>: cmp $0x0,%edx Check if the remainder is 0. So, if the assembly uses 'eax' for the result of idivl, you can interpret that as '/' operation, e.g., ebp_8 / ebp_10. But in this case, the assembly code uses 'edx' for the result of idivl, so you should interpret this as '%' operation, taking the remainder of division, e.g., ebp_8 % ebp_10.