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 位于 %ebp+8,y 位于 %ebp+12,z 位于 %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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)