2

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にどのように等しいかということです。

4

1 に答える 1

1

あなたはラインを逃したleal (%eax, %eax, 2), %eax。いくつかの数学を適用すると、アセンブリコードは次のようになります。

a:= x
a:= a + 2 * a // a = 3 * x
a:= a * 2 ^ 4 // a = x * 3 * 16
于 2013-02-16T22:31:06.107 に答える