了解ATT汇编语言

时间:2013-02-16 22:26:21

标签: c assembly x86 att

C版:

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版本:

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

除了左转之外,我理解它在程序的所有方面所做的一切。

我认为它会向左移4次。那是为什么?

谢谢!

编辑:我也理解我所困惑的部分相当于C版的z * 48部分。

我不理解的是左移4次等于z * 48。

1 个答案:

答案 0 :(得分:1)

您错过了leal (%eax, %eax, 2), %eax行。应用一些数学,汇编代码为:

a := x
a := a + 2*a    // a = 3*x
a := a * 2^4    // a = x * 3*16