All examples below use signed integers.

Multiplication with a power of 2

We all know shl is normally used to multiply a number with a power of 2. This sequence uses lea instruction instead.

The ASM code

 mov   eax, DWORD PTR _a$[esp+52]  ; eax takes value of a lea   ecx, DWORD PTR [eax*8]      ; ecx takes value of a * 8 
</p>

The C code

 a * 8; 
</p>
</p>

Multiplication with a constant

The compiler will try to fit the multiplication with lea and add instructions.

The ASM code

 mov   eax, DWORD PTR _a$[esp+28]  ; eax takes value of a lea   ecx, DWORD PTR [eax+eax*2]  ; ecx = eax * 3 add   ecx, ecx                    ; ecx = ecx * 2 (or, eax * 6) 
</p>

The C code

 a * 6; 
</p>
</p>

Taking quotient of a division by a power of 2

This sequence is interesting because there is a conditional jump jns instruction.

The ASM code

 mov   edx, DWORD PTR _a$[esp+36] and   edx, -2147483641                        ; 80000007H jns   SHORT $LN3@main dec   edx or    edx, -8                                 ; fffffff8H inc   edx $LN3@main: ; here edx takes the value of the quotient 
</p>

The C code

 a % 8; 
</p>
</p>

Taking remainder of a division by a power of 2

There is only one shift instruction sar in this sequence.

The ASM code

 mov   eax, DWORD PTR _a$[esp+44] cdq and   edx, 7 add   eax, edx sar   eax, 3 ; here eax takes the value of the remainder 
</p>

The C code

 a / 8; 
</p>
</p>

Taking remainder of a division by a constant

Notice that 2aaaaaabH is 2^32 / 6.

The ASM code

 mov   ecx, DWORD PTR _c$[esp+20] 
    mov   eax, 715827883                          ; 2aaaaaabH imul  ecx mov   eax, edx shr   eax, 31                                 ; 0000001fH add   eax, edx 
</p>

The C code

 c / 6 
</p>
</p>

Taking quotient of a division by a constant

First, take the remainder. Then substract the original value with the multiplication of remainder and constant.

The ASM code

 mov   ecx, DWORD PTR _c$[esp+12] mov   eax, 715827883                          ; 2aaaaaabH imul  ecx mov   eax, edx shr   eax, 31                                 ; 0000001fH add   eax, edx lea   edx, DWORD PTR [eax+eax*2] add   edx, edx sub   ecx, edx 
</p>

The C code

 c % 6 
</p>
</p>