Pergunta

C version:

int arith(int x, int y, int z)
{
    int t1 = x+y;
    int t2 = z*48;
    int t3 = t1 & 0xFFFF;
    int t4 = t2 * t3;
    return t4;
}

ATT Assembly version of the same program:

x at %ebp+8, y at %ebp+12, z at %ebp+16

movl   16(ebp), %eax    
leal   (%eax, %eax, 2), %eax   
sall   $4, %eax      // t2 = z* 48... This is where I get confused
movl   12(%ebp), %edx   
addl   8(%ebp), %edx
andl   $65535, %edx
imull  %edx, %eax

I understand everything it is doing at all points of the program besides the shift left.

I assume it is going to shift left 4 times. Why is that?

Thank you!

Edit: I also understand that the part I'm confused on is equivalent to the z*48 part of the C version.

What I'm not understanding is how does shifting left 4 times equate to z*48.

Foi útil?

Solução

You missed the leal (%eax, %eax, 2), %eax line. Applying some maths the assembly code reads:

a := x
a := a + 2*a    // a = 3*x
a := a * 2^4    // a = x * 3*16
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top