了解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大会版同样的程序:

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。

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

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