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。
答案 0 :(得分:1)
您错过了leal (%eax, %eax, 2), %eax
行。应用一些数学,汇编代码为:
a := x a := a + 2*a // a = 3*x a := a * 2^4 // a = x * 3*16